Skip to content

Commit 6701090

Browse files
Zarnacksebastian zarnackAndyZe
authored andcommitted
Adjust moveit_servo clock to work with fake_hardware (moveit#3529)
* fixed moveit_servo to work with fake_hardware (fixes issue moveit#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 * Function naming * Anonymous namespace * Better comments --------- Co-authored-by: sebastian zarnack <sebastian.zarnack@eas.iis.fraunhofer.de> Co-authored-by: AndyZe <andyz@utexas.edu>
1 parent bd170c0 commit 6701090

1 file changed

Lines changed: 22 additions & 3 deletions

File tree

moveit_ros/moveit_servo/src/servo_node.cpp

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

53+
namespace
54+
{
55+
// This function is used to convert times in case planning_scene_monitor uses RCL_SYSTEM_TIME
56+
rclcpp::Time convertClockType(const rclcpp::Time& time, rcl_clock_type_t new_clock_type)
57+
{
58+
if (time.get_clock_type() != new_clock_type)
59+
{
60+
return rclcpp::Time(time.nanoseconds(), new_clock_type);
61+
}
62+
return time;
63+
}
64+
} // namespace
65+
5366
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr ServoNode::get_node_base_interface()
5467
{
5568
return node_->get_node_base_interface();
@@ -325,10 +338,16 @@ void ServoNode::servoLoop()
325338
std::optional<KinematicState> next_joint_state = std::nullopt;
326339
rclcpp::WallRate servo_frequency(1 / servo_params_.publish_period);
327340

328-
// wait for first robot joint state update
329341
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())
342+
343+
// convert_clock_type() is used in case planning_scene_monitor uses RCL_SYSTEM_TIME
344+
// while Servo uses RCL_ROS_TIME
345+
while (servo_node_start >
346+
convertClockType(planning_scene_monitor_->getLastUpdateTime(), servo_node_start.get_clock_type()))
347+
{
348+
RCLCPP_INFO(node_->get_logger(), "Waiting for planning scene monitor to receive robot state update.");
349+
rclcpp::sleep_for(std::chrono::seconds(1));
350+
}
332351
{
333352
RCLCPP_INFO(node_->get_logger(), "Waiting to receive robot state update.");
334353
rclcpp::sleep_for(std::chrono::seconds(1));

0 commit comments

Comments
 (0)