moveit2 icon indicating copy to clipboard operation
moveit2 copied to clipboard

MGI CallbackGroup doesn't trigger when running external Executor + Fast-DDS

Open AndyZe opened this issue 2 years ago • 12 comments

Description

The OMPL constrained planning tutorial here no longer works.

I've traced it down to this:

  rclcpp::NodeOptions node_options;
  node_options.automatically_declare_parameters_from_overrides(true);
  auto node = rclcpp::Node::make_shared("ompl_constrained_planning_demo_node", node_options);

  rclcpp::executors::SingleThreadedExecutor executor;
  executor.add_node(node);
  auto spinner = std::thread([&executor]() { executor.spin(); });
  
  moveit::planning_interface::MoveGroupInterface move_group_interface(node, "panda_arm");
  auto moveit_visual_tools =
      moveit_visual_tools::MoveItVisualTools{ node, "panda_link0", rviz_visual_tools::RVIZ_MARKER_TOPIC,
                                              move_group_interface.getRobotModel() };
      ...
   success = (move_group_interface.plan(plan) == moveit::core::MoveItErrorCode::SUCCESS);
   RCLCPP_INFO(LOGGER, "Plan with plane constraint %s", success ? "" : "FAILED");   // Never prints

The last line does not print. In other words, the mgi.plan() call is blocking. I suspect this has to do with conflicting callback groups.

I tried a multi-threaded executor as well as two separate nodes.

I'm suspicious that this PR caused the bug: https://github.com/ros-planning/moveit2/pull/1305

AndyZe avatar Aug 03 '22 16:08 AndyZe

Indeed, rolling back #1305 prevents the issue.

AndyZe avatar Aug 03 '22 16:08 AndyZe

Does MoveGroup receive the planning call and does it return a result?

henningkayser avatar Aug 03 '22 18:08 henningkayser

Yes, planning succeeds. I'm not sure if it tries to return a value or not. (If it does try to return a value, it doesn't make it.) Easy to test with the tutorial

AndyZe avatar Aug 03 '22 18:08 AndyZe

What do you mean with "parallel with 'other things'"? Running MGI requests from multiple threads?

henningkayser avatar Aug 03 '22 18:08 henningkayser

moveit_visual_tools in this case. You can look at the linked tutorial code

AndyZe avatar Aug 03 '22 18:08 AndyZe

Ok, this is odd. I could reproduce this very easily, and indeed changing executor or callback group settings wouldn't fix this. However, moving MGI initialization before the SingleThreadedExecutor does the trick for me:

  rclcpp::NodeOptions node_options;
  node_options.automatically_declare_parameters_from_overrides(true);
  auto node = rclcpp::Node::make_shared("ompl_constrained_planning_demo_node", node_options);
  
  moveit::planning_interface::MoveGroupInterface move_group_interface(node, "panda_arm");

  rclcpp::executors::SingleThreadedExecutor executor;
  executor.add_node(node);
  auto spinner = std::thread([&executor]() { executor.spin(); });
  
  auto moveit_visual_tools =
      moveit_visual_tools::MoveItVisualTools{ node, "panda_link0", rviz_visual_tools::RVIZ_MARKER_TOPIC,
                                              move_group_interface.getRobotModel() };
      ...
   success = (move_group_interface.plan(plan) == moveit::core::MoveItErrorCode::SUCCESS);
   RCLCPP_INFO(LOGGER, "Plan with plane constraint %s", success ? "" : "FAILED");   // Never prints

This looks like some rmw/CallbackGroup bug to me, possibly related to https://github.com/ros2/rclcpp/issues/1611. The code in MGI looks correct to me, otherwise.

henningkayser avatar Aug 03 '22 21:08 henningkayser

I just encountered this yesterday as well... My ROS Answers post here from earlier today for reference.

BrettHemes avatar Aug 12 '22 21:08 BrettHemes

However, moving MGI initialization before the SingleThreadedExecutor does the trick for me

I can confirm this works in my application as well.

BrettHemes avatar Aug 15 '22 16:08 BrettHemes

However, moving MGI initialization before the SingleThreadedExecutor does the trick for me

This works for me as well

HammadB avatar Aug 17 '22 21:08 HammadB

Thanks @mikeferguson, I just confirmed that everything is fine when using Cyclone DDS (link for anyone who wants to reproduce). Was this the issue you were referring to? The bug has hopefully been fixed already with https://github.com/ros2/rmw_fastrtps/pull/619, we should check that.

henningkayser avatar Aug 25 '22 16:08 henningkayser

However, moving MGI initialization before the SingleThreadedExecutor does the trick for me.

This does seem to fix the issue for me too, has it been changed in the documentation yet?

AbduEhab avatar Sep 17 '22 12:09 AbduEhab

However, moving MGI initialization before the SingleThreadedExecutor does the trick for me.

I gave this a shot yesterday but it didn't completely fix the issue. I could proceed a little farther through the tutorials but they still deadlocked eventually. I guess switching to Cyclone DDS is the best fix, unfortunately.

AndyZe avatar Sep 17 '22 18:09 AndyZe

so... what is the current status of this? Haven't the FastDDS issues been resolved by now?

henningkayser avatar Mar 10 '23 19:03 henningkayser

Fixed in the latest release https://github.com/ros2/rmw_fastrtps/issues/650

JafarAbdi avatar Apr 12 '23 22:04 JafarAbdi

Hi,

Could mentioned problem be connected with following maybe?

I'm not able to set up MoveGroupInterface with MultiThreadedExecutor? Is that expected behavior?

fzoric8 avatar May 09 '24 11:05 fzoric8