ROS探索总结(二十六)——MoveIt编程

  • 内容
  • 评论
  • 相关

  在之前的基础学习中,我们已经对moveit有了一个基本的认识,在实际的应用中,GUI提供的功能毕竟有限,很多实现还是需要我们在代码中完成,moveitmove_group也提供了丰富的C++ API,不仅可以帮助我们使用代码完成GUI可以实现的功能,还可以加入更多丰富的功能。我们继续使用《Mastering ROS for robotics Programming》中的源码作为学习对象。

clip_image002

 

一、创建功能包

首先,我们先创建一个新的功能包,来放置我们的代码:

  1. $ catkin_create_pkg seven_dof_arm_test catkin cmake_modules interactive_markers moveit_core moveit_ros_perception moveit_ros_planning_interface pluginlib roscpp std_msgs

  也可以直接使用《Mastering ROS for robotics Programming》中的seven_dof_arm_test功能包。

二、随机轨迹

  通过rvizplanning插件的功能,我们可以为机器人产生一个随机的目标位置,让机器人完成运动规划并移动到目标点。使用代码同样可以实现相同的功能,我们首先从这个较为简单的例程入手,对Moveit C++ API有一个初步的认识。

  二话不说,先上代码(源码文件 test_random.cpp可以在源码包中找到):

  1. //首先要包含API的头文件
  2. #include <moveit/move_group_interface/move_group.h>
  3. int main(int argc, char **argv)
  4. {
  5.   ros::init(argc, argv, "move_group_interface_demo", ros::init_options::AnonymousName);
  6.   // 创建一个异步的自旋线程(spinning thread)
  7.   ros::AsyncSpinner spinner(1);
  8.   spinner.start();
  9.   // 连接move_group节点中的机械臂实例组,这里的组名arm是我们之前在setup assistant中设置的
  10.   move_group_interface::MoveGroup group("arm");
  11.   // 随机产生一个目标位置
  12.   group.setRandomTarget();
  13.   // 开始运动规划,并且让机械臂移动到目标位置
  14.   group.move();
  15.   ros::waitForShutdown();
  16. }

   已经在代码中加入了重点代码的解释,move_group_interface::MoveGroup用来声明一个机械臂的示例,后边都是针对该实例进行控制。

   除了moveit,可能很多人对ROS单节点中的多线程API接触的比较少。一般我们使用的自旋API都是spin()或者spinonce(),但是有些情况下会有问题,比如说我们有两个回调函数,第一个回调函数会延时5秒,那么当我们开始spin()时,回调函数会顺序执行,第二个回调函数会因为第一个回调函数的延时,在5秒之后才开始执行,这个当然是我们无法接受的,所如果采用多线程的spin(),就不会存在这个问题了。关于ROS多线程的问题,可以参考wiki等资料:

http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning

http://www.cnblogs.com/feixiao5566/p/5288206.html

   然后修改CMakeLists文件,编译代码,执行下边的命令:

  1. $ roslaunch seven_dof_arm_config demo.launch
  2. $ rosrun seven_dof_arm_test test_random_node

   稍等一下,我们就可以在rviz中看到机械臂的动作了。

clip_image004

 

三、自定义目标位置并完成规划

接下来我们继续学习如何使用API自定义一个目标位置并让机器人运动过去。源码是 test_custom.cpp,这里我删掉了部分冗余的代码,进行了部分修改:

  1. // 包含miveit的API头文件
  2. #include <moveit/move_group_interface/move_group.h>
  3.  
  4. int main(int argc, char **argv)
  5. {
  6.   ros::init(argc, argv, "move_group_interface_tutorial");
  7.   ros::NodeHandle node_handle; 
  8.   ros::AsyncSpinner spinner(1);
  9.   spinner.start();
  10.  
  11.   moveit::planning_interface::MoveGroup group("arm");
  12.  
  13.   // 设置机器人终端的目标位置
  14.   geometry_msgs::Pose target_pose1;
  15.   target_pose1.orientation.w = 0.726282;
  16.   target_pose1.orientation.x= 4.04423e-07;
  17.   target_pose1.orientation.y = -0.687396;
  18.   target_pose1.orientation.z = 4.81813e-07;
  19.  
  20.   target_pose1.position.x = 0.0261186;
  21.   target_pose1.position.y = 4.50972e-07;
  22.   target_pose1.position.z = 0.573659;
  23.   group.setPoseTarget(target_pose1);
  24.  
  25.  
  26.   // 进行运动规划,计算机器人移动到目标的运动轨迹,此时只是计算出轨迹,并不会控制机械臂运动
  27.   moveit::planning_interface::MoveGroup::Plan my_plan;
  28.   bool success = group.plan(my_plan);
  29.  
  30.   ROS_INFO("Visualizing plan 1 (pose goal) %s",success?"":"FAILED");   
  31.  
  32.   //让机械臂按照规划的轨迹开始运动。
  33.   //if(success)
  34.   //    group.execute(my_plan);
  35.  
  36.   ros::shutdown(); 
  37.   return 0;
  38. }

     对比生成随机目标的源码,基本上只有只是加入了设置终端目标位置的部分代码,此外这里规划路径使用的是plan(),这个对应rvizplanningplan按键,只会规划路径,可以在界面中看到规划的路径,但是并不会让机器人开始运动,如果要让机器人运动,需要使用execute(my_plan),对应execute按键。当然,我们也可以使用一个move()来代替paln()execute()。具体的API说明,可以参考官方的文档:

http://docs.ros.org/jade/api/moveit_ros_planning_interface/html/classmoveit_1_1planning__interface_1_1MoveGroup.html

  1. $ roslaunch seven_dof_arm_config demo.launch
  2. $ rosrun seven_dof_arm_test test_custom_node

     

clip_image006

 

四、碰撞检测

moveit可以帮助我们完成机器人的自身碰撞检测和环境障碍物碰撞检测,rivzGUI中,我们可以通过 Planning Scene插件来导入障碍物并且对障碍物进行编辑,现在我们在前边学习内容的基础上,通过代码加入一个障碍物,看下会对运动规划有什么影响。

  1. // 包含API的头文件
  2. #include <moveit/move_group_interface/move_group.h>
  3. #include <moveit/planning_scene_interface/planning_scene_interface.h>
  4. #include <moveit_msgs/AttachedCollisionObject.h>
  5. #include <moveit_msgs/CollisionObject.h>
  6.  
  7. int main(int argc, char **argv)
  8. {
  9.     ros::init(argc, argv, "add_collision_objct");
  10.     ros::NodeHandle nh;
  11.     ros::AsyncSpinner spin(1);
  12.     spin.start();
  13.  
  14.     // 创建运动规划的情景,等待创建完成
  15.     moveit::planning_interface::PlanningSceneInterface current_scene;
  16.     sleep(5.0);
  17.  
  18.     // 声明一个障碍物的实例,并且为其设置一个id,方便对其进行操作,该实例会发布到当前的情景实例中
  19.     moveit_msgs::CollisionObject cylinder;
  20.     cylinder.id = "seven_dof_arm_cylinder";
  21.  
  22.     // 设置障碍物的外形、尺寸等属性   
  23.     shape_msgs::SolidPrimitive primitive;
  24.     primitive.type = primitive.CYLINDER;
  25.     primitive.dimensions.resize(3);
  26.     primitive.dimensions[0] = 0.6;
  27.     primitive.dimensions[1] = 0.2;
  28.  
  29.     // 设置障碍物的位置
  30.     geometry_msgs::Pose pose;
  31.     pose.orientation.w = 1.0;
  32.     pose.position.x =  0.0;
  33.     pose.position.y = -0.4;
  34.     pose.position.z =  0.4;
  35.  
  36.     // 将障碍物的属性、位置加入到障碍物的实例中
  37.     cylinder.primitives.push_back(primitive);
  38.     cylinder.primitive_poses.push_back(pose);
  39.     cylinder.operation = cylinder.ADD;
  40.  
  41.     // 创建一个障碍物的列表,把之前创建的障碍物实例加入其中
  42.     std::vector<moveit_msgs::CollisionObject> collision_objects;
  43.     collision_objects.push_back(cylinder);
  44.  
  45.     // 所有障碍物加入列表后(这里只有一个障碍物),再把障碍物加入到当前的情景中,如果要删除障碍物,使用removeCollisionObjects(collision_objects)
  46.     current_scene.addCollisionObjects(collision_objects);
  47.  
  48.     ros::shutdown();
  49.  
  50.     return 0;
  51. }

我们再来编译运行一下,看看会发生什么。

  1. $ roslaunch seven_dof_arm_config demo.launch
  2. $ rosrun seven_dof_arm_test add_collision_objct

   稍等五秒钟,有没有看到,现在界面中多了一个圆柱体。

clip_image008

scene objects中可以对障碍物的属性进行再次调整。

        clip_image010

   障碍物加入之后,再运动机械人的时候,就会检测机器人是否会与障碍物发生碰撞,比如我们用鼠标拖动机器人的终端,让机器人和障碍物发生碰撞:

clip_image012

有没有看到机械臂的部分links变成了红色,这就说明这些links和障碍物发生了碰撞,如果此时进行运动规划,会提示错误的。

clip_image014

上面的代码只是在场景中加入了障碍物,碰撞检测由moveit的插件完成,那么我们如何通过代码来检测是否发生了碰撞呢?可以学习源码包中的 check_collision.cpp

  1. #include <ros/ros.h>
  2. // 包含moveit的API
  3. #include <moveit/robot_model_loader/robot_model_loader.h>
  4. #include <moveit/planning_scene/planning_scene.h>
  5. #include <moveit/kinematic_constraints/utils.h>
  6. #include <eigen_conversions/eigen_msg.h>
  7.  
  8. int main(int argc, char **argv)
  9. {
  10.   ros::init (argc, argv, "arm_kinematics");
  11.   ros::AsyncSpinner spinner(1);
  12.   spinner.start();
  13.  
  14.   // 加载机器人的运动学模型到情景实例中
  15.   robot_model_loader::RobotModelLoader robot_model_loader("robot_description");
  16.   robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();
  17.   planning_scene::PlanningScene planning_scene(kinematic_model);
  18.  
  19.   // 自身碰撞检测
  20.   // 首先需要创建一个碰撞检测的请求对象和响应对象,然后调用碰撞检测的API checkSelfCollision,检测结果会放到collision_result中
  21.   collision_detection::CollisionRequest collision_request;
  22.   collision_detection::CollisionResult collision_result;
  23.   planning_scene.checkSelfCollision(collision_request, collision_result);
  24.   ROS_INFO_STREAM("1. Self collision Test: "<< (collision_result.collision ? "in" : "not in")
  25.                   << " self collision");
  26.  
  27.   // 修改机器人的状态
  28.   // 我们可以使用场景实例的getCurrentStateNonConst()获取当前机器人的状态,然后修改机器人的状态到一个随机的位置,
  29.   // 清零collision_result的结果后再次检测机器人是否发生滋生碰撞
  30.   robot_state::RobotState& current_state = planning_scene.getCurrentStateNonConst();
  31.   current_state.setToRandomPositions();
  32.   collision_result.clear();
  33.   planning_scene.checkSelfCollision(collision_request, collision_result);
  34.   ROS_INFO_STREAM("2. Self collision Test(Change the state): "<< (collision_result.collision ? "in" : "not in"));
  35.  
  36.   // 我们也可以指定查询一个group是否和其他部分发生碰撞,只需要在collision_request中修改group_name属性
  37.   collision_request.group_name = "arm";
  38.   current_state.setToRandomPositions();
  39.   collision_result.clear();
  40.   planning_scene.checkSelfCollision(collision_request, collision_result);
  41.   ROS_INFO_STREAM("3. Self collision Test(In a group): "<< (collision_result.collision ? "in" : "not in"));
  42.  
  43.   // 获取碰撞关系
  44.   // 首先,我们先让机器人发生自身碰撞 
  45.   std::vector<double> joint_values;
  46.   const robot_model::JointModelGroup* joint_model_group =
  47.   current_state.getJointModelGroup("arm");
  48.   current_state.copyJointGroupPositions(joint_model_group, joint_values);
  49.   joint_values[2] = 1.57; //原来的代码这里是joint_values[0],并不会导致碰撞,我改成了joint_values[2],在该状态下机器人会发生碰撞
  50.   current_state.setJointGroupPositions(joint_model_group, joint_values);
  51.   ROS_INFO_STREAM("4. Collision points "
  52.                   << (current_state.satisfiesBounds(joint_model_group) ? "valid" : "not valid"));
  53.  
  54.   // 然后我们再来检测机器人是否发生了自身碰撞,已经发生碰撞的是哪两个部分
  55.   collision_request.contacts = true;
  56.   collision_request.max_contacts = 1000;
  57.   collision_result.clear();
  58.   planning_scene.checkSelfCollision(collision_request, collision_result);
  59.   ROS_INFO_STREAM("5. Self collision Test: "<< (collision_result.collision ? "in" : "not in")
  60.                   << " self collision");
  61.  
  62.   collision_detection::CollisionResult::ContactMap::const_iterator it;
  63.   for(it = collision_result.contacts.begin();
  64.       it != collision_result.contacts.end();
  65.       ++it)
  66.   {
  67.     ROS_INFO("6 . Contact between: %s and %s",
  68.              it->first.first.c_str(),
  69.              it->first.second.c_str());
  70.   }
  71.  
  72.   // 修改允许碰撞矩阵(Allowed Collision Matrix,acm)
  73.   // 我们可以通过修改acm来指定机器人是否检测自身碰撞和与障碍物的碰撞,在不检测的状态下,即使发生碰撞,检测结果也会显示未发生碰撞
  74.   collision_detection::AllowedCollisionMatrix acm = planning_scene.getAllowedCollisionMatrix();
  75.   robot_state::RobotState copied_state = planning_scene.getCurrentState();
  76.   collision_detection::CollisionResult::ContactMap::const_iterator it2;
  77.   for(it2 = collision_result.contacts.begin();
  78.       it2 != collision_result.contacts.end();
  79.       ++it2)
  80.   {
  81.     acm.setEntry(it2->first.first, it2->first.second, true);
  82.   }
  83.   collision_result.clear();
  84.   planning_scene.checkSelfCollision(collision_request, collision_result, copied_state, acm);
  85.  
  86.   ROS_INFO_STREAM("6. Self collision Test after modified ACM: "<< (collision_result.collision ? "in" : "not in")
  87.                   << " self collision");
  88.  
  89.   // 完整的碰撞检测
  90.   // 同时检测自身碰撞和与障碍物的碰撞
  91.   collision_result.clear();
  92.   planning_scene.checkCollision(collision_request, collision_result, copied_state, acm);
  93.  
  94.   ROS_INFO_STREAM("6. Full collision Test: "<< (collision_result.collision ? "in" : "not in")
  95.                   << " collision");
  96.  
  97.   ros::shutdown();
  98.   return 0;
  99. }

