鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    机械臂代码一直卡在(move_group.plan(my_plan)部分

    已定时 已固定 已锁定 已移动 已解决
    机械臂运动规划
    moveit2 plan
    4
    11
    1.9k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 空白空
      空白 @空白
      最后由 编辑

      @空白 目前排查到的原因应该是关于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并没有接收到,所以就一直卡在等待响应的过程中了,但是还是没有想到怎么解决

      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @空白
        最后由 编辑

        @空白 看了下也没什么头绪,比较担心的是spin这

          rclcpp::executors::SingleThreadedExecutor executor;
          executor.add_node(move_group_node);
          std::thread([&executor]() { executor.spin(); }).detach();
        

        试试用多线程执行器看看,moveit2给的demo也是这样用的吗

        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

        空白空 2 条回复 最后回复 回复 引用 0
        • 空白空
          空白 @小鱼
          最后由 编辑

          @小鱼 嗯嗯,把这个去掉后就跳出循环了,后面代码也执行了,但是前面又出现问题了,我再重新看看代码。官方源码是这样写的

            // 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后出现了之前没有出现的问题,不过这个原因确实解决了,谢谢 小鱼

          1 条回复 最后回复 回复 引用 0
          • 空白空 空白 将这个主题标记为已解决,在
          • 空白空
            空白 @小鱼
            最后由 编辑

            @小鱼 这个应该顺便解释了之前很多人在群里问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(); });
            

            我之前在这里也卡住了,但是没有认真考虑这个问题😵

            小鱼小 1 条回复 最后回复 回复 引用 0
            • 小鱼小
              小鱼 技术大佬 @空白
              最后由 编辑

              @空白 🤒 官方也会坑人哈

              新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

              空白空 1 条回复 最后回复 回复 引用 0
              • 空白空
                空白 @小鱼
                最后由 编辑

                @小鱼 我明白为什么官方要使用这个代码了,去掉后的确不能得到目前机械臂的状态了
                像介绍里面描述的一样

                 // We spin up a SingleThreadedExecutor for the current state monitor to get
                  // information about the robot's state.
                

                但是离谱的是如果加上这个就没办法从plan那部分循环里面出来😦

                1 条回复 最后回复 回复 引用 0
                • 小鱼小
                  小鱼 技术大佬
                  最后由 编辑

                  @空白 去掉肯定是不行的,试试多线程执行器,原来的估计是跨线程通信造成死锁问题了

                  新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                  空白空 1 条回复 最后回复 回复 引用 1
                  • 空白空
                    空白 @小鱼
                    最后由 编辑

                    @小鱼 在 机械臂代码一直卡在(move_group.plan(my_plan)部分 中说:

                    去掉肯定是不行的,试试多线程执行器,原来的估计是跨线程通信造成死锁问题了

                    好的,谢谢小鱼,这个问题基本上解决了,后面就是去github上面多找找代码学习和练手😄

                    3596479103 1 条回复 最后回复 回复 引用 1
                    • 3596479103
                      向上 @空白
                      最后由 编辑

                      @空白 大哥,可以看看最终写出来的规划moviet2机械臂的代码吗?

                      1 条回复 最后回复 回复 引用 0
                      • 万青万
                        万青
                        最后由 编辑

                        可以开启多个异步线程,在ros1中我遇到这个问题是通过ros::AsyncSpinner 解决的,线程数量根据你的实际情况多给几个,希望对你有帮助。

                        1 条回复 最后回复 回复 引用 0
                        • 第一个帖子
                          最后一个帖子
                        皖ICP备16016415号-7
                        Powered by NodeBB | 鱼香ROS