Skip to content

Commit 2a3151b

Browse files
authored
Merge pull request #56 from ye-luo-xi-tui/master
Add synchronized calibration
2 parents 5ff004e + 95e7936 commit 2a3151b

File tree

2 files changed

+65
-19
lines changed

2 files changed

+65
-19
lines changed

rm_common/include/rm_common/decision/calibration_queue.h

Lines changed: 56 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,54 @@
4141

4242
namespace rm_common
4343
{
44-
struct CalibrationService
44+
class CalibrationService
4545
{
46-
std::string start_controller, stop_controller;
47-
QueryCalibrationServiceCaller* query_services;
46+
public:
47+
CalibrationService(XmlRpc::XmlRpcValue& rpc_value, ros::NodeHandle& nh)
48+
{
49+
ROS_ASSERT(rpc_value.hasMember("start_controllers"));
50+
ROS_ASSERT(rpc_value.hasMember("stop_controllers"));
51+
ROS_ASSERT(rpc_value.hasMember("services_name"));
52+
ROS_ASSERT(rpc_value["start_controllers"].getType() == XmlRpc::XmlRpcValue::TypeArray);
53+
ROS_ASSERT(rpc_value["stop_controllers"].getType() == XmlRpc::XmlRpcValue::TypeArray);
54+
ROS_ASSERT(rpc_value["services_name"].getType() == XmlRpc::XmlRpcValue::TypeArray);
55+
start_controllers = getControllersName(rpc_value["start_controllers"]);
56+
stop_controllers = getControllersName(rpc_value["stop_controllers"]);
57+
for (int i = 0; i < rpc_value["services_name"].size(); ++i)
58+
{
59+
query_services.push_back(new QueryCalibrationServiceCaller(nh, rpc_value["services_name"][i]));
60+
}
61+
}
62+
void setCalibratedFalse()
63+
{
64+
for (auto& service : query_services)
65+
service->getService().response.is_calibrated = false;
66+
}
67+
bool isCalibrated()
68+
{
69+
bool is_calibrated = true;
70+
for (auto& service : query_services)
71+
is_calibrated &= service->isCalibrated();
72+
return is_calibrated;
73+
}
74+
void callService()
75+
{
76+
for (auto& service : query_services)
77+
service->callService();
78+
}
79+
std::vector<std::string> start_controllers, stop_controllers;
80+
std::vector<QueryCalibrationServiceCaller*> query_services;
81+
82+
private:
83+
std::vector<std::string> getControllersName(XmlRpc::XmlRpcValue& rpc_value)
84+
{
85+
std::vector<std::string> controllers;
86+
for (int i = 0; i < rpc_value.size(); ++i)
87+
{
88+
controllers.push_back(rpc_value[i]);
89+
}
90+
return controllers;
91+
}
4892
};
4993

5094
class CalibrationQueue
@@ -60,14 +104,7 @@ class CalibrationQueue
60104
if (use_sim_time || rpc_value.getType() != XmlRpc::XmlRpcValue::TypeArray)
61105
return;
62106
for (int i = 0; i < rpc_value.size(); ++i)
63-
{
64-
ROS_ASSERT(rpc_value[i].hasMember("start_controller"));
65-
ROS_ASSERT(rpc_value[i].hasMember("stop_controller"));
66-
calibration_services_.push_back(
67-
CalibrationService{ .start_controller = rpc_value[i]["start_controller"],
68-
.stop_controller = rpc_value[i]["stop_controller"],
69-
.query_services = new QueryCalibrationServiceCaller(rpc_value[i], nh) });
70-
}
107+
calibration_services_.push_back(CalibrationService(rpc_value[i], nh));
71108
last_query_ = ros::Time::now();
72109
calibration_itr_ = calibration_services_.end();
73110
// Start with calibrated, you should use reset() to start calibration.
@@ -79,7 +116,7 @@ class CalibrationQueue
79116
calibration_itr_ = calibration_services_.begin();
80117
switched_ = false;
81118
for (auto service : calibration_services_)
82-
service.query_services->getService().response.is_calibrated = false;
119+
service.setCalibratedFalse();
83120
}
84121
void update(const ros::Time& time, bool flip_controllers)
85122
{
@@ -89,18 +126,18 @@ class CalibrationQueue
89126
return;
90127
if (switched_)
91128
{
92-
if (calibration_itr_->query_services->isCalibrated())
129+
if (calibration_itr_->isCalibrated())
93130
{
94131
if (flip_controllers)
95-
controller_manager_.startController(calibration_itr_->stop_controller);
96-
controller_manager_.stopController(calibration_itr_->start_controller);
132+
controller_manager_.startControllers(calibration_itr_->stop_controllers);
133+
controller_manager_.stopControllers(calibration_itr_->start_controllers);
97134
calibration_itr_++;
98135
switched_ = false;
99136
}
100137
else if ((time - last_query_).toSec() > .2)
101138
{
102139
last_query_ = time;
103-
calibration_itr_->query_services->callService();
140+
calibration_itr_->callService();
104141
}
105142
}
106143
else
@@ -109,8 +146,8 @@ class CalibrationQueue
109146
switched_ = true;
110147
if (calibration_itr_ != calibration_services_.end())
111148
{
112-
controller_manager_.startController(calibration_itr_->start_controller);
113-
controller_manager_.stopController(calibration_itr_->stop_controller);
149+
controller_manager_.startControllers(calibration_itr_->start_controllers);
150+
controller_manager_.stopControllers(calibration_itr_->stop_controllers);
114151
}
115152
}
116153
}
@@ -127,7 +164,7 @@ class CalibrationQueue
127164
if (calibration_services_.empty())
128165
return;
129166
if (calibration_itr_ != calibration_services_.end() && switched_)
130-
controller_manager_.stopController(calibration_itr_->stop_controller);
167+
controller_manager_.stopControllers(calibration_itr_->stop_controllers);
131168
}
132169
void stop()
133170
{

rm_common/include/rm_common/decision/service_caller.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ class ServiceCallerBase
6363
}
6464
client_ = nh.serviceClient<ServiceType>(service_name_);
6565
}
66+
ServiceCallerBase(ros::NodeHandle& nh, std::string& service_name) : fail_count_(0), fail_limit_(0)
67+
{
68+
service_name_ = service_name;
69+
client_ = nh.serviceClient<ServiceType>(service_name_);
70+
}
6671
ServiceCallerBase(XmlRpc::XmlRpcValue& controllers, ros::NodeHandle& nh, const std::string& service_name = "")
6772
: fail_count_(0), fail_limit_(0)
6873
{
@@ -160,6 +165,10 @@ class QueryCalibrationServiceCaller : public ServiceCallerBase<control_msgs::Que
160165
: ServiceCallerBase<control_msgs::QueryCalibrationState>(nh)
161166
{
162167
}
168+
QueryCalibrationServiceCaller(ros::NodeHandle& nh, std::string& service_name)
169+
: ServiceCallerBase<control_msgs::QueryCalibrationState>(nh, service_name)
170+
{
171+
}
163172
QueryCalibrationServiceCaller(XmlRpc::XmlRpcValue& controllers, ros::NodeHandle& nh)
164173
: ServiceCallerBase<control_msgs::QueryCalibrationState>(controllers, nh)
165174
{

0 commit comments

Comments
 (0)