@@ -156,9 +156,17 @@ CallbackReturn JointStateBroadcaster::on_configure(
156156 joint_state_publisher_ = get_node ()->create_publisher <sensor_msgs::msg::JointState>(
157157 topic_name_prefix + " joint_states" , rclcpp::SystemDefaultsQoS ());
158158
159+ realtime_joint_state_publisher_ =
160+ std::make_shared<realtime_tools::RealtimePublisher<sensor_msgs::msg::JointState>>(
161+ joint_state_publisher_);
162+
159163 dynamic_joint_state_publisher_ =
160164 get_node ()->create_publisher <control_msgs::msg::DynamicJointState>(
161165 topic_name_prefix + " dynamic_joint_states" , rclcpp::SystemDefaultsQoS ());
166+
167+ realtime_dynamic_joint_state_publisher_ =
168+ std::make_shared<realtime_tools::RealtimePublisher<control_msgs::msg::DynamicJointState>>(
169+ dynamic_joint_state_publisher_);
162170 }
163171 catch (const std::exception & e)
164172 {
@@ -281,26 +289,28 @@ void JointStateBroadcaster::init_joint_state_msg()
281289 // / with at least one of these interfaces, the rest are omitted from this message
282290
283291 // default initialization for joint state message
284- joint_state_msg_.name = joint_names_;
285- joint_state_msg_.position .resize (num_joints, kUninitializedValue );
286- joint_state_msg_.velocity .resize (num_joints, kUninitializedValue );
287- joint_state_msg_.effort .resize (num_joints, kUninitializedValue );
292+ auto & joint_state_msg = realtime_joint_state_publisher_->msg_ ;
293+ joint_state_msg.name = joint_names_;
294+ joint_state_msg.position .resize (num_joints, kUninitializedValue );
295+ joint_state_msg.velocity .resize (num_joints, kUninitializedValue );
296+ joint_state_msg.effort .resize (num_joints, kUninitializedValue );
288297}
289298
290299void JointStateBroadcaster::init_dynamic_joint_state_msg ()
291300{
301+ auto & dynamic_joint_state_msg = realtime_dynamic_joint_state_publisher_->msg_ ;
292302 for (const auto & name_ifv : name_if_value_mapping_)
293303 {
294304 const auto & name = name_ifv.first ;
295305 const auto & interfaces_and_values = name_ifv.second ;
296- dynamic_joint_state_msg_ .joint_names .push_back (name);
306+ dynamic_joint_state_msg .joint_names .push_back (name);
297307 control_msgs::msg::InterfaceValue if_value;
298308 for (const auto & interface_and_value : interfaces_and_values)
299309 {
300310 if_value.interface_names .emplace_back (interface_and_value.first );
301311 if_value.values .emplace_back (kUninitializedValue );
302312 }
303- dynamic_joint_state_msg_ .interface_values .emplace_back (if_value);
313+ dynamic_joint_state_msg .interface_values .emplace_back (if_value);
304314 }
305315}
306316
@@ -342,37 +352,45 @@ controller_interface::return_type JointStateBroadcaster::update(
342352 state_interface.get_value ());
343353 }
344354
345- joint_state_msg_.header .stamp = time;
346- dynamic_joint_state_msg_.header .stamp = time;
347-
348- // update joint state message and dynamic joint state message
349- for (size_t i = 0 ; i < joint_names_.size (); ++i)
355+ if (realtime_joint_state_publisher_ && realtime_joint_state_publisher_->trylock ())
350356 {
351- joint_state_msg_.position [i] =
352- get_value (name_if_value_mapping_, joint_names_[i], HW_IF_POSITION);
353- joint_state_msg_.velocity [i] =
354- get_value (name_if_value_mapping_, joint_names_[i], HW_IF_VELOCITY);
355- joint_state_msg_.effort [i] = get_value (name_if_value_mapping_, joint_names_[i], HW_IF_EFFORT);
357+ auto & joint_state_msg = realtime_joint_state_publisher_->msg_ ;
358+
359+ joint_state_msg.header .stamp = time;
360+
361+ // update joint state message and dynamic joint state message
362+ for (size_t i = 0 ; i < joint_names_.size (); ++i)
363+ {
364+ joint_state_msg.position [i] =
365+ get_value (name_if_value_mapping_, joint_names_[i], HW_IF_POSITION);
366+ joint_state_msg.velocity [i] =
367+ get_value (name_if_value_mapping_, joint_names_[i], HW_IF_VELOCITY);
368+ joint_state_msg.effort [i] = get_value (name_if_value_mapping_, joint_names_[i], HW_IF_EFFORT);
369+ }
370+ realtime_joint_state_publisher_->unlockAndPublish ();
356371 }
357372
358- for (size_t joint_index = 0 ; joint_index < dynamic_joint_state_msg_.joint_names .size ();
359- ++joint_index)
373+ if (realtime_dynamic_joint_state_publisher_ && realtime_dynamic_joint_state_publisher_->trylock ())
360374 {
361- const auto & name = dynamic_joint_state_msg_.joint_names [joint_index];
362- for (size_t interface_index = 0 ;
363- interface_index <
364- dynamic_joint_state_msg_.interface_values [joint_index].interface_names .size ();
365- ++interface_index)
375+ auto & dynamic_joint_state_msg = realtime_dynamic_joint_state_publisher_->msg_ ;
376+ dynamic_joint_state_msg.header .stamp = time;
377+ for (size_t joint_index = 0 ; joint_index < dynamic_joint_state_msg.joint_names .size ();
378+ ++joint_index)
366379 {
367- const auto & interface_name =
368- dynamic_joint_state_msg_.interface_values [joint_index].interface_names [interface_index];
369- dynamic_joint_state_msg_.interface_values [joint_index].values [interface_index] =
370- name_if_value_mapping_[name][interface_name];
380+ const auto & name = dynamic_joint_state_msg.joint_names [joint_index];
381+ for (size_t interface_index = 0 ;
382+ interface_index <
383+ dynamic_joint_state_msg.interface_values [joint_index].interface_names .size ();
384+ ++interface_index)
385+ {
386+ const auto & interface_name =
387+ dynamic_joint_state_msg.interface_values [joint_index].interface_names [interface_index];
388+ dynamic_joint_state_msg.interface_values [joint_index].values [interface_index] =
389+ name_if_value_mapping_[name][interface_name];
390+ }
371391 }
392+ realtime_dynamic_joint_state_publisher_->unlockAndPublish ();
372393 }
373- // publish
374- joint_state_publisher_->publish (joint_state_msg_);
375- dynamic_joint_state_publisher_->publish (dynamic_joint_state_msg_);
376394
377395 return controller_interface::return_type::OK;
378396}
0 commit comments