编译运行:

  1. $ roslaunch seven_dof_arm_config demo.launch
  2. $ roslaunch seven_dof_arm_test check_collision

     可以看到碰撞检测的结果:

clip_image016

 

  更多MoveIt API的使用例程还可以参考下边的链接:

http://docs.ros.org/indigo/api/pr2_moveit_tutorials/html/planning/src/doc/move_group_interface_tutorial.html

 

  还有MoveIt interfaceClass文档:

http://docs.ros.org/indigo/api/moveit_ros_planning_interface/html/classmoveit_1_1planning__interface_1_1MoveGroup.html


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS探索总结(二十六)——MoveIt编程

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin

评论

288条评论
  1. Gravatar 头像

    nick 回复

    大神,我按照博客中的介绍测试test_random.cpp,编译的时候出错:
    Built target tf_listener
    [100%] Building CXX object test_movit/src/seven_dof_arm_test/CMakeFiles/test_random.dir/src/test_random.cpp.o
    Linking CXX executable /home/tea/work/ros_exploring/devel/lib/seven_dof_arm_test/test_random
    /opt/ros/indigo/lib/libgeometric_shapes.so: undefined reference to `Assimp::Importer::SetPropertyInteger(char const*, int, bool*)'
    collect2: error: ld returned 1 exit status
    make[2]: *** [/home/tea/work/ros_exploring/devel/lib/seven_dof_arm_test/test_random] Error 1
    make[1]: *** [test_movit/src/seven_dof_arm_test/CMakeFiles/test_random.dir/all] Error 2
    make: *** [all] Error 2
    请问是什么原因?困扰我几天了,没找到问题原因。

  2. Gravatar 头像

    洋洋 回复

    古月老师您好我执行了你的check_collision.cpp。等一些C++文件都会出现这样的错误不知道为什么
    `int main(int argc, char **argv)'未预期的符号 `(' 附近有语法错误

  3. Gravatar 头像

    启明 回复

    你好,我在爱慕课中看了你《ROS机械臂开发实战》请问您可以提供关节空间运动规划的Python对应的C++编码吗?我自己尝试了把Python转成c++,没成功。

    • Gravatar 头像

      启明 回复

      @启明 import rospy, sys
      import moveit_commander
      from control_msgs.msg import GripperCommand

      class MoveItFkDemo:
      def __init__(self):
      # 初始化move_group的API
      moveit_commander.roscpp_initialize(sys.argv)

      # 初始化ROS节点
      rospy.init_node('moveit_fk_demo', anonymous=True)

      # 初始化需要使用move group控制的机械臂中的arm group
      arm = moveit_commander.MoveGroupCommander('arm')

      # 初始化需要使用move group控制的机械臂中的gripper group
      gripper = moveit_commander.MoveGroupCommander('gripper')

      # 设置机械臂和夹爪的允许误差值
      arm.set_goal_joint_tolerance(0.001)
      gripper.set_goal_joint_tolerance(0.001)

      # 控制机械臂先回到初始化位置
      arm.set_named_target('home')
      arm.go()
      rospy.sleep(2)

      # 设置夹爪的目标位置,并控制夹爪运动
      gripper.set_joint_value_target([0.01])
      gripper.go()
      rospy.sleep(1)

      # 设置机械臂的目标位置,使用六轴的位置数据进行描述(单位:弧度)
      joint_positions = [-0.0867, -1.274, 0.02832, 0.0820, -1.273, -0.003]
      arm.set_joint_value_target(joint_positions)

      # 控制机械臂完成运动
      arm.go()
      rospy.sleep(1)

      # 关闭并退出moveit
      moveit_commander.roscpp_shutdown()
      moveit_commander.os._exit(0)

      if __name__ == "__main__":
      try:
      MoveItFkDemo()
      except rospy.ROSInterruptException:
      pass

    • 古月

      古月 回复

      @启明 这里有使用c++编程的示例,可以参考其中的例程修改:https://github.com/huchunxu/ros_exploring/tree/master/robot_marm/marm_planning/src

      • Gravatar 头像

        启明 回复

        @古月 你好,
        我看了src下面的C++代码,跟mastering ros书是相似的代码。不过看了这些代码后并尝试把你的Python转成C++,依然失败编译不过。请问老师可以在博客中提供下C++的吗?

  4. Gravatar 头像

    进击的苏联 回复

    古月老师好 我在原来用深蓝学院看过您的课程 现在用我自己导入的模型做gazebo和rviz仿真总是会出现 Action client not connected: arm/arm_joint_controller/joint_trajectory_action 请问应该在哪里查看action_ns的名称

      • Gravatar 头像

        进击的苏联 回复

        @古月 已经全部安装os_control和ros_controllers,还是有一样的问题。
        现在请教老师,以您上课所做的例程marm为例,controller.yaml是一个插头,那么插座是哪个文件呢?

        • 古月

          古月 回复

          @进击的苏联 插座是gazebo这端的controller配置,也就是在启动gazeobo时,由ros_control加载的插件,检查下这一端的配置文件,有没有正确配置

          • Gravatar 头像

            进击的苏联 回复

            @古月 请说的具体一点 以您的例程marm_gazebo为例,gazebo的ros control文件在哪里

              • Gravatar 头像

                进击的苏联 回复

                @古月 古月老师 您可能没有明白我的意思 我指的是在您的marm例程中 若controllers.yaml为插头,与其配对的插座是那个文件,至今没有找到arm/arm_joint_controller/follow_joint_trajectory配对的命名空间服务端

              • Gravatar 头像

                进击的苏联 回复

                @古月 多谢古月老师 已经解决是urdf文件中transmission没加的缘故,多谢指点

  5. Gravatar 头像

    进击的苏联 回复

    古月老师您好 我曾参加过深蓝学院的课程受益匪浅 现在用solidworks自己的模型导入到moveit并在rviz+gazebo联合中出现了错误如下:
    [ERROR] [1536194192.527982665, 17.031000000]: Action client not connected: arm/arm_joint_controller/follow_joint_trajectory
    参考资料显示应该是action_ns没有设置正确 请问怎么查看

  6. Gravatar 头像

    李梅 回复

    古月老师,请问moveit规划的轨迹点数目是怎么设置的,可以自己配置吗?

    • 古月

      古月 回复

      @李梅 可以自己设定轨迹点的最大数目,我记得有一个adepter可以实现,需要在launch里边设置

  7. Gravatar 头像

    scliu 回复

    古月老师您好,有个问题想请教您一下,moveit在规划的时候都会调用OMPL库吗,有的时候在没有障碍物的情况下,机械臂是可以直接运动到目标关节位置的,调用OMPL会浪费更多的时间,并且可能会失败,有没有哪个函数是不调用OMPL的呀;还有一个问题就是,我能够直接从moveit中获取到逆运动学的解吗,我改用了IKfast插件,应该能计算出很多组解,要怎么直接在moveit的函数中调用出来呢

    • 古月

      古月 回复

      @scliu 1. moveit做运动规划会调用OMPL,如果没有障碍物,计算也很快,应该不会浪费时间,一般失败的原因是运动学求解器的问题
      2. IKfast有自己的函数调用,看下它的源码,可以得到所有算出来的解

      • Gravatar 头像

        scliu 回复

        @古月 谢谢老师的回复,还想问一下您,moveit中有很多函数好像没有绑定到Python,比如处理生成的轨迹,只有用C++程序来写。我现在想让机械臂能够按原轨迹返回,不再重新规划,就是将轨迹列表倒置一下,但是在Python中好像没有办法处理时间戳的问题。并且原轨迹的时间戳我也不大理解,有一个当前时间(secs)和持续时间(nsecs),当前时间是整数序列,而持续时间是一个很大的整数,我不大明白这当中的原理。

        • 古月

          古月 回复

          @scliu 不会呀,python一样可以处理轨迹,轨迹就是一个数据结构,用哪种语言都可以修改,时间戳是指机械臂运动到这个轨迹点的时刻,secs+nsecs组成了一个时刻

        • Gravatar 头像

          李梅 回复

          @scliu 古月老师,请问moveit规划的轨迹点数目是怎么确定的呢,可以自己设定数目吗?

          • 古月

            古月 回复

            @李梅 可以自己设定轨迹点的最大数目,我记得有一个adepter可以实现,需要在launch里边设置

  8. Gravatar 头像

    烤鸡排 回复

    古月老师,请问一下,如何在rviz里面记录2个点,然后在这2个点之间运动,然后与实物连接,,并使得实物也在这2个点之间运动呢?我现在已经实现了ros对于机械臂实物的控制,就差2个点之间运动

    • 古月

      古月 回复

      @烤鸡排 在rviz中打开tf,可以看到机械臂的实时位姿,然后记录两个点,写到程序里

  9. Gravatar 头像

    颜chen 回复

    老师,我在gazebo里面配置的障碍这些,如何导入到rviz里面进行运动规划呢,gazebo保存出来的就只有一个sdf和config.

    • 古月

      古月 回复

      @颜chen 可以仿真一个kinect,采集外界环境,加入到运动规划中

      • Gravatar 头像

        yanchen 回复

        @古月 古月老师,按照您的这个步骤加入障碍物,scene objects中可以对障碍物的属性进行再次调整,是如何在rviz界面调整大小和位置的呢,我导入进去并没有交互式光圈显示

        • 古月

          古月 回复

          @yanchen 位置调整就是通过交互箭头来调整的,大小可以在左侧的标签页里调整

          • Gravatar 头像

            yanchen 回复

            @古月 古月老师,还想请教一下FCL碰撞检测库是如何调用的呢,在网上都没有找到相关资料,非常感谢悉心指导

            • 古月

              古月 回复

              @yanchen 加入障碍物后,运动规划中会自动调用fcl做检测。手动调用的话需要看fcl的api

              • Gravatar 头像

                yanchen 回复

                @古月 古月老师,要想实现机械臂末端按指定运动路径运动,并且在目标位置保持姿态不变,可以怎样实现呢,有点摸不着头脑,还望指点一二

                • 古月

                  古月 回复

                  @yanchen 将指定路径拆分成一系列路径点,生成一条ROS中的trajectory,再使用ROS的execute接口进行执行

  10. Gravatar 头像

    廖亮 回复

    古月老师您好,我在使用moveit!setup assistant生成一个ur5+barret夹爪的双臂模型的配置文件后不知道为什么只能控制其中的一只机械臂,另一只机械臂的模型存在但是不能控制(双臂的设置都是镜像的),不知道您是否知道是什么原因?

    • 古月

      古月 回复

      @廖亮 双臂应该需要配置两个group,控制的时候也要选择相应的group

      • Gravatar 头像

        廖亮 回复

        @古月 谢谢老师,我昨天已经从其他地方发现了这一点,解决了这个问题。不过我现在还有一个问题,ros的插件库(比如KDL)的具体代码实现不知道是不是lib里面的.so文件还是在其他的那个位置,我怎样才可以查看呢

  11. Gravatar 头像

    任承锦 回复

    您好!古老师,我想用moveit 代码实现碰撞检测,具体就是通过代码实现在planning_scene::PlanningScene对象中添加两个机器人模型,然后用此对象进行环境中碰撞检测,不知道该用什么样的接口,您有办法实现这个吗?我知道可以用以下代码实现往planning_scene::PlanningScene对象中添加一个机器人模型,但是却不知道如何添加两个机器人模型,用于两个机械臂协同避障。
    robot_model_loader::RobotModelLoader robot_model_loader("robot_description");
    robot_model::RobotModelPtr kinematic_model = robot_model_loader.getModel();
    planning_scene::PlanningScene planning_scene(kinematic_model);

    • 古月

      古月 回复

      @任承锦 这个接口调用两次不就可以添加两个模型了么,注意robot_description这个参数是不能重名的,两个机器人不能都用这一个参数,需要改个名字。

      • Gravatar 头像

        任承锦 回复

        @古月 哦,谢谢指导,但是最终是要调用planning_scene.checkCollision这个接口来完成碰撞检测,我的意思是在这个planning_scene::PlanningScene对象中添加两个机器人模型,一个机器人模型采用以上方法添加,另一个机器人模型以环境物体的身份添加进去,然后调用planning_scene.checkCollision这个接口来进行环境碰撞检测,有方法实现吗?古老师

  12. Gravatar 头像

    lh 回复

    老师,请问如何将在三维建模软件中画的图作为碰撞检测的对象,可以像urdf文件那样直接导入STL模型吗,如果可以的话怎么导入,谢谢您

    • Gravatar 头像

      lh 回复

      @lh .scene文件也不知道如何编写?一堆数字也不知道什么意思。。。

    • 古月

      古月 回复

      @lh 可以呀,和导出机器人模型一样,solidworks中的模型可以导出成urdf,然后集成到ROS里就可以了。

      • Gravatar 头像

        lh 回复

        @古月 恩恩,谢谢老师,麻烦问您一下怎么集成呢?是写入URDF文件中吗?另外scene文件导入也可生成,但是不知道scene文件如何编写。。。

        • 古月

          古月 回复

          @lh 可以写入urdf文件,也可以做成单独的dae文件,通过scene导入,如果是简单的模型的话,也可以编程实现,通过scene接口导入

  13. Gravatar 头像

    leslie 回复

    老师,我给定末端位姿,求解器求不出来,请问有什么办法吗?

  14. Gravatar 头像

    莫波 回复

    古老师,你好!不好意思,又得打扰您了。
    我想用moveit编程控制真实的机械手,moveit做好运动规划之后,计算出的一系列坐标等怎样送到ros控制器中。moveit规划好的坐标轨迹存放在那个地方啊,谢谢。

    • 古月

      古月 回复

      @莫波 moveit和控制器之间的接口是follow_joint_trajectory这个action,在控制器里要接收这个action里边的轨迹数据。

  15. Gravatar 头像

    z 回复

    古老师,您好!我的系统的Ubuntu14.04,我编译代码的时候出现 fatal error: moveit/move_group_interface/move_group_interface.h: 没有那个文件或目录 我已经sudo apt-get install ros-indigo-moveit-full安装了moveit,并且也source过了,还是出这个错误,有劳您给解答一下

    • Gravatar 头像

      mo 回复

      @z 菜鸟来回答,可以依次打开/opt/ros/indigo/include/moveit/move_group_interface目录,在该目录下只有一个move_group.h文件,是不是包含路径应该改为“moveit/move_group_interface/move_group.h”。非专业,仅供参考。

    • 古月

      古月 回复

      @z 检查一下cmakelists里边设置依赖包没,然后看下indigo版本下的头文件是不是叫这个名字,版本不同moveit的API有一点变化

  16. Gravatar 头像

    找申申 回复

    古月大神你好,我在学习了这部分教程的时候出现了以下的问题,-- Could not find the required component 'seven_robot'. The following CMake error indicates that you either need to install the package with the same name or change your environment so that it can be found.
    CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
    Could not find a package configuration file provided by "seven_robot" with
    any of the following names:

    seven_robotConfig.cmake
    seven_robot-config.cmake

    Add the installation prefix of "seven_robot" to CMAKE_PREFIX_PATH or set
    "seven_robot_DIR" to a directory containing one of the above files. If
    "seven_robot" provides a separate development package or SDK, be sure it
    has been installed.
    Call Stack (most recent call first):
    catkin_create_pkg/CMakeLists.txt:10 (find_package)

    -- Configuring incomplete, errors occurred!
    See also "/home/zhaoshenshen/catkin_ws/build/CMakeFiles/CMakeOutput.log".
    See also "/home/zhaoshenshen/catkin_ws/build/CMakeFiles/CMakeError.log".
    Invoking "cmake" failed
    我之前建立了一个seven_robot的包,后来我把它删了,等我再编译其他的时候就出现了这个问题,不知道是不是之前编译的时候哪里出错了,产生了错误的文件,现在很麻烦不知道怎么删除,求大神能够解答

  17. Gravatar 头像

    孤狼 回复

    古大神您好,想请教您一下,除了用上述C++方法实现机器人运动到固定位姿外,可不可以设计其进行重复运动?比如手臂的来回运动或者类似于摇手指的运动?如果可以,有什么资料可以参考吗?谢谢您的回答!!

    • 古月

      古月 回复

      @孤狼 可以实现的,就在两个位姿之间来回运动就可以了吧。没有现成的代码可以直接用,先看几本英文教材中关于moveit的编程方法,然后自己尝试使用API,可能还要参考官方的API文档

  18. Gravatar 头像

    莫波 回复

    古月大神,你好!我现在对ROS整体框架和工作模式已经了解,但在计划开工设计软件时,发现根本下不了手,个人分析主要原因是对ros了解不够深入,API函数等基本没了解,需要把官方api函数都了解一遍吧。请问能够提供一下从了解ros到开发应用ros的一些经验吗?谢谢。

    • 古月

      古月 回复

      @莫波 现在有很多英文教程了,先找一本书,比如《ROS by example》,照着书上的例程先做,然后看例程的实现原理,再应用到自己的工作上。

  19. Gravatar 头像

    宾客斯的美酒 回复

    古月老师,您好:
    一直看您的blog,受益良多,冒昧向您请教一个问题:
    (1) 我正在使用Ubuntu 16.04+ROS kinetic Moveit做一个机器人运动规划的课题。使用SolidWork SW2URDF插件制作的机器人URDF,使用Moveit_setup_assitant做的配置,但是在roslaunch demo.launch时,虽然Rviz可以打开并显示机器人模型,Moveit Rviz插件也能打开,但是总是出现以下错误,而且Rviz报错"No planning library loaded",无法进行机器人运动规划。
    (2)奇怪的是,在只有这个机器人相关package(机器人URDF包+机器人Moveit配置包)的情况下,一切都是正常的,Moveit和Rviz都能正常打开,也能正常规划。但是只要我向catkin_ws工作空间内添加其他package(package没有任何实质内容,只是单纯的使用catkin_create_pkg指令创建了一个包而已,没有写任何节点、代码或者其他的东西),上述的问题就会出现,我已经试过很多遍了,都是同样的结果。
    (3)另外,相同的包和配置,在Ubuntu 14.04+ROS Indigo下可以正常运行,Rviz和Moveit也都正常,也能在同一个工作空间下创建其他的package。
    (4)我开始以为是我的通过Solidworks制作的机器人模型比较复杂,或者计算机配置不足,就把一些无关的机器人零件删掉了,机器人模型大概8M左右,电脑配置为Core i5+8G内存,还是出现同样的问题。
    上面的问题已经困扰我一段时间了,希望能得到您的指教,如何可以的话,方便留下您的邮箱,我把相关的机器人package发给您。

    NODES
    /
    joint_state_publisher (joint_state_publisher/joint_state_publisher)
    move_group (moveit_ros_move_group/move_group)
    robot_state_publisher (robot_state_publisher/robot_state_publisher)
    rviz_ubuntu_3530_2366911891124509505 (rviz/rviz)

    auto-starting new master
    process[master]: started with pid [3540]
    ROS_MASTER_URI=http://localhost:11311

    setting /run_id to c0285280-3d54-11e8-b1ca-000c2932e7b0
    process[rosout-1]: started with pid [3553]
    started core service [/rosout]
    process[joint_state_publisher-2]: started with pid [3570]
    process[robot_state_publisher-3]: started with pid [3571]
    process[move_group-4]: started with pid [3572]
    process[rviz_ubuntu_3530_2366911891124509505-5]: started with pid [3587]
    [ INFO] [1523429485.571934196]: Loading robot model 'robot_dof9'...
    [ INFO] [1523429485.764394738]: rviz version 1.12.15
    [ INFO] [1523429485.767893598]: compiled against Qt version 5.5.1
    [ INFO] [1523429485.767948744]: compiled against OGRE version 1.9.0 (Ghadamon)
    [ INFO] [1523429486.230972792]: Stereo is NOT SUPPORTED
    [ INFO] [1523429486.234083818]: OpenGl version: 2.1 (GLSL 1.2).
    [ INFO] [1523429487.616720930]: Loading robot model 'robot_dof9'...
    [ INFO] [1523429488.955486638]: Loading robot model 'robot_dof9'...
    [ INFO] [1523429490.071127916]: Loading robot model 'robot_dof9'...
    [ INFO] [1523429491.372616043]: Loading robot model 'robot_dof9'...
    [ INFO] [1523429493.779129495]: Loading robot model 'robot_dof9'...
    [ INFO] [1523429496.093362397]: Publishing maintained planning scene on 'monitored_planning_scene'
    [ INFO] [1523429496.101358087]: MoveGroup debug mode is ON
    Starting context monitors...
    [ INFO] [1523429496.101450658]: Starting scene monitor
    [ INFO] [1523429496.111786585]: Listening to '/planning_scene'
    [ INFO] [1523429496.111903269]: Starting world geometry monitor
    [ INFO] [1523429496.120087891]: Listening to '/collision_object' using message notifier with target frame '/base_link '
    [ INFO] [1523429496.133083615]: Listening to '/planning_scene_world' for planning scene world geometry
    [ INFO] [1523429497.119866074]: Loading robot model 'robot_dof9'...
    [ INFO] [1523429500.336805481]: Loading robot model 'robot_dof9'...
    [ INFO] [1523429505.207010881]: Starting scene monitor
    [ INFO] [1523429505.214727827]: Listening to '/move_group/monitored_planning_scene'
    [ INFO] [1523429505.220116113]: waitForService: Service [/get_planning_scene] has not been advertised, waiting...
    [ INFO] [1523429510.224126806]: Failed to call service get_planning_scene, have you launched move_group? at /home/user/catkin_src/src/moveit/moveit/moveit_ros/planning/planning_scene_monitor/src/planning_scene_monitor.cpp:486
    [ INFO] [1523429511.333957921]: Constructing new MoveGroup connection for group 'group_dof9' in namespace ''
    [ERROR] [1523429541.347335769]: Unable to connect to move_group action server 'move_group' within allotted time (30s)
    [ WARN] [1523429541.352752253]: Interactive marker 'EE:goal_link_actor' contains unnormalized quaternions. This warning will only be output once but may be true for others; enable DEBUG messages for ros.rviz.quaternions to see more details.
    [ WARN] [1523429562.046457859]: It is likely there are too many vertices in collision geometry
    [ INFO] [1523429726.243362012]: Constructing new MoveGroup connection for group 'group_dof7' in namespace ''
    [ERROR] [1523429756.253461965]: Unable to connect to move_group action server 'move_group' within allotted time (30s)

      • Gravatar 头像

        mz 回复

        @古月 古月老师,您好,我遇到了同样的问题,不知道这个问题您是否有解决办法,求提示,谢谢。

        • 古月

          古月 回复

          @mz 可能是moveit没装好,重装试一下,有没有错误信息?

          • Gravatar 头像

            mz 回复

            @古月 谢谢古月老师的回复,我把原来的工作空间删除了,重新建了一个空间,后来就没有出问题,没法再复现问题,也没有找到问题的原因,moveit的安装应该是正常的。

  20. Gravatar 头像

    李浩 回复

    古老师您好,看了您很多的博客,觉得受益匪浅。想请教您一下,关于单线程spin()和多线程spin()的应用除了上述的以外还有没有其他具体的例子呢?谢谢您!

      • Gravatar 头像

        李浩 回复

        @古月 谢谢老师的回答,很有帮助。还有一个问题:像上述的固定位姿,您提到可以用一个move()来代替plan()和execute(),可以麻烦您给个例子吗?感激不尽!

        • 古月

          古月 回复

          @李浩 我记不清是move()还是go()了,但肯定是有一个接口可以包含这两个功能的。参考《ROS by example 2》和《Mastering ROS for Robotics Programming》书里的例程

          • Gravatar 头像

            李浩 回复

            @古月 嗯嗯 好的,今天跑了一下,能正确运行了。还想请教一个,我看了一些moveit API的更多应用,有一个SetStartState()的函数想请教一下怎么使用?是写在我的控制固定位姿运行的cpp文件里面还是别的文件里面?谢谢!

            • 古月

              古月 回复

              @李浩 这个就是设置运动的起始状态,在运动规划之前调用就行了

  21. Gravatar 头像

    胡晏豪 回复

    古老师您好,谢谢您之前的回答,不好意思频繁来打扰。想请教您一下,我现在基于我之前的一个三指机械爪,加了两个手指,做成了五指机械手。然后用moveit生成了文件,demo可以运行,但是我利用motionplanning的插件运行随机位置却一直弹出如下信息:
    Error: RRTConnect: Insufficient states in sampleable goal region
    at line 178 in /tmp/binarydeb/ros-kinetic-ompl-1.2.1/src/ompl/geometric/planners/rrt/src/RRTConnect.cpp
    Warning: ParallelPlan::solve(): Unable to find solution by any of the threads in 0.001421 seconds
    at line 131 in /tmp/binarydeb/ros-kinetic-ompl-1.2.1/src/ompl/tools/multiplan/src/ParallelPlan.cpp
    Debug: RRTConnect: Planner range detected to be 4.020320
    Debug: RRTConnect: Planner range detected to be 4.020320
    Debug: ParallelPlan.solveMore: starting planner RRTConnect
    Error: RRTConnect: Insufficient states in sampleable goal region
    at line 178 in /tmp/binarydeb/ros-kinetic-ompl-1.2.1/src/ompl/geometric/planners/rrt/src/RRTConnect.cpp
    Debug: ParallelPlan.solveMore: starting planner RRTConnect
    Error: RRTConnect: Insufficient states in sampleable goal region
    at line 178 in /tmp/binarydeb/ros-kinetic-ompl-1.2.1/src/ompl/geometric/planners/rrt/src/RRTConnect.cpp
    Warning: ParallelPlan::solve(): Unable to find solution by any of the threads in 0.000657 seconds
    at line 131 in /tmp/binarydeb/ros-kinetic-ompl-1.2.1/src/ompl/tools/multiplan/src/ParallelPlan.cpp
    [ INFO] [1522723190.089910165]: Unable to solve the planning problem
    [ WARN] [1522723190.152165834]: Fail: ABORTED: No motion plan found. No execution attempted.
    即使更换运动学插件也不行,之前运行三指机械爪的时候从来没出现过这样的情况,想请教您一下这是为什么?感谢您!

    • 古月

      古月 回复

      @胡晏豪 看提示就是运动学求解不出来导致的,换成fastik或者tracik试试

      • Gravatar 头像

        胡晏豪 回复

        @古月 那为啥之前三个手指的时候就可以跑啊?有点想不通

        • 古月

          古月 回复

          @胡晏豪 这个我也不清楚了,看错误提示是类似的问题,运动关节增多了?

          • Gravatar 头像

            胡晏豪 回复

            @古月 增加了两个手指。下午我用tracik跑了一下,出现了两个问题:
            1、我把每个手指设成了一个group,但是无论怎样motionplanning都只能跑其中一个,别的都失败
            2、出现了下面那个叫“汪洋”的同学一样的问题:程序控制随机运动可以实现,但是固定位置就不行。
            这是为什么呢?还请老师解答。

            • 古月

              古月 回复

              @胡晏豪 是不是还是提示规划失败,moveit这个很头疼,ik求解的范围太小了,ROS还是一个不太成熟的工具,不能太依赖它,核心的部分最好还是自己开发

              • Gravatar 头像

                胡晏豪 回复

                @古月 老师,您好,5个手指的机械手全部能规划并执行成功了。但是我是把每个手指设成了一个组,用5段程序(参考了您机械臂的test_custom)分别控制。想请教您可不可以把5段程序合在一起呢?

                • 古月

                  古月 回复

                  @胡晏豪 同一个程序里边是可以控制多个组的,每个组的名字不一样就行

                  • Gravatar 头像

                    胡晏豪 回复

                    @古月 嗯嗯,昨天跑了一下,成功了。还有一个小问题:程序运行完以后,在终端输入ctrl+c中断后,手指仍然在运动,有什么办法让它停下来吗?

                    • 古月

                      古月

                      @胡晏豪 这是action,需要在中断之前,发送一个cancel信号

                  • Gravatar 头像

                    胡晏豪 回复

                    @古月 谢谢老师的回答,想问问关于发送cancel信号有没有什么资料可以参考呢?谢谢

                    • 古月

                      古月

                      @胡晏豪 谷歌找action的使用方法,应该有的

                  • Gravatar 头像

                    胡晏豪 回复

                    @古月 老师可能我没描述清楚,是程序运行到最后一根手指的时候,即使ctrl+c中断了,最后那根手指仍然是有规划的痕迹,只有点击Rviz的reset以后才会显示出最终结果,也是这个原因吗?

                    • 古月

                      古月

                      @胡晏豪 那你这个应该是rviz的配置问题,默认会不断显示规划出来的轨迹的,在rviz左侧的属性中有选项可以关掉重复显示

                  • Gravatar 头像

                    胡晏豪 回复

                    @古月 确实是rviz的问题,问题已解决,谢谢老师的指点

  22. Gravatar 头像

    杨天 回复

    古老师您好,在moveit的使用方面有个问题请教您,是不是只有xacro格式的文件才能规划成功?我今天用我自己的urdf文件利用moveit设置了一遍,但运行demo的时候一直报move_group die,这是为什么呢?谢谢!

  23. Gravatar 头像

    高颜 回复

    古月老师,你好,我现在学习Pr2_tutorial(创客智造中的例子:https://www.ncnynl.com/archives/201610/1038.html),但在运行planning_pipeline_tutorial.launch时,出现问题:由于问题日志较长截取一部分:
    [ INFO] [1522397827.856407830]: Constructing new MoveGroup connection for group 'right_arm' in namespace ''
    [ERROR] [1522397837.613101545]: Found empty JointState message
    [ERROR] [1522397837.613273641]: Found empty JointState message
    [ERROR] [1522397837.613631590]: Found empty JointState message
    [ERROR] [1522397837.615004887]: Found empty JointState message
    [ INFO] [1522397837.615109037]: The timeout for planning must be positive (0.000000 specified). Assuming one second instead.
    [ INFO] [1522397837.616051450]: No planner specified. Using default.
    [ INFO] [1522397837.662183906]: RRTConnect: Starting planning with 1 states already in datastructure
    [ INFO] [1522397837.705904302]: RRTConnect: Created 4 states (2 start + 2 goal)
    [ INFO] [1522397837.705988748]: Solution found in 0.044177 seconds
    [ INFO] [1522397837.718358361]: SimpleSetup: Path simplification took 0.012149 seconds and changed from 3 to 2 states
    [ INFO] [1522397837.736528651]: Visualizing the trajectory
    [ERROR] [1522397857.737850197]: Found empty JointState message
    [ERROR] [1522397857.737976362]: Found empty JointState message
    [ERROR] [1522397857.738396922]: Found empty JointState message
    [ERROR] [1522397857.738826884]: Found empty JointState message
    [ INFO] [1522397857.738858923]: The timeout for planning must be positive (0.000000 specified). Assuming one second instead.
    [ INFO] [1522397857.739287426]: No planner specified. Using default.
    [ INFO] [1522397857.739499339]: RRTConnect: Starting planning with 1 states already in datastructure
    [ INFO] [1522397857.758244359]: RRTConnect: Created 5 states (2 start + 3 goal)
    [ INFO] [1522397857.758359108]: Solution found in 0.019012 seconds
    [ INFO] [1522397857.767289573]: SimpleSetup: Path simplification took 0.008868 seconds and changed from 4 to 2 states
    [ INFO] [1522397857.789019627]: Visualizing the trajectory
    [ERROR] [1522397857.879466023]: Unable to connect to move_group action server 'move_group' within allotted time (30s)
    [ERROR] [1522397877.790174247]: Found empty JointState message
    [ INFO] [1522397877.790367179]: Starting state is just outside bounds (joint 'r_shoulder_pan_joint'). Assuming within bounds.
    [ INFO] [1522397877.791490204]: The timeout for planning must be positive (0.000000 specified). Assuming one second instead.
    [ INFO] [1522397877.791927687]: RRTConnect: Starting planning with 1 states already in datastructure
    [ INFO] [1522397877.814234127]: RRTConnect: Created 5 states (2 start + 3 goal)
    [ INFO] [1522397877.814278433]: Solution found in 0.022499 seconds
    [ INFO] [1522397877.819024978]: SimpleSetup: Path simplification took 0.004680 seconds and changed from 4 to 2 states
    [ INFO] [1522397877.821458676]: Planning adapters have added states at index positions: [ 0 ]
    [ INFO] [1522397877.826809644]: Visualizing the trajectory
    [ INFO] [1522397897.827821156]: Done

    在rviz中,planning library 也没有加载规划器: NO PLANNIG LIVRARY LOADER
    这个问题困扰了几天了,望古月老师详细解答一下,自己接触MOVEit时间较短

    • 古月

      古月 回复

      @高颜 你用的是Kinetic版本么?我搜到这好像是kinetic下的问题,是否会影响使用?参考:https://answers.ros.org/question/266274/moveit-regression-found-empty-jointstate-message/

      • Gravatar 头像

        高颜 回复

        @古月 古月老师,很抱歉因为一些事情,没能及时回复您,在您网站向您提问许多次,您都耐心回答,非常感谢您,我研究生课题是ROS的轨迹规划,还得多向您请教:
        1.我用的是indigo版本(源码moveit_tutorials-indigo-devel),我又查找了许多资料还是没能解决问题,我把moveit_tutorials-kinetic的代码在kinetic上运行还是出现上述问题,换了一台电脑运行还是出现相同问题;
        2.我的目标是通过机械臂完成轨迹规划,暂时想得到:positions: [7.498824743379373e-06, 0.00014502150588668883, 0.00016246525046881288, 0.000576882332097739, -4.5179829612607136e-05, -7.556870696134865e-05]
        velocities: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
        accelerations: [1.6636165814011838, 0.0, 0.0, 0.0, 0.0, 0.0]
        但是不知道怎么用AddTimeParameterization,在网上找到的唯一例程(https://www.ncnynl.com/archives/201610/1037.html)还不能使用产生一些问题(上面提到的问题),老师能给我一些建议或怎样实现这个目标,还有古老师能给于ROS管道等这方面的一些资料吗,万分感谢(425072383@qq.com);
        3.在利用机械臂做轨迹规划的过程中产生了一个问题,前面利用move_group可以让机械臂在关节、笛卡尔空间进行规划运动,和利用管道进行规划有什么区别,只是管道是加入了速度加速度时间的区别吗?

        • 古月

          古月 回复

          @高颜 1. 那就不太清楚这个问题了
          2. AddTimeParameterization的相关资料很少,只能看源码和源码中的单元测试,再参考一下这个:https://github.com/ros-planning/moveit_core/issues/141
          3. 你所说的管道是pipeline么?如果是的话,这个是指moveit运动规划的流程,先规划轨迹,再添加速度、加速度、时间的信息

  24. Gravatar 头像

    ekobe 回复

    你好 我想请教以下你是怎么修改的,,我也是kinetic,按照古月老师上面的程序修改了,但是在编译的时候还是失败 。我看错位是依赖项有问题。但是改了几次都没有效果 想请教以下你是怎么修改的

    • 古月

      古月 回复

      @ekobe 哪里编译错误?主要是头文件和API,看下错误提示

  25. Gravatar 头像

    汪洋 回复

    古老师,您好。我现在在做一个3指机器人手的控制,主要控制手指关节这样。按照您上面的程序做了一下,主要有两个问题:
    1、像这种带手指机器手,我用moveit设置的时候,是应该每个手指设为一个组,还是整个手设置为一个组?
    2、现在发现随机位置random的程序是可以动的,但是我想跑带目标的程序,就动不了了,这是为什么呢?

    • 古月

      古月 回复

      @汪洋 1. 整个手是一个组就可以
      2. 看下终端有没有错误调试?目标点是否在运动范围?

      • Gravatar 头像

        汪洋 回复

        @古月 最后给我的消息是:Unable to sample any valid states for goal tree,这是不是没有在目标范围内呢?我是先运行的模型的urdf文件,通过TF找到关节的position和orientation。然后再输入我的cpp文件运行demo。launch,这样找坐标有什么问题吗?

        • 古月

          古月 回复

          @汪洋 这样也没办法确定问题所在,请参考:https://github.com/ros-planning/moveit/issues/343

          • Gravatar 头像

            汪洋 回复

            @古月 会不会是运动学插件的问题?

            • 古月

              古月 回复

              @汪洋 有可能,ROS中的默认运行学插件效果不太好

              • Gravatar 头像

                汪洋 回复

                @古月 古老师,关于fastik运动学插件,可以给个教程的链接吗,换来试试,谢谢您

                • 古月

                  古月 回复

                  @汪洋 请参考:http://wiki.ros.org/Industrial/Tutorials/Create_a_Fast_IK_Solution

                  • Gravatar 头像

                    汪洋 回复

                    @古月 老师我的ROS是kinetic的,安装好像有点问题,老是说找不到软件包,有关于kinetic版本的Ikfast安装链接吗?

                    • 古月

                      古月

                      @汪洋 没有kinetic版本的,只有那一个链接

  26. Gravatar 头像

    高颜 回复

    古老师,你好,首先感谢你回答了我的问题,在学习moveit的过程中,我现在遇到两个问题,
    1.我自己建了一个模型加入到moveit中,在我运行test_custom.cpp时,想设置一个有效的位置姿态,试了好多姿态,应该都不符合运动学,有什么方法找到所建模型有效的姿态,怎么验证所找位姿的运动学是否正确。
    2.我看到下边评论也遇到了这个问题,moveit中有个position_only_ik,可以不用设置姿态,我去他所给的网站看了,但是没有程序例子,只有在kinematics.yaml文件中添加position_only_ik: True。我自己把姿态去掉,只保留位置,还是出现[ WARN] [1522077029.828772260]: Fail: ABORTED: No motion plan found. No execution attempted. 古老师能具体说下怎么用吗?

    • 古月

      古月 回复

      @高颜 1. moveit默认使用的运动学插件是经常计算不出来,这个跟运动学插件的实现有关,可以用fastik或tracik,成功率高很多。
      2. position_only_ik导致的规划失败,应该还是和运动学计算有关,和上边的问题差不多

  27. Gravatar 头像

    胡晏豪 回复

    古老师,又是我...我在尝试那个按照规划的目标运动的程序,按照网上的一些博客做了修改的,编译已经成功了但是跑不起来。后半段程序如下
    moveit::planning_interface::MoveGroup::Plan my_plan;
    bool success = (group.plan(my_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS);

    ROS_INFO("Visualizing plan 1 (pose goal) %s",success?"":"FAILED");
    if(success)
    group.execute(my_plan);
    ros::shutdown();
    return 0;
    }麻烦您看看是不是哪里有问题?

      • Gravatar 头像

        胡晏豪 回复

        @古月 昨天调试了一下,是前面的目标位置没有选对。但是发现了一个新问题,就是不管是按照目标运动还是随机运动,最后都是能够看到它动,但是好像都只是plan并没有move,最后都给我一个INFO:ABORTED:No motion plan found 。No execution attempted。该怎么解决呢?谢谢您!!

        • 古月

          古月 回复

          @胡晏豪 每次规划前要设置初始状态为当前机器人状态的,你试下行不行

  28. Gravatar 头像

    殷祥钊 回复

    古月老师您好,我是一名刚学习ros的学生,您的博客对我的帮助很大,非常感谢您!但是我经常遇到一些问题不知道怎么解决,比如我在按照您的博客实践时,经常会出现如下的错误,希望您能指导一下,谢谢!

    [base.urdf.rviz.launch] is neither a launch file in package [smartcar_descriotion] nor is [smartcar_descriotion] a launch file name
    The traceback for the exception was written to the log file

    • Gravatar 头像

      胡晏豪 回复

      @殷祥钊 我觉得可以尝试一下source ~/catkin_ws/devel/setup.bash,希望有帮助

      • Gravatar 头像

        殷祥钊 回复

        @胡晏豪 非常感谢您的帮助,我输入了这句指令之后果然就没有报错了,我想请问下这个指令是不是每次在对ROS中的工作区间进行改动之后都要运行一次?谢谢!

        • Gravatar 头像

          胡晏豪 回复

          @殷祥钊 我觉得是每当新创建一个launch文件或者node文件的时候,就需要先source,好像就是寻找到这个文件吧。我也是为了毕业设计现学的这个,我反正每次都要source一下,不然会报错。希望有帮助

  29. Gravatar 头像

    胡晏豪 回复

    古老师您好,我重新开了一条评论,用的kinetic的ROS,想跑random的时候的程序如下:
    #include
    #include

    int main(int argc, char **argv)
    {
    ros::init(argc, argv, "move_group_interface_demo",ros::init_options::AnonymousName)
    ros::AsyncSpinner spinner(1);
    spinner.start();
    moveit::planning_interface::MoveGroupInterface group("arm");
    moveit::planning_interface::PlanningSceneInterface planning_scene_interface;
    group.setRandomTarget();
    group.move();
    ros::waitForShutdown();
    }您看看哪里有什么问题吗?

    • 古月

      古月 回复

      @胡晏豪 //首先要包含API的头文件
      #include

      int main(int argc, char **argv)
      {
      ros::init(argc, argv, "moveit_random_demo", ros::init_options::AnonymousName);
      // 创建一个异步的自旋线程(spinning thread)
      ros::AsyncSpinner spinner(1);
      spinner.start();
      // 连接move_group节点中的机械臂实例组,这里的组名arm是我们之前在setup assistant中设置的
      moveit::planning_interface::MoveGroupInterface group("arm");

      // 随机产生一个目标位置
      group.setRandomTarget();
      // 开始运动规划,并且让机械臂移动到目标位置
      group.move();
      ros::waitForShutdown();
      }

    • 古月

      古月 回复

      @胡晏豪 不知道为啥include中的内容显示不出来,包含的是moveit/move_group_interface/move_group_interface.h

      • Gravatar 头像

        胡晏豪 回复

        @古月 老师,还是编译失败。是不是因为我用的是我自己的一个机器人没有用这个例子里面的,如果是这种情况该怎么改呢?

        • Gravatar 头像

          ekobe 回复

          @胡晏豪 你好 我想请教以下你是怎么修改的,,我也是kinetic,按照古月老师上面的程序修改了,但是在编译的时候还是失败 。我看错位是依赖项有问题。但是改了几次都没有效果 想请教以下你是怎么修改的

          • Gravatar 头像

            胡晏豪 回复

            @ekobe 你好,我也是自己在网上查的,在CMakelist里面加一行:
            if(UNIX)
            SET (CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -Wall -std=gnu++0x")

      • Gravatar 头像

        胡晏豪 回复

        @古月 老师,问题已解决,能够动起来了

        • Gravatar 头像

          JR 回复

          @胡晏豪 您好 问一下你的编译问题是怎么解决的?

      • Gravatar 头像

        胡晏豪 回复

        @古月 老师您好,比如说我要同时控制一只手的3根手指,我是需要采用多线程的spin()会比较好吗?谢谢

        • 古月

          古月 回复

          @胡晏豪 ROS有针对夹爪的控制器,就和控制机械臂一样,控制器可以同时控制多个手指运动的,你可以看下《Mastering ROS for Robotics Programming book 》那本书里的夹爪控制

          • Gravatar 头像

            胡晏豪 回复

            @古月 只是普通的让它按照程序动起来也可以吗?刚刚看了一下,书上的好像是抓取的操作哎。

            • 古月

              古月 回复

              @胡晏豪 主要是控制器的配置,那应该是《ROS by example 2》那本书里,是有夹爪的控制器配置的

  30. Gravatar 头像

    胡晏豪 回复

    古老师,您好。我的ros是kinetic版本的,安装您上面的随机轨迹的代码输入,但是最后catkin_make编译不成功运行不了,该怎么调整呢

    • 古月

      古月 回复

      @胡晏豪 你好,kinetic版本的moveit API有所变化,如果你不方便使用indigo的话,就需要按照错误提示修改代码,改成Kinetic的接口形式

      • Gravatar 头像

        胡晏豪 回复

        @古月 嗯嗯 好。我还想问一下,之前按照上一章基础教程跑了一下,机械臂是能够按照规划走的,但是夹持器(就是手指部分)却没有办法规划,这是为什么?

          • Gravatar 头像

            胡晏豪 回复

            @古月 好的,之前问您的那个,需要改成kinetic的接口形式,有什么资料可供参考吗

            • 古月

              古月 回复

              @胡晏豪 根据编译提示的错误,要去看API文档:http://moveit.ros.org/code-api/

              • Gravatar 头像

                胡晏豪 回复

                @古月 代码我是直接复制粘贴的上面随机移动的那个,没有问题吧?只用改改接口形式就可以咯?

              • Gravatar 头像

                胡晏豪 回复

                @古月 fatal error: moveit/planning_interface/move_group_interface.h: 没有那个文件或目录
                compilation terminated.
                bhand_test/CMakeFiles/test_random.dir/build.make:62: recipe for target 'bhand_test/CMakeFiles/test_random.dir/test_random.cpp.o' failed
                make[2]: *** [bhand_test/CMakeFiles/test_random.dir/test_random.cpp.o] Error 1
                CMakeFiles/Makefile2:20844: recipe for target 'bhand_test/CMakeFiles/test_random.dir/all' failed
                make[1]: *** [bhand_test/CMakeFiles/test_random.dir/all] Error 2
                Makefile:138: recipe for target 'all' failed
                make: *** [all] Error 2
                Invoking "make -j1 -l1" failed
                老师,现在就是这个问题,该怎么解决呢

                  • Gravatar 头像

                    胡晏豪 回复

                    @古月 出现上述问题的程序的头文件就是这段,我参考了您给的那个网址后改的,哪里有什么问题吗?
                    #include
                    #include

                    • 古月

                      古月

                      @胡晏豪 没显示出来,重新再开一条评论吧

  31. Gravatar 头像

    高颜 回复

    古月老师,你好,我在运行test_custom.cpp时,出现一个问题,当运行时在RVIZ中机械臂只是闪动了一下,之后就和刚打开demo.launch一样。而test_random.cpp运行时,机械臂会出现一个固定位置,下面是我运行test_cutom.cpp的信息:
    gaoyan@ubuntu:~/catkin_ws$ rosrun seven_dof_arm_test test_custom_node
    [ INFO] [1521166702.523384097]: Loading robot model 'seven_dof_arm'...
    [ INFO] [1521166702.523555951]: No root/virtual joint specified in SRDF. Assuming fixed joint
    [ INFO] [1521166702.772860833]: Loading robot model 'seven_dof_arm'...
    [ INFO] [1521166702.773327908]: No root/virtual joint specified in SRDF. Assuming fixed joint
    [ WARN] [1521166702.781904335]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link wi
    th an inertia. As a workaround, you can add an extra dummy link to your URDF.
    [ INFO] [1521166703.776997503]: TrajectoryExecution will use old service capability.
    [ INFO] [1521166703.777216471]: Ready to take MoveGroup commands for group arm.
    [ INFO] [1521166703.817520053]: Visualizing plan 1 (pose goal)

    • 古月

      古月 回复

      @高颜 可以先参考https://answers.ros.org/question/192817/error-msg-the-root-link_base-has-an-inertia-specified-in-the-urdf-but-kdl/,解决提示的警告

  32. Gravatar 头像

    回复

    古月老师,请问gazebo和真实机器能同时和moveit连接在一起吗? 🙂

    • 古月

      古月 回复

      @梁 理论上是可以,话题不冲突就可以,但是为什么要这么做呢,如果是做显示的话,在rviz中就可以实现了。

  33. Gravatar 头像

    hah 回复

    古月大神,进来我通过试验发现,通过“任意moveit中能获取robotstate的成员函数”获取到的机器人状态都不是机器人的真实状态,无论我连得是真实机器人还是gazebo中的机器人,rviz中RobotState始终不会随着指令变化, 而moveit始终获得的都是这个不变的状态值

    • Gravatar 头像

      hah 回复

      @hah 其实我使用的是如下命令去获取机器人当前状态,但是尽管rviz中RobotModel变化,RobotState却始终不变,代码获得的返回值也始终是RobotState的状态值
      moveit::planning_interface::MoveGroup arm_ee("arm");
      arm_ee.setPoseReferenceFrame("root");
      cout<<"CurrentJointValues is: ";for (int i=0;i<6;i++)cout<<arm_ee.getCurrentJointValues().at(i)<<" "; cout<<endl;
      ROS_INFO_STREAM("robot currentstate is: " << *arm_ee.getCurrentState());

      • 古月

        古月 回复

        @hah 有一个发布RobotState话题的节点robot_state_publisher启动了没?

  34. Gravatar 头像

    kaojipai 回复

    古月老师,您好我在编译一个文件是遇到缺失包的情况,怎么办呢?
    代码在下面,麻烦您帮我看一下,谢谢您

    CMake Warning at /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake:76 (find_package):
    Could not find a package configuration file provided by "pr2_msgs" with any
    of the following names:

    pr2_msgsConfig.cmake
    pr2_msgs-config.cmake

    Add the installation prefix of "pr2_msgs" to CMAKE_PREFIX_PATH or set
    "pr2_msgs_DIR" to a directory containing one of the above files. If
    "pr2_msgs" provides a separate development package or SDK, be sure it has
    been installed.
    Call Stack (most recent call first):
    pr2_robot-indigo-devel/pr2_run_stop_auto_restart/CMakeLists.txt:6 (find_package)

    -- Could not find the required component 'pr2_msgs'. The following CMake error indicates that you either need to install the package with the same name or change your environment so that it can be found.
    CMake Error at /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
    Could not find a package configuration file provided by "pr2_msgs" with any
    of the following names:

    pr2_msgsConfig.cmake
    pr2_msgs-config.cmake

    Add the installation prefix of "pr2_msgs" to CMAKE_PREFIX_PATH or set
    "pr2_msgs_DIR" to a directory containing one of the above files. If
    "pr2_msgs" provides a separate development package or SDK, be sure it has
    been installed.
    Call Stack (most recent call first):
    pr2_robot-indigo-devel/pr2_run_stop_auto_restart/CMakeLists.txt:6 (find_package)

    -- Configuring incomplete, errors occurred!
    See also "/home/boss/catkin_ws/build/CMakeFiles/CMakeOutput.log".
    See also "/home/boss/catkin_ws/build/CMakeFiles/CMakeError.log".
    Invoking "cmake" failed

    • 古月

      古月 回复

      @kaojipai 缺少包就用命令安装:
      sudo apt-get install ros-indigo-pr2-msgs

  35. Gravatar 头像

    烤鸡排 回复

    古月老师,我已经可以实现自定义目标位置的编程,但我想结合qt,实现可视化编程,那么在qt里面如何结合ros使用可视化编程呢?

    • 古月

      古月 回复

      @烤鸡排 你好,可以基于rviz做一些需要的插件,这样相对简单,使用qt编程

      • Gravatar 头像

        烤鸡排 回复

        @古月 古月老师,我试了几天,可是还没有头绪,能不能稍微具体的介绍一下呢?谢谢您!

        • 古月

          古月 回复

          @烤鸡排 可以先看下《Mastering ROS for RoboticsProgramming 》书中关于rviz插件的部分,也可以参考我的这篇博客:http://www.guyuehome.com/945,然后自自己尝试拓展。

  36. Gravatar 头像

    回复

    @古月 我想实现抓取放置操作,下载了Moveit_simple_grasp这个package以后catkin_make出现错误,错误如下:
    CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
    Could not find a package configuration file provided by
    "moveit_simple_grasps" with any of the following names:
    moveit_simple_graspsConfig.cmake
    moveit_simple_grasps-config.cmake
    麻烦你告诉外一下完整的下载 moveit_simple_grasps 功能包的命令.  谢谢

    • 古月

      古月 回复

      @显 你好,你可以参考Mastering ROS for RoboticsProgramming这本书的第十章,有关于moveit_simple_grasps的相关内容,配套的源码也有修改过的moveit_simple_grasps包

  37. Gravatar 头像

    烤鸡排 回复

    古月老师,我想请问一下,在您上传的随机轨迹代码里的第10行的arm是哪里的,我在源代码里没有找到。另外,在自定义目标位置并完成规划代码里,我修改了目标坐标,但是一直在重复您上传代码的动作,我自己的动作没办法显示。而且我把test_custom.cpp全部注释掉,居然也显示了您代码的动作。但我查过,我电脑里只有这一个test_custom.cpp,没有其他的了。求您帮帮忙!!!谢谢!!!

    • 古月

      古月 回复

      @烤鸡排 1. arm是运动规划组的名字,在moveit setup assistant配置机械臂的时候设置的;
      2. 首先检查一下你运行的功能包路径是否正确,然后检查编译的源码是否是你的,不行的话clean掉工作空间,重新编译

  38. Gravatar 头像

    Leo 回复

    古月老师ros能用python检测机器人碰撞吗?我在Gazebo里面做仿真实验,想用深度学习控制机器人运动, 现在找不到检测碰撞的方法,想请教您一下万分感谢

    • 古月

      古月 回复

      @Leo 正如真实机器人一样,检测碰撞主要根据机器人的传感器数据判断,在gazebo中仿真的机器人应该装配尽量真实的传感器。至于用深度学习等方法,或者python语言,都是针对获取的数据进行处理并发送指令,可以在ROS节点里完成,没有问题。

  39. Gravatar 头像

    kls 回复

    古月你好。
    seven_dof_arm_test_generate_messages_cpp 这个依赖的程序或者代码在哪里能找到呢?

    • 古月

      古月 回复

      @kls 这个是《Mastering ROS for Robotics Programming》这本书的源码里的,可以在github上下载到

  40. Gravatar 头像

    Heisenberg 回复

    古月老师 你好 我在载入机器人模型,就是robot model时候 调用了getCurrentState ,提示错误:faile to fetch current state 就直接将终端结束了,请问这个是什么原因啊。还有这个model和第一步组建group的区别是什么啊,想什么逆运动学结算什么的,用group就直接够了,为什么还要有一个model的载入????

  41. Gravatar 头像

    kls 回复

    古老师您好, 我在使用 test_random.cpp 的时候,引用到了 #include 头文件,用的VS code 编辑器,会一直有提示
    “#include errors detected. Please update your includePath. IntelliSense features for this translation unit (/home/exbot/文档/seven_dof_arm_test/src/test_random.cpp) will be provided by the Tag Parser.
    cannot open source file "Eigen/Geometry" (dependency of "moveit/robot_state/robot_state.h")”
    请问这种报错要忽略掉吗?

    • 古月

      古月 回复

      @kls 你好,这是因为IDE找不到代码所以依赖的头文件,并不影响在Ubuntu ROS下的编译,如果介意的话,可以在IDE中设置头文件的搜索路径,没有的头文件需要下载相应的源码

      • Gravatar 头像

        kls 回复

        @古月 您好,非常感谢您的耐心回复。
        我重现查了下,我的系统中没有找到 eigenconfig.cmake 这个文件,可能是这个原因。
        我还有一个疑问,我在编写完 test_random.cpp 之后,这整个工程的运行是如何与 RViz 中的机器人建立联系的呢?
        我这里想尝试用我的 PR2 模型中的 right_arm,给特定joint 输入 position 信息。 我看到有一个程序是怎么写的。” ros::init(argc, argv, "move_group_test");
        ros::AsyncSpinner spinner(1);
        spinner.start();

        moveit::planning_interface::MoveGroup group("manipulator");
        group.setPlannerId("ESTkConfigDefault");

        std::map joints;
        joints["shoulder_pan_joint"] = 0;
        joints["shoulder_lift_joint"] = -0.5648;
        joints["elbow_joint"] = -1.06;
        joints["wrist_1_joint"] = -1.69;
        joints["wrist_2_joint"] = -1.76;
        joints["wrist_3_joint"] = 8.572;
        group.setJointValueTarget(joints);
        group.move();“
        那么他这里面的 group.setPlannerId("ESTkConfigDefault") 中的 ESTkConfigDefault,是不是就是对应的 RViz 中的模型呢?
        多谢~~~

        • Gravatar 头像

          kls 回复

          @kls 您好,我找到 ESTkConfigDefault 的意思了, 是RViz 中的 Planning library 对应的选项列。
          但是还是不清楚我自己编写的pkg 如何与 RViz 中的模型建立联系?

          • 古月

            古月 回复

            @kls 自己写的pkg调用moveit接口,控制机器人运动,可以参考《Mastering ROS for Robotics Programming》这本书。

    • Gravatar 头像

      kls 回复

      @Heisenberg 古老师您好, 我在使用 test_random.cpp 的时候,引用到了 #include 头文件,用的VS code 编辑器,会一直有提示
      “#include errors detected. Please update your includePath. IntelliSense features for this translation unit (/home/exbot/文档/seven_dof_arm_test/src/test_random.cpp) will be provided by the Tag Parser.
      cannot open source file "Eigen/Geometry" (dependency of "moveit/robot_state/robot_state.h")”
      请问这种报错要忽略掉吗?

  42. Gravatar 头像

    Heisenberg 回复

    我在用程序来控制自己的一个机械臂的时候显示出来这个,
    Debug: Starting goal sampling thread
    Debug: Waiting for space information to be set up before the sampling thread can begin computation...
    [ INFO] [1516341636.616862283]: Planner configuration 'arm' will use planner 'geometric::RRTConnect'. Additional configuration parameters will be set when the planner is constructed.
    Debug: RRTConnect: Planner range detected to be 5.025360
    Info: RRTConnect: Starting planning with 1 states already in datastructure
    Debug: RRTConnect: Waiting for goal region samples ...
    Debug: Beginning sampling thread computation
    Error: RRTConnect: Unable to sample any valid states for goal tree
    at line 215 in /tmp/binarydeb/ros-kinetic-ompl-1.2.1/src/ompl/geometric/planners/rrt/src/RRTConnect.cpp
    Info: RRTConnect: Created 1 states (1 start + 0 goal)
    Info: No solution found after 5.006646 seconds
    Debug: Attempting to stop goal sampling thread...
    Debug: Stopped goal sampling thread after 0 sampling attempts

    kinetic版本的moveit 谢谢古月大神

    • 古月

      古月 回复

      @Heisenberg 运动规划失败了,试一下换一个规划的插件,或者运动学求解器

      • Gravatar 头像

        Heisenberg 回复

        @古月 请问怎么更换规划的插件呢

        • 古月

          古月 回复

          @Heisenberg 运动规划失败的话可以在rviz的moveit插件标签页中找到一个下拉列表,更换运动规划插件,也可以使用wiki上的方法修改运动学规划期,比如fastik和tracik。

  43. Gravatar 头像

    Heisenberg 回复

    古月大神,我这个模型启动后,会显示No active joints or end effectors found for group 'arm'. Make sure you have defined an end effector in your SRDF file and that kinematics.yaml is loaded in this node's namespace. 然后我用代码也控制不了。用代码发送一个命令之后直接显示一个Link 'paw' not found in model 'arm'
    [ WARN] [1516280460.185282516]: Position constraint link model paw not found in kinematic model. Constraint invalid.

    • 古月

      古月 回复

      @Heisenberg 你这个模型有问题吧,找不到规划组,用的是书里的模型么?

      • Gravatar 头像

        Heisenberg 回复

        @古月 并不是 是我自己的一个模型,现在提示No active joints or end effectors found for group 'arm'. Make sure you have defined an end effector in your SRDF file and that kinematics.yaml is loaded in this node's namespace.
        然后我在代码里面运行的时候直接输出末端执行器的名字时是可以获得末端执行器的。虽然现在显示的是这个,但是并没有提示错误,但是用代码给他一个位姿的时候,moveit会输出一个error:Error: RRTConnect: Unable to sample any valid states for goal tree
        at line 215 in /tmp/binarydeb/ros-kinetic-ompl-1.2.1/src/ompl/geometric/planners/rrt/src/RRTConnect.cpp
        感觉毫好迷啊。不像是一个时间的问题我的是六轴的,而且位姿变化并不大。

        • 古月

          古月 回复

          @Heisenberg 你说的末端执行器是机械臂之外的夹爪么?moveit配置的时候group有没有针对夹爪单独配置?运动规划失败的话可以在rviz的moveit插件标签页中找到一个下拉列表,更换运动规划插件,也可以使用wiki上的方法修改运动学规划期,比如fastik和tracik。

  44. Gravatar 头像

    heisenberg 回复

    老哥 我这个在16.04上面 试了两个机械臂 在末端执行器上都没有那个可以拖动的东西是什么情况啊 还有那个我这个plan一直提示错误error: cannot convert ‘moveit::planning_interface::MoveItErrorCode’ to ‘bool’ in initialization
    bool success = group.plan(my_plan);

  45. Gravatar 头像

    qqh 回复

    古月大哥,这个目标位置的设定有讲究吗?为什么我试了好多组都规划失败了呢?

    • 古月

      古月 回复

      @qqh 这个需要设置在机器人工作方位内,另外针对不同的运动学算法,效果也不太一样,可以使用不同的算法试一下

  46. Gravatar 头像

    dobot 回复

    胡老师,公司让做一个四自由度机械臂的运动规划,但是我做到目标位置这里时,遇到了一个问题:
    我已设置了目标位置的坐标如下:
    target_pose.orientation.w=1.0;
    target_pose.position.x=0.16;
    target_pose.position.y=0.0;
    target_pose.position.z=0.283;
    (我的四自由度模型比较小,也确定这个参数是在机器人可达范围之内的)
    但是在运行这个目标位置程序的时候出现:Fail: ABORTED: No motion plan found. No execution at tempted
    我怎么修改参数也是一直出现这个问题,而且我在网上查了各种解决办法,也修改了逆运动学插件,还是解决不了问题,最后还是换成了KDL再次尝试修改,但是一直就是不行。那么具体这个参数是如何设置的呢?怎么计算才能得到呢?

    • Gravatar 头像

      qqh 回复

      @dobot 这个目标位置的设定有讲究吗?为什么我试了好多组都规划失败了呢?

      • Gravatar 头像

        dobot 回复

        @qqh 应该是有相应的方法的,我也是尝试了好多次都失败了,所以只能咨询古大神了!

    • 古月

      古月 回复

      @dobot 首先你的模型应该是确认没有问题的,也使用MoveIt进行了正确的配置。然后再进行运动学求解的调试,可以通过代码试一下你设置的这个位置是否可以求的逆解,如果无法求解,说明是运动学部分的问题,可以试以下fast_ik或者trac_ik,这两个插件我一直在用,感觉效果还不错。

      • Gravatar 头像

        dobot 回复

        @古月 非常感谢胡老师的指导,就在刚才我先用moveit_fk_demo.py进行了运动学求解,得到我所设的这个点可以达到,那问题应该是出在运动学这块了,我先学习一下moveit官网的ikfast这个插件教程,再来检测我的模型的运动学问题,这回应该是没问题了,非常感谢胡老师迟来的指导,非常感谢!

        • 古月

          古月 回复

          @dobot 赞,不好意思,前两天在台北参加ROS Taipei年会,回复晚了。

  47. Gravatar 头像

    qqh 回复

    古月大哥,请问那个程序里给的目标位置是相对于什么坐标系来说的啊

  48. Gravatar 头像

    杨轶帆 回复

    想问一下,在catkin build moveit_tutorials的时候报错,该怎么解决。紧急。
    error: cannot convert 'moveit::planning_interface:MoveItErrorCode' to 'bool' in initialization
    bool success = move_group.plan(my_plan);
    error: cannot convert 'moveit::planning_interface:MoveItErrorCode' to 'bool' in assignment
    success = move_group.plan(my_plan);
    error: cannot convert 'moveit::planning_interface:MoveItErrorCode' to 'bool' in assignment
    success = move_group.plan(my_plan);
    error: cannot convert 'moveit::planning_interface:MoveItErrorCode' to 'bool' in assignment
    success = move_group.plan(my_plan);
    error: cannot convert 'moveit::planning_interface::moveiterrorcode' to 'bool' in assignment
    success = two_arms_move_group.plan(two_arms_plan);

    谢谢。

    • 古月

      古月 回复

      @杨轶帆 C++语法错误,plan的返回值是moveit::planning_interface:MoveItErrorCode,不是bool。可能是因为ROS版本不一致导致,可以修改代码试一下

  49. Gravatar 头像

    徐松 回复

    古月大神您好,我在学习《ROS By Example》时遇到一个问题,试了好多种方法,还是解决不了,需要请教您一下,我现在在做逆运动学求解那部分,逆运动学求解的py脚本里定义了几种位姿,其中有moveit设置好的resting、forward、wave几种状态,还有自己通过xyz坐标,xyzw四元数设定的位姿,但是执行时,resting、forward、wave都可以实现,自己设定的却求解不出来,我以为是我设定的位姿有问题,或者达不到,然后我就通过current命令输出位姿(包括position xyz,和orientation xyzw),然后把输出的位姿数据复制过去,还是求不出解,,你知道可能是什么原因吗?
    终端显示:Fail :ABORTED:No motion plan found 。No execution attempted

    • 古月

      古月 回复

      @徐松 这样描述不好确定问题所在,可能是配置的问题,对照例程代码中的配置流程检查以下,看下有没有配置坐标系等参数:

      # Set the target pose. This particular pose has the gripper oriented horizontally
      # 0.85 meters above the ground, 0.10 meters to the right and 0.20 meters ahead of
      # the center of the robot base.
      target_pose = PoseStamped()
      target_pose.header.frame_id = reference_frame
      target_pose.header.stamp = rospy.Time.now()
      target_pose.pose.position.x = 0.20
      target_pose.pose.position.y = -0.1
      target_pose.pose.position.z = 0.85
      target_pose.pose.orientation.x = 0.0
      target_pose.pose.orientation.y = 0.0
      target_pose.pose.orientation.z = 0.0
      target_pose.pose.orientation.w = 1.0

      # Set the start state to the current state
      right_arm.set_start_state_to_current_state()

      # Set the goal pose of the end effector to the stored pose
      right_arm.set_pose_target(target_pose, end_effector_link)

      # Plan the trajectory to the goal
      traj = right_arm.plan()

      # Execute the planned trajectory
      right_arm.execute(traj)

  50. Gravatar 头像

    pdmike 回复

    @古月 hello 古神 我又有问题来请教啦,就是我用RVIZ规划处一条可行轨迹后,怎么把轨迹中motion planning slider里的每个点坐标保存下来

    • 古月

      古月 回复

      @pdmike 如果配置了controller,可以看到规划出的轨迹,但只有部分路点;或者使用代码规划,并且保存轨迹,同样只有路点;如果需要获取每个周期的插补点,需要找到插补计算的相关源码。或者打印机器人的运动状态joints_state

      • Gravatar 头像

        pdmike 回复

        @古月 好的 我试下 有问题再来请教 谢谢

      • Gravatar 头像

        pdmike 回复

        @古月 @古月 我现在用代码规划可以得到整条joints_state, 怎样获取整条轨迹中末端执行器的XYZ坐标

        • 古月

          古月 回复

          @pdmike 这个需要用FK做计算,或者用TF也可以获取

  51. Gravatar 头像

    小飞 回复

    胡老师,请问cartesian_path下只能走直线,不能走圆弧吗?那假如我要绕障碍走,是只能用setposetarget来运动吗?

    • 古月

      古月 回复

      @小飞 圆弧可以细分成多个直线,然后再用cartesian_path走

  52. Gravatar 头像

    小飞 回复

    胡老师,有个问题想请教一下。自定义目标点加入不在机器人的工作空间内,规划会失败,这样就会浪费时间。能不能在规划前快速判断目标点是否在工作空间内呢?请问有什么好的建议吗?

    • 古月

      古月 回复

      @小飞 机器人的工作范围不是可以根据机械参数计算得到么,或者在规划前先用运动学计算一下是否可以求解成功

  53. Gravatar 头像

    glen 回复

    古神,我用computeCartesianPath来计算笛卡尔路径来控制机械臂走圆弧,程序如下:
    while(j < 1000 && ros::ok()){

    //计算笛卡尔坐标系路径
    double eef_resolution = std::min(0.005,radius*(angular_range / point_count));

    fraction = group.computeCartesianPath(waypointsL,eef_resolution,0.0,trajectory1);

    ROS_INFO("Visualizing plan left (cartesian path) (%.2f%% acheived)",fraction * 100.0);

    // move_group_interface::MoveGroup group("arm_group");

    if(fraction == 1.0){

    break;
    }

    // j++;
    }
    但是,有时候完成度是100%,有的时候是44%,不能保证每次100%,该怎么处理呢,困扰了好久

    • 古月

      古月 回复

      @glen 调整一下IK算法试试,也可以自己写一个圆弧算法,不用ROS中的笛卡尔规划

  54. Gravatar 头像

    刘奇奇 回复

    古老师您好,我想问一下,我按照您的步骤,在我的工作空间下创建了seven_dof_arm_test功能包,在src目录下创建了随机轨迹文件test_random.cpp,请问怎么更改CMakeLists.txt文件?
    我这么添加的,老是出错:
    add_executable(test_random src/test_random.cpp)
    target_link_libraries(test_random ${catkin_LIBRARIES} ${Boost_LIBRARIES})
    install(TARGETS test_random DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

  55. Gravatar 头像

    郭剑 回复

    请问一下 AttachedCollisionObject 和 CollisionObject 有什么区别?

  56. Gravatar 头像

    tak 回复

    @古月 你好 我想问下 如果机器人在moveit 规划轨迹时,约束末端执行器pitch 和roll 角度不变,但是不约束yaw,程序应该怎么写或者怎么MoveIt 怎么设置

    • 古月

      古月 回复

      @tak 不好意思,这个问题暂时我也不清楚怎么使用moveit设置

  57. Gravatar 头像

    liqi 回复

    古月神您好,我在学习Mastering ROS for Robotic Programming这本书的时候,想实习实现抓取放置操作,下载了Moveit_simple_grasp这个package以后catkin_make通过了
    但是运行roslaunch seven_dof_arm_gazebograsp_generator_server.launch这个指令的时候出现了错误,如下

    SUMMARY
    ========

    PARAMETERS
    * /moveit_simple_grasps_server/base_link: base_link
    * /moveit_simple_grasps_server/end_effector: gripper
    * /moveit_simple_grasps_server/gripper/end_effector_name: gripper
    * /moveit_simple_grasps_server/gripper/end_effector_parent_link: gripper_roll_link
    * /moveit_simple_grasps_server/gripper/grasp_pose_to_eef: [0.0, 0.0, 0.0]
    * /moveit_simple_grasps_server/gripper/grasp_pose_to_eef_rotation: [0.0, 0.0, 0.0]
    * /moveit_simple_grasps_server/gripper/grasp_posture: [1.0, 1.0]
    * /moveit_simple_grasps_server/gripper/grasp_time_from_start: 4.0
    * /moveit_simple_grasps_server/gripper/joints: ['finger_joint1',...
    * /moveit_simple_grasps_server/gripper/postplace_time_from_start: 4.0
    * /moveit_simple_grasps_server/gripper/pregrasp_posture: [0.0, 0.0]
    * /moveit_simple_grasps_server/gripper/pregrasp_time_from_start: 4.0
    * /moveit_simple_grasps_server/group: arm
    * /rosdistro: indigo
    * /rosversion: 1.11.21

    NODES
    /
    moveit_simple_grasps_server (moveit_simple_grasps/moveit_simple_grasps_server)

    ROS_MASTER_URI=http://localhost:11311

    core service [/rosout] found
    process[moveit_simple_grasps_server-1]: started with pid [4196]
    [ERROR] [1507774107.485511281]: Grasp configuration parameter `pregrasp_time_from_start` missing from rosparam server. Did you load your end effector's configuration yaml file? Searching in namespace: /moveit_simple_grasps_server/right
    moveit_simple_grasps_server: /usr/include/boost/smart_ptr/shared_ptr.hpp:653: typename boost::detail::sp_member_access::type boost::shared_ptr::operator->() const [with T = const moveit::core::RobotModel; typename boost::detail::sp_member_access::type = const moveit::core::RobotModel*]: Assertion `px != 0' failed.
    [moveit_simple_grasps_server-1] process has died [pid 4196, exit code -6, cmd /home/liqi/catkin_ws/devel/lib/moveit_simple_grasps/moveit_simple_grasps_server __name:=moveit_simple_grasps_server __log:=/home/liqi/.ros/log/d1043298-ae95-11e7-845f-000c29b384c9/moveit_simple_grasps_server-1.log].
    log file: /home/liqi/.ros/log/d1043298-ae95-11e7-845f-000c29b384c9/moveit_simple_grasps_server-1*.log
    all processes on machine have died, roslaunch will exit
    shutting down processing monitor...
    ... shutting down processing monitor complete

    为什么参数服务器上找不到pregrasp_time_from_start这个参数呢,通过rosparam get都能够输出他的值,然后另一个错误是Boost库的智能指针未初始化,请问古月君该如何解决,感激不尽。

  58. Gravatar 头像

    孔维霞 回复

    你好,这个是我结合您跟另外一个人的教程编写的
    运行roslaunch lwr_description demo.launch时
    while processing /opt/ros/indigo/share/urdf/launch/planning_context.launch:
    Invalid roslaunch XML syntax: [Errno 2] No such file or directory: u'/opt/ros/indigo/share/urdf/launch/'
    The traceback for the exception was written to the log file
    这个是什么原因阿,planning_context.launch这个文件和demo.launch都在文件夹里阿。

    • 古月

      古月 回复

      @孔维霞 路径不对吧,为什么是/opt/ros/indigo/share/urdf/launch/,应该是你所用的功能包路径吧

  59. Gravatar 头像

    redundant manipulator 回复

    古月居,怎么让机器人 在两点之间走直线或者圆弧,或者直接让机器人走一个椭圆路径?求解释或者 给出相应的网站

    • 古月

      古月 回复

      @redundant manipulator 走直线可以用MoveIt!的笛卡尔运动,圆弧需要自己实现,可以参考机器人学教科书中的轨迹规划

      • Gravatar 头像

        redundant manipulator 回复

        @古月 古老师,走线段已经实现了,最关键的一步,我想查看机器人走线段过程中的运动学逆解,也就是关节空间轨迹。我查看了一下,MoveIt! Visual Tools这个工具包。但是哪个函数是把关节轨迹发布的?然后用rqt_plot 就能画出关节空间轨迹
        。 或者有没有其他方法?

        • 古月

          古月 回复

          @redundant manipulator FollowJointsTrajectory是关节空间的轨迹,可以打印出来看,或者打印joints_state话题,是实时的关节状态

          • Gravatar 头像

            redundant manipulator 回复

            @古月 有3处关节偏置的7自由度机器人MotomanVA1400 走线段已经实现了,求逆解用的trac-ik插件。有个问题,实现走线段的 关节轨迹是连续的,没有突变,这令我震惊,因为7自由度 在一个末端位恣上有无穷多个逆解,算法是怎么选择的? 是以上一个位恣逆解作为 待求下一个待求位恣的迭代初始值么?
            我在看代码,代码层层调用的逆解函数太多了,第1层是 服务包装的函数
            bool move_group::MoveGroupCartesianPathService::computeService(moveit_msgs::GetCartesianPath::Request& req,
            moveit_msgs::GetCartesianPath::Response& res)
            第2层 double moveit::core::RobotState::computeCartesianPath(。。。)
            用步长路径离散,把每一个离散点及姿态传入下一层函数。
            是不是借助回调函数,更新当前的RobotState类的成员变量,来保存逆解值的?如下

            if (setFromIK(group, pose, link->getName(), 1, 0.0, validCallback, options))
            {
            traj.push_back(RobotStatePtr(new RobotState(*this)));
            }
            第3层 bool moveit::core::RobotState::setFromIK()
            这个函数太长了。。。。。。
            solver->searchPositionIK()
            重点 好多个,没抓住一个 ??
            4层才是真正实现
            searchPositionIK()
            qq:593859610

  60. Gravatar 头像

    烤鸡排 回复

    古神,我想请问一下,我在使用moveit的配置助手时运行第一步creat然后按第一步load,当运行到70%时,闪退了,怎么办?

    boss@boss-virtual-machine:~$ catkin_create_pkg seven_dof_arm_test catkin cmake_modules interactive_markers moveit_core moveit_ros_perception moveit_ros_planning_interface pluginlib roscpp std_msgs
    usage: catkin_create_pkg [-h] [--meta] [-s [SYS_DEPS [SYS_DEPS ...]]]
    [-b [BOOST_COMPS [BOOST_COMPS ...]]] [-V PKG_VERSION]
    [-D DESCRIPTION] [-l LICENSE] [-a AUTHOR]
    [-m MAINTAINER] [--rosdistro ROSDISTRO]
    name [dependencies [dependencies ...]]
    catkin_create_pkg: error: File exists: /home/boss/seven_dof_arm_test/CMakeLists.txt
    boss@boss-virtual-machine:~$ roslaunch seven_dof_arm_config demo.launch
    [demo.launch] is neither a launch file in package [seven_dof_arm_config] nor is [seven_dof_arm_config] a launch file name
    The traceback for the exception was written to the log file
    boss@boss-virtual-machine:~$ $ rosrun seven_dof_arm_test test_random_node
    $:未找到命令
    boss@boss-virtual-ma

    这些是它跳出来的代码。求古神帮忙!!!

    • 古月

      古月 回复

      @烤鸡排 上边的代码不是你建功能包的命令么?你用配置助手试试其他机械臂模型,或者把源码中的机器人模型单独拿出来,在配置助手里新建功能包

  61. Gravatar 头像

    pdmike 回复

    古神 你好 我直接把Mastering ROS for Robotics Programming 中 第十章的demo 直接复制到我的工作区进行编译 但是编译出错
    ####
    #### Running command: "make -j1 -l1" in "/home/aicrobo/catkin_ws/build"
    ####
    Scanning dependencies of target add_collision_objct
    [ 14%] Building CXX object seven_dof_arm_test/CMakeFiles/add_collision_objct.dir/src/add_collision_objct.cpp.o
    Linking CXX executable /home/aicrobo/catkin_ws/devel/lib/seven_dof_arm_test/add_collision_objct
    [ 14%] Built target add_collision_objct
    Scanning dependencies of target check_collision
    [ 28%] Building CXX object seven_dof_arm_test/CMakeFiles/check_collision.dir/src/check_collision.cpp.o
    Linking CXX executable /home/aicrobo/catkin_ws/devel/lib/seven_dof_arm_test/check_collision
    [ 28%] Built target check_collision
    Scanning dependencies of target find_ee_coordinate
    [ 42%] Building CXX object seven_dof_arm_test/CMakeFiles/find_ee_coordinate.dir/src/find_ee_coordinate.cpp.o
    Linking CXX executable /home/aicrobo/catkin_ws/devel/lib/seven_dof_arm_test/find_ee_coordinate
    /opt/ros/indigo/lib/libmoveit_planning_scene_monitor.so: undefined reference to `ros::WallTimer::setPeriod(ros::WallDuration const&, bool)'
    collect2: error: ld returned 1 exit status
    make[2]: *** [/home/aicrobo/catkin_ws/devel/lib/seven_dof_arm_test/find_ee_coordinate] Error 1
    make[1]: *** [seven_dof_arm_test/CMakeFiles/find_ee_coordinate.dir/all] Error 2
    make: *** [all] Error 2
    Invoking "make -j1 -l1" failed
    有两个demo是编译通过 其余都是这个错,麻烦帮我看下是什么问题 谢谢

      • Gravatar 头像

        pdmike 回复

        @古月 indigo 网上整合的

      • Gravatar 头像

        pdmike 回复

        @古月 感谢古神 已经搞定 第二链接很给力

          • Gravatar 头像

            pdmike 回复

            @古月 古神 还有个问题 就是我用的是UR机器人 我在RVIZ中导入的官方模型,如果我现在要在机械臂上加入一个工具,比如抓手,然后我的抓手模型是proe画的,应该怎么加,是用proe转solidworks再导入,还是直接转成dae格式的3D文件,用RVIZ中的scene objects 导入?

            • 古月

              古月 回复

              @pdmike 如果你的抓手是有关节需要控制的,就需要转换成URDF模型,加到UR的模型里,dae格式没办法控制

              • Gravatar 头像

                pdmike 回复

                @古月 如果不控制 只是将一个工具3d模型与机器人法兰盘相连,应该怎么做比较简单

                • 古月

                  古月 回复

                  @pdmike 可以在UR的模型法兰盘前端加一个link,然后关联dae文件

                  • Gravatar 头像

                    pdmike 回复

                    @古月 古神 怎么把用solidworks URDF 插件转化好的工具机械手模型和现有的UR机械臂urdf在ROS中进行整合啊 有教程吗

                    • 古月

                      古月

                      @pdmike 这个就是URDF模型的编辑,参考URDF的教程就行,应该设计一个joint和一个link就行

                  • Gravatar 头像

                    pdmike 回复

                    @古月 搞定了 古神 谢谢 还有个问题 就是那个调整各个轴位置的joint state 界面 是怎么打开的?

                    • 古月

                      古月

                      @pdmike 这个需要启动joint_state_publisher节点

  62. Gravatar 头像

    sunanger 回复

    月哥你好,感谢你的分享!
    小弟在开发时遇到一个问题,我的机器人时四自由度,有一个平移关节,用moveit_setup_assistant配置好后,在kinematic.yaml中设置了position_only_ik : true选项,这时运行demo.launch,可以自由的拖动交互工具,但我再用代码开发时,使用set_position_target函数时,一直是无法成功,但改为set_random_target就可以,我确认我设置的position的位置是可以达到的,请问大侠这时怎么回事啊?无比感激。

    • 古月

      古月 回复

      @sunanger 这个我也没办法确定是什么问题,试一下修改运动学插件

  63. Gravatar 头像

    dechao 回复

    月哥,请教个问题,
    1.这里的碰撞检测是不是使用的FCL库?
    2.自身碰撞检测这个有对应的源码吗?一直没有找到。
    谢谢

    • 古月

      古月 回复

      @dechao MoveIt默认使用的是FCL。
      源码参考:http://wiki.ros.org/fcl

  64. Gravatar 头像

    Y-liberal 回复

    古月老师,上面第一个程序里面定义的my_plan,我认为是group.plan()这个函数将轨迹值放入了my_plan这个结构体里面了,但是我用ROS_INFO("%s",my_plan)这行代码运行之后,完全是空白,不知道怎样才能显示my_plan的值呢?或者是我对程序里面的my_plan的理解有误,请您指教一下。

    • 古月

      古月 回复

      @Y-liberal 不能这样打印, my_plan是moveit::planning_interface::MoveGroup::Plan结构体,看一下http://docs.ros.org/jade/api/moveit_ros_planning_interface/html/structmoveit_1_1planning__interface_1_1MoveGroup_1_1Plan.html,打印里边的trajectory_

      • Gravatar 头像

        Y-liberal 回复

        @古月 古月老师,我用ROS_INFO("%s",my_plan.trajectory_)在打印trajectroy_的时候,有一个warning提示说moveit
        _msgs::RobotTrajectory {aka moveit_msgs::RobotTraje
        ctory_<std::allocator >}
        后来又换成了%f, %d, <ste::allocator>等各种数据类型,都显示不出来,我不知道问题出在哪里。

        • 古月

          古月 回复

          @Y-liberal trajectroy_不是字符串或者整型数,是结构体,不能这样打印,看下这个数据结构是什么样的,打印里边的值

          • Gravatar 头像

            Y-liberal 回复

            @古月 哦,那我再看一下,谢谢古月老师。

  65. Gravatar 头像

    海漩涡 回复

    月哥你好
    使用moveit的接口setFromIK进行运动学反解
    此接口需要pose:包含位置和姿态,然而我只想给位置不关注姿态,这样moveit里能实现吗

      • Gravatar 头像

        海漩涡 回复

        @古月 有什么办法能获得有效的姿态?因为我随便设的姿态无法得到反解结果。

        • Gravatar 头像

          王振利 回复

          @海漩涡 请问大侠,我也设置了positon_only_ik,但是在demo.lauch中可以,在代码中执行就不行,请问是为什么

  66. Gravatar 头像

    杨记周 回复

    古月大神,最近一直在学习您的moveit编程,也有很多收获,可是我在学习的时候却遇到了几个问题,这些问题也已经困扰了我几天了,所以想向您请教以下.当我使用自定义目标位置并完成规划时,如果我使用group.move()时,机械臂会执行,当我使用group.plan()规划时,就会提示无法解决规划问题的错误,机械臂也不会执行相应动作.还有我指定的一些目标点明明时可以到达的(我在rviz中已经测试可以到达),当我执行group.move()或者group.plan(),也会提示这种错误:
    [ INFO] [1500121663.842961617]: Unable to solve the planning problem
    [ERROR] [1500121663.843402246]: Unable to transform from frame '' to frame '/base_link'. Returning identity.
    真心希望您能帮我解决这个问题,非常感谢!

  67. Gravatar 头像

    daishij 回复

    博主您好 有个问题想请教一下,在运行test_random.cpp后发生错误如下 不知该如何解决
    [ INFO] [1497407451.190135995]: Loading robot model 'mico'...
    [ INFO] [1497407451.190278606]: No root/virtual joint specified in SRDF. Assuming fixed joint
    [ INFO] [1497407451.434377821]: Loading robot model 'mico'...
    [ INFO] [1497407451.434418702]: No root/virtual joint specified in SRDF. Assuming fixed joint
    [ INFO] [1497407452.258207938]: TrajectoryExecution will use old service capability.
    [ INFO] [1497407452.258269802]: Ready to take MoveGroup commands for group mico_arm.
    [ INFO] [1497407452.290881463]: ABORTED: No motion plan found. No execution attempted.
    运行demo的窗口报错如下:
    [ WARN] [1497407936.118023847]: Unable to find a valid state nearby the start state (using jiggle fraction of 0.050000 and 100 sampling attempts). Passing the original planning request to the planner.
    [ WARN] [1497407936.118554278]: LBKPIECE1: Skipping invalid start state (invalid state)
    [ERROR] [1497407936.118688816]: LBKPIECE1: Motion planning start tree could not be initialized!
    [ INFO] [1497407936.118785454]: No solution found after 0.000292 seconds
    [ WARN] [1497407936.128501546]: Goal sampling thread never did any work.
    [ INFO] [1497407936.128587437]: Unable to solve the planning problem
    非常感谢

    • 古月

      古月 回复

      @daishij 请参考:https://groups.google.com/forum/#!topic/moveit-users/a3W5sQcxRAM

  68. Gravatar 头像

    Candy 回复

    博主你好,看您的微博学到了很多有用的ROS相关知识,受益匪浅。我在 moveit 编程随机轨迹这里复制了示例的test_random.cpp并修改Camkelist.text 后编译显示
    CMake Error at /opt/ros/hydro/share/catkin/cmake/catkinConfig.cmake:75 (find_package):
    Could not find a configuration file for package cmake_modules.

    Set cmake_modules_DIR to the directory containing a CMake configuration
    file for cmake_modules. The file will have one of the following names:

    cmake_modulesConfig.cmake
    cmake_modules-config.cmake

    这样的错误,不知道为什么,求能解答一下!

  69. Gravatar 头像

    jimmyjiao 回复

    博主您好,看到您的博客收获很大。现在有个问题想请教下您。激光雷达的有效距离是在30cm-8m,也就是说当激光雷达扫到30cm之内时,无法得到数据。这个在移动机器人中,应该不少见吧,您当时是如何解决这样的问题的?举个例子,如果在比较狭窄的环境中,比如说迷宫,当小车卡在某个角落中,按照movebase包的原理,会原地打转,但是如果左右两边检测到了障碍物,就卡住了,无法逃离当前状态。

    • 古月

      古月 回复

      @jimmyjiao 你好,这个问题确实经常遇到,我之前试过用超声波检测近距离的障碍,辅助避障。另外你用的激光雷达盲区有30cm么,激光雷达盲区应该比较小,确定不是红外?

  70. Gravatar 头像

    Shawn 回复

    在test_custom.cpp例子中,源码多了几行代码,我没看懂,
    moveit::planning_interface::PlanningSceneInterface
    planning_scene_interface;
    ros::Publisher display_publisher =
    node_handle.advertise("/move_group/
    display_planned_path", 1, true);
    moveit_msgs::DisplayTrajectory display_trajectory;

    进行了初始化,却没有在后面的代码中用上。

    您也提到这部分代码是冗余的,删除了。

    原作者留下这部分代码的用意是什么?

    • 古月

      古月 回复

      @Shawn 这个应该是用于rviz显示路径的,没有用到

  71. Gravatar 头像

    海漩涡 回复

    月哥,你好
    我在弄随机轨迹那个例子时,我的程序总是卡在move这个函数不往下走了,但是机器人是动了的。

    操作多次,结果都一样。请问下你当时的效果也是这样的吗

    • 古月

      古月 回复

      @海漩涡 我运行的时候是没有问题的,你试一下《Mastering ROS for robotics Programming》里边提供的源码,或者在rviz中用target设置一下目标位置。

  72. Gravatar 头像

    海漩涡 回复

    月哥,我最近在研究moveit,使用它对机器人的手臂进行控制。
    在博客的评论里问了你很多问题了,感觉这样交流不是很方面

    望能够提供QQ或邮箱,日后能更好的交流。
    我的QQ469249801

  73. Gravatar 头像

    海漩涡 回复

    月哥,请教下你有没有用moveit的compute_cartesian_path接口来计算一系列waypoints的轨迹

    我在使用此接口时规划的结果是 30% 45% 80% 等都有。

    我想知道怎么正确的使用此接口?

    • 古月

      古月 回复

      @海漩涡 你好,这个接口我很早以前试过,好像不太好用,就是按照文档上的说明使用的

  74. Gravatar 头像

    章金锋 回复

    古月,您好,不知道怎么能联系上您,所以只能给您留言了,我是上海哲谦应用科技的,说大了就是看你的文章在学习,直接点就是想找您合作,方便的话,您能把你的联系方式发到我的邮箱吗?zzhang0617@163.com 希望您能看到我的这条留言,也希望您能给我发个联系邮件,我们具体谈,谢谢!

  75. Gravatar 头像

    tanxiaohai 回复

    月哥你好,看了你几篇文章了学到了很多,非常感谢

    想请教你个问题:
    我在网上下载的urdf通过setup assistant进行配置完后,想用artibox模拟器来进行运动规划的测试。
    我现在遇到的问题是我能跑起:
    /arbotix
    /right_gripper_controller
    /robot_state_publisher

    这三个节点,我想用rviz来显示我的机器人,之后再用moveIt来控制。但是我确在配置文件中找不到rviz的配置文件。

    请问下怎样才能获得与urdf对应的rviz配置文件???

    • 古月

      古月 回复

      @tanxiaohai 你好,用setup assistant生成的rviz配置文件在configb包的launch文件夹下,moveit.rviz

  76. Gravatar 头像

    王聪 回复

    想问一下能在kinetic上安装moveit吗?官方好像还没有,但是ubuntu装的16版本

    • 古月

      古月 回复

      @王聪 你好,我没试过kinetic版本,但是我看到moveit有这个版本的源码,应该是可以安装的,用tab试一下

    • Gravatar 头像

      杨洋 回复

      @王聪 请问kinetic可以装moveit了吗?

      • 古月

        古月 回复

        @杨洋 可以装,流程一样的,API稍有变化而已

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.