4141
4242namespace 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
5094class 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 {
0 commit comments