小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
机械臂代码一直卡在(move_group.plan(my_plan)部分
-
@空白 目前排查到的原因应该是关于MoveGroup的action client/server 目前自己的节点向move_group发送请求得到了响应,但是move_group的反馈结果没有返回给自己的节点,在
[move_group-1] [INFO] [1670712315.987015277] [moveit_move_group_default_capabilities.move_action_capability]: Received request [move_group-1] [INFO] [1670712315.987152679] [moveit_move_group_default_capabilities.move_action_capability]: executing.. [move_group-1] [INFO] [1670712315.991030377] [moveit_move_group_default_capabilities.move_action_capability]: Planning request received for MoveGroup action. Forwarding to planning pipeline. [move_group-1] [INFO] [1670712315.991917639] [moveit.ompl_planning.model_based_planning_context]: Planner configuration 'manipulator' will use planner 'geometric::RRTConnect'. Additional configuration parameters will be set when the planner is constructed. [move_group-1] [INFO] [1670712316.032067397] [moveit_move_group_default_capabilities.move_action_capability]: Motion plan was computed successfully.
时应该会向自己的节点发送
[panda_move_node-1] [INFO] [1670754384.475582319] [move_group_interface]: Planning request accepted [panda_move_node-1] [INFO] [1670754384.543603441] [move_group_interface]: Planning request complete!
对应的反馈结果,但是我自己编写的abb_move_node并没有接收到,所以就一直卡在等待响应的过程中了,但是还是没有想到怎么解决
-
@空白 看了下也没什么头绪,比较担心的是spin这
rclcpp::executors::SingleThreadedExecutor executor; executor.add_node(move_group_node); std::thread([&executor]() { executor.spin(); }).detach();
试试用多线程执行器看看,moveit2给的demo也是这样用的吗
-
@小鱼 嗯嗯,把这个去掉后就跳出循环了,后面代码也执行了,但是前面又出现问题了,我再重新看看代码。官方源码是这样写的
// We spin up a SingleThreadedExecutor for the current state monitor to get information // about the robot's state. /* 我们为当前状态监视器启动SingleThreadExecutor以获取信息 关于机器人的状态。 rclcpp::executors::SingleThreadedExecutor executor;//初始化执行器 单线程执行器 executor.add_node(node);//将要实时控制的节点添加到Executor Executor 不维护对节点的强引用(只是一个weak_ptr,所以shared_ptr 计数不会增加) std::thread([&executor]() { executor.spin(); }).detach();//spin直到 rclcpp::ok() 返回 false 是不是就相当于node.spin()? */ rclcpp::executors::SingleThreadedExecutor executor; executor.add_node(move_group_node); std::thread([&executor]() { executor.spin(); }).detach();
去掉这个spin后出现了之前没有出现的问题,不过这个原因确实解决了,谢谢 小鱼
-
-
@小鱼 这个应该顺便解释了之前很多人在群里问Moveit Documentation:Humble documentation 这部分里面关于Visualizing In RViz 提供的代码为什么会执行不下去卡住的原因,因为官方也是用的这部分spin方法
https://moveit.picknik.ai/humble/doc/tutorials/visualizing_in_rviz/visualizing_in_rviz.html
// We spin up a SingleThreadedExecutor for the current state monitor to get // information about the robot's state. rclcpp::executors::SingleThreadedExecutor executor; executor.add_node(node); auto spinner = std::thread([&executor]() { executor.spin(); });
我之前在这里也卡住了,但是没有认真考虑这个问题
-
@空白 官方也会坑人哈
-
@小鱼 我明白为什么官方要使用这个代码了,去掉后的确不能得到目前机械臂的状态了
像介绍里面描述的一样// We spin up a SingleThreadedExecutor for the current state monitor to get // information about the robot's state.
但是离谱的是如果加上这个就没办法从plan那部分循环里面出来
-
@空白 去掉肯定是不行的,试试多线程执行器,原来的估计是跨线程通信造成死锁问题了
-
@小鱼 在 机械臂代码一直卡在(move_group.plan(my_plan)部分 中说:
去掉肯定是不行的,试试多线程执行器,原来的估计是跨线程通信造成死锁问题了
好的,谢谢小鱼,这个问题基本上解决了,后面就是去github上面多找找代码学习和练手
-
@空白 大哥,可以看看最终写出来的规划moviet2机械臂的代码吗?
-
可以开启多个异步线程,在ros1中我遇到这个问题是通过ros::AsyncSpinner 解决的,线程数量根据你的实际情况多给几个,希望对你有帮助。