Skip to content

Commit e35a295

Browse files
sebastian zarnackZarnack
authored andcommitted
fixed moveit_servo to work with fake_hardware (fixes issue #3040)
The planning scene monitor may use a different clock type (e.g., system clock) than the servo node (ROS clock), causing timestamp comparison failures that prevented servo from starting properly with fake_hardware controllers. --> Add convert_clock_type() helper function to handle clock type conversions
1 parent 7d6e2ab commit e35a295

1 file changed

Lines changed: 16 additions & 3 deletions

File tree

moveit_ros/moveit_servo/src/servo_node.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@
5050
namespace moveit_servo
5151
{
5252

53+
rclcpp::Time convert_clock_type(const rclcpp::Time& time, rcl_clock_type_t new_clock_type)
54+
{
55+
if (time.get_clock_type() != new_clock_type)
56+
{
57+
return rclcpp::Time(time.nanoseconds(), new_clock_type);
58+
}
59+
return time;
60+
}
61+
5362
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr ServoNode::get_node_base_interface()
5463
{
5564
return node_->get_node_base_interface();
@@ -325,10 +334,14 @@ void ServoNode::servoLoop()
325334
std::optional<KinematicState> next_joint_state = std::nullopt;
326335
rclcpp::WallRate servo_frequency(1 / servo_params_.publish_period);
327336

328-
// wait for first robot joint state update
329337
const auto servo_node_start = node_->now();
330-
while (planning_scene_monitor_->getLastUpdateTime().get_clock_type() != node_->get_clock()->get_clock_type() ||
331-
servo_node_start > planning_scene_monitor_->getLastUpdateTime())
338+
339+
while (servo_node_start >
340+
convert_clock_type(planning_scene_monitor_->getLastUpdateTime(), servo_node_start.get_clock_type()))
341+
{
342+
RCLCPP_INFO(node_->get_logger(), "Waiting for planning scene monitor to receive robot state update.");
343+
rclcpp::sleep_for(std::chrono::seconds(1));
344+
}
332345
{
333346
RCLCPP_INFO(node_->get_logger(), "Waiting to receive robot state update.");
334347
rclcpp::sleep_for(std::chrono::seconds(1));

0 commit comments

Comments
 (0)