1717constexpr double NaN = std::numeric_limits<double >::quiet_NaN();
1818
1919using ControllerReferenceMsg = gimbal_controller::GimbalPositionController::ControllerReferenceMsg;
20- using ControllerFeedbackMsg = gimbal_controller::GimbalPositionController::ControllerFeedbackMsg;
2120
2221
2322using hardware_interface::HW_IF_EFFORT;
@@ -26,7 +25,6 @@ using hardware_interface::HW_IF_VELOCITY;
2625
2726namespace gimbal_controller
2827{
29-
3028 void GimbalPositionController::reset_controller_reference_msg (
3129 const std::shared_ptr<ControllerReferenceMsg>& msg,
3230 const std::shared_ptr<rclcpp_lifecycle::LifecycleNode>& /* node*/ )
@@ -35,21 +33,6 @@ namespace gimbal_controller
3533 msg->pitch = NaN;
3634 }
3735
38- void GimbalPositionController::reset_controller_feedback_msg (
39- const std::shared_ptr<ControllerFeedbackMsg>& msg, const std::shared_ptr<rclcpp_lifecycle::LifecycleNode>& node)
40- {
41- msg->header .stamp = node->now ();
42- msg->orientation .x = NaN;
43- msg->orientation .y = NaN;
44- msg->orientation .z = NaN;
45- msg->orientation .w = NaN;
46- msg->angular_velocity .x = NaN;
47- msg->angular_velocity .y = NaN;
48- msg->angular_velocity .z = NaN;
49- msg->linear_acceleration .x = NaN;
50- msg->linear_acceleration .y = NaN;
51- msg->linear_acceleration .z = NaN;
52- }
5336 controller_interface::CallbackReturn GimbalPositionController::on_init ()
5437 {
5538
@@ -95,14 +78,6 @@ namespace gimbal_controller
9578 reset_controller_reference_msg (msg, get_node ());
9679 input_ref_.writeFromNonRT (msg);
9780
98- // Feedback Subscriber
99- feedback_subscriber_ = get_node ()->create_subscription <ControllerFeedbackMsg>(
100- params_.imu_topic , subscribers_qos,
101- std::bind (&GimbalPositionController::feedback_callback, this , std::placeholders::_1));
102-
103- auto feedback_msg = std::make_shared<ControllerFeedbackMsg>();
104- reset_controller_feedback_msg (feedback_msg, get_node ());
105- input_feedback_.writeFromNonRT (feedback_msg);
10681 try
10782 {
10883 // State publisher
@@ -150,13 +125,11 @@ namespace gimbal_controller
150125 state_interfaces_config.names .reserve (2 );
151126 state_interfaces_config.names .push_back (params_.yaw_gimbal_joint .name + " /" + HW_IF_POSITION);
152127 state_interfaces_config.names .push_back (params_.pitch_gimbal_joint .name + " /" + HW_IF_POSITION);
153- if (imu_sensor_)
154- {
155- auto imu_interfaces = imu_sensor_->get_state_interface_names ();
156- state_interfaces_config.names .insert (state_interfaces_config.names .end (), imu_interfaces.begin (),
157- imu_interfaces.end ());
158- }
159- // IMU feedback comes from ROS2 topic
128+
129+ // IMU feedback comes from state interfaces
130+ auto imu_interfaces = imu_sensor_->get_state_interface_names ();
131+ state_interfaces_config.names .insert (state_interfaces_config.names .end (), imu_interfaces.begin (),
132+ imu_interfaces.end ());
160133
161134 return state_interfaces_config;
162135 }
@@ -166,11 +139,6 @@ namespace gimbal_controller
166139 input_ref_.writeFromNonRT (msg);
167140 }
168141
169- void GimbalPositionController::feedback_callback (const std::shared_ptr<ControllerFeedbackMsg> msg)
170- {
171- input_feedback_.writeFromNonRT (msg);
172- }
173-
174142 std::vector<hardware_interface::CommandInterface> GimbalPositionController::on_export_reference_interfaces ()
175143 {
176144 reference_interfaces_.resize (2 , NaN);
@@ -198,7 +166,6 @@ namespace gimbal_controller
198166 {
199167 // Set default value in command
200168 reset_controller_reference_msg (*(input_ref_.readFromRT ()), get_node ());
201- reset_controller_feedback_msg (*(input_feedback_.readFromRT ()), get_node ());
202169
203170 reference_interfaces_.assign (reference_interfaces_.size (), NaN);
204171 imu_sensor_->assign_loaned_state_interfaces (state_interfaces_);
@@ -214,9 +181,13 @@ namespace gimbal_controller
214181 }
215182
216183#if RCLCPP_VERSION_MAJOR >= 28 // ROS 2 Jazzy or later
217- controller_interface::return_type GimbalPositionController::update_reference_from_subscribers (const rclcpp::Time &time,const rclcpp::Duration &period){
184+ controller_interface::return_type
185+ GimbalPositionController::update_reference_from_subscribers (const rclcpp::Time& time,
186+ const rclcpp::Duration& period)
187+ {
218188#else
219- controller_interface::return_type GimbalPositionController::update_reference_from_subscribers (){
189+ controller_interface::return_type GimbalPositionController::update_reference_from_subscribers ()
190+ {
220191#endif
221192 auto current_ref = *(input_ref_.readFromRT ()); // A shared_ptr must be allocated
222193 // immediately to prevent dangling
@@ -252,22 +223,24 @@ namespace gimbal_controller
252223 double yaw_pos_err = NaN, pitch_pos_err = NaN;
253224 double yaw_vel_ref = NaN;
254225
255- double yaw_enc_pos = state_interfaces_[0 ].get_value ();
256- double pitch_enc_pos = state_interfaces_[1 ].get_value ();
226+ // std::optional< double> yaw_enc_pos = state_interfaces_[0].get_optional ();
227+ std::optional< double > pitch_enc_pos = state_interfaces_[1 ].get_optional ();
257228 // Calculate commands
258229 if (!std::isnan (reference_interfaces_[0 ]) && !std::isnan (reference_interfaces_[1 ]) && !std::isnan (yaw_pos_fb) &&
259230 !std::isnan (pitch_pos_fb) && !std::isnan (roll_pos_fb) && !std::isnan (yaw_vel_fb) &&
260231 !std::isnan (pitch_vel_fb))
261232 {
233+ bool ret_ = true ;
262234 if (params_.yaw_gimbal_joint .enable )
263235 {
264236 // Yaw Position (IMU) to velocity (IMU) PID
265237 yaw_pos_ref = reference_interfaces_[0 ];
266238 yaw_pos_err = angles::shortest_angular_distance (yaw_pos_fb, yaw_pos_ref);
267- yaw_vel_ref = yaw_pos2vel_pid_->computeCommand (yaw_pos_err, period);
268- command_interfaces_[0 ].set_value (0.0 );
269- command_interfaces_[1 ].set_value (yaw_vel_ref);
270- command_interfaces_[2 ].set_value (0.0 );
239+ yaw_vel_ref = yaw_pos2vel_pid_->compute_command (yaw_pos_err, period);
240+
241+ ret_ |= command_interfaces_[0 ].set_value (0.0 );
242+ ret_ |= command_interfaces_[1 ].set_value (yaw_vel_ref);
243+ ret_ |= command_interfaces_[2 ].set_value (0.0 );
271244 }
272245
273246 if (params_.pitch_gimbal_joint .enable )
@@ -277,7 +250,11 @@ namespace gimbal_controller
277250 // dm imu is positive up
278251 pitch_pos_ref = -reference_interfaces_[1 ];
279252 pitch_pos_err = angles::shortest_angular_distance (-pitch_pos_fb, pitch_pos_ref);
280- command_interfaces_[3 ].set_value (pitch_enc_pos + pitch_pos_err);
253+ ret_ |= command_interfaces_[3 ].set_value (*pitch_enc_pos + pitch_pos_err);
254+ }
255+ if (!ret_)
256+ {
257+ RCLCPP_ERROR (get_node ()->get_logger (), " Failed to set command interfaces" );
281258 }
282259 }
283260 // Publish state
@@ -299,7 +276,7 @@ namespace gimbal_controller
299276 state_publisher_->msg_ .dof_states [1 ].feedback = pitch_pos_fb;
300277 state_publisher_->msg_ .dof_states [1 ].error = pitch_pos_err;
301278 state_publisher_->msg_ .dof_states [1 ].time_step = period.seconds ();
302- state_publisher_->msg_ .dof_states [1 ].output = pitch_enc_pos + pitch_pos_err;
279+ state_publisher_->msg_ .dof_states [1 ].output = * pitch_enc_pos + pitch_pos_err;
303280 }
304281
305282 state_publisher_->unlockAndPublish ();
0 commit comments