ROS探索总结(五十二)—— MoveIt!中的运动学插件

  • 内容
  • 评论
  • 相关

MoveIt!是ROS中一个重要的集成化开发平台,由一系列移动操作的功能包组成,提供运动规划、操作控制、3D感知、运动学等功能模块,是ROS社区中使用度排名前三的功能包,目前已经支持众多机器人硬件平台。

1

MoveIt!中的众多功能都使用插件机制集成,其中有一个重要的功能模块——运动学插件。

2

今天我们就来聊下MoveIt!中的运动学求解器。

 

一、KDL

Kinematics and Dynamics Library (KDL)是MoveIt!中的默认运动学插件,在使用MoveIt! Setup Assistant进行模型配置时,可以进行配置。

3

配置完成后,就可以运行demo.launch控制虚拟机械臂进行运动规划了。但是KDL有自己的优缺点:

4

比如一次逆解的求解时间:0.062192秒。。。

5

很多时候我们在做运动规划的时候,MoveIt!经常会提示规划失败、求解失败等错误,很多都是因为KDL这款运动学插件导致的,那么问题就来了——能不能更换一个运动学插件?

当然可以,以下介绍两个用的最多的运动学插件:TRAC-IK和IKFAST。

 

二、TRAC-IK

TRAC-IK和KDL类似,也是一种基于数值解的运动学插件,但是在算法层面上进行了很多改进,求解效率高了很多。比如在下边这张图中,左侧的红点是KDL无法求解的姿态点,但是在右侧使用TRAC-IK是可以求解的。

6

那么如何将KDL更换成TRAC-IK呢,方法很简单,ROS的软件源中已经集成了TRAC-IK的安装包,可以直接使用以下命令安装:

  1. sudo apt-get install ros-kinetic-trac-ik-kinematics-plugin

然后修改机械臂MoveIt!配置功能包下的kinematics.yaml文件就可以使用啦:

  1. arm:
  2.   kinematics_solver: trac_ik_kinematics_plugin/TRAC_IKKinematicsPlugin
  3.   kinematics_solver_attempts: 3
  4.   kinematics_solver_search_resolution: 0.005
  5.   kinematics_solver_timeout: 0.05

接下来再次运行demo.launch,默认加载的就是TRAC-IK运动学插件了,试试规划求解的效率是不是高了很多!

但是TRAC-IK也有问题,它是一种数值算法,每次求解得到的关节位置不一定相同。

 

三、IKFAST

IKFAST是一种基于解析算法的运动学插件,可以保证每次求解的一致性。

7

相比KDL和TRAC-IK,IKFAST的安装过程就比较复杂了,不过就笔者的使用经验来讲,IKFAST的效果还是很推荐的,所以不妨一试,以下就是IKFAST的安装配置过程。

  • 安装程序:

  1. sudo apt-get install cmake g++ git ipython minizip python-dev python-h5py python-numpy python-scipy qt4-dev-tools
  • 安装依赖库:

  1. sudo apt-get install libassimp-dev libavcodec-dev libavformat-dev libavformat-dev libboost-all-dev libboost-date-time-dev libbullet-dev libfaac-dev libglew-dev libgsm1-dev liblapack-dev liblog4cxx-dev libmpfr-dev libode-dev libogg-dev libpcrecpp0v5 libpcre3-dev libqhull-dev libqt4-dev libsoqt-dev-common libsoqt4-dev libswscale-dev libswscale-dev libvorbis-dev libx264-dev libxml2-dev libxvidcore-dev
  • 安装OpenSceneGraph-3.4:

  1. sudo apt-get install libcairo2-dev libjasper-dev libpoppler-glib-dev libsdl2-dev libtiff5-dev libxrandr-dev
  2. git clone https://github.com/openscenegraph/OpenSceneGraph.git --branch OpenSceneGraph-3.4
  3. cd OpenSceneGraph
  4. mkdir build; cd build
  5. cmake .. -DDESIRED_QT_VERSION=4
  6. make -j$(nproc)
  7. sudo make install
  • 安装sympy

  1. pip install --upgrade --user sympy==0.7.1
  • 删除mpmath

  1. sudo apt remove python-mpmath
  • 安装IKFast功能包

  1. sudo apt-get install ros-kinetic-moveit-kinematics
  • 安装OpenRave

  1. sudo apt-get install ros-kinetic-openrave
  • 创建collada文件

  1. export MYROBOT_NAME="marm"
  2. rosrun xacro xacro --inorder -o "$MYROBOT_NAME".urdf "$MYROBOT_NAME".xacro    
  3. rosrun collada_urdf urdf_to_collada "$MYROBOT_NAME".urdf "$MYROBOT_NAME".dae<br></font>

  • 创建dae文件

  1. export IKFAST_PRECISION="5"
  2. cp "$MYROBOT_NAME".dae "$MYROBOT_NAME".backup.dae # create a backup of your full precision dae.
  3. rosrun moveit_kinematics round_collada_numbers.py "$MYROBOT_NAME".dae "$MYROBOT_NAME".dae "$IKFAST_PRECISION"
  • 查看生成的模型

  1. openrave-robot.py "$MYROBOT_NAME".dae --info links

8

  1. openrave "$MYROBOT_NAME".dae

9

  • 生成六轴机器人配置

  1. export PLANNING_GROUP="arm"
  2. export BASE_LINK="1"
  3. export EEF_LINK="11"
  4.  
  5. export IKFAST_OUTPUT_PATH=`pwd`/ikfast61_"$PLANNING_GROUP".cpp
  6.  
  7. python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot="$MYROBOT_NAME".dae --iktype=transform6d --baselink="$BASE_LINK" --eelink="$EEF_LINK" --savefile="$IKFAST_OUTPUT_PATH"
  • 创建插件

  1. export MOVEIT_IK_PLUGIN_PKG="$MYROBOT_NAME"_ikfast_"$PLANNING_GROUP"_plugin
  2. cd ~/catkin_ws/src
  3. catkin_create_pkg "$MOVEIT_IK_PLUGIN_PKG"
  4. rosrun moveit_kinematics create_ikfast_moveit_plugin.py "$MYROBOT_NAME" "$PLANNING_GROUP" "$MOVEIT_IK_PLUGIN_PKG" "$IKFAST_OUTPUT_PATH"
  • 重新编译工作空间

  1. catkin_make
  • 修改使用的插件

  1. rosed "$MYROBOT_NAME"_moveit_config/config/kinematics.yaml
  2.  
  3. <planning_group>:
  4. kinematics_solver: <myrobot_name>_<planning_group>_kinematics/IKFastKinematicsPlugin
  5. -INSTEAD OF-
  6. kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin

注意以上步骤中的机器人名称、运动规划组名称、坐标系序号等需要和自己所使用的机器人匹配,也可以参考官方教程配置:

http://docs.ros.org/kinetic/api/moveit_tutorials/html/doc/ikfast/ikfast_tutorial.html

现在运行demo.launch文件时,使用的运动学插件就是IKFAST了,快试一试效果是不是还不错!


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

本文链接地址: ROS探索总结(五十二)—— MoveIt!中的运动学插件

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

评论

9条评论
  1. Gravatar 头像

    leslie 回复

    胡老师,我在转换模型文件格式时总是提示我没有那个文件,可是他明明在那啊!

  2. Gravatar 头像

    Terence 回复

    古月老师,您好!我在按您上面的步骤将KDL替换为TRAC-IK时,出现了错误,错误如下:
    The kinematics plugin (cute_arm) failed to load. Error: Failed to load library /opt/ros/kinetic/lib//libtrac_ik_kinematics_plugin.so. Make sure that you are calling the PLUGINLIB_EXPORT_CLASS macro in the library code, and that names are consistent between this macro and your XML. Error string: Could not load library (Poco exception = libmoveit_kinematics_base.so.0.9.12: cannot open shared object file: No such file or directory)
    [ERROR] [1530362224.460199466]: Kinematics solver could not be instantiated for joint group cute_arm.
    您知道这是什么原因吗?

    • 古月

      古月 回复

      @Terence 把配置文件里的trac_ik改成大写试试:
      trac_ik_kinematics_plugin/TRAC_IKKinematicsPlugin

      • Gravatar 头像

        mz 回复

        @古月 也遇到了这个问题,看了一下文档(http://docs.ros.org/kinetic/api/moveit_tutorials/html/doc/trac_ik/trac_ik_tutorial.html),里面是这样写的,
        Install trac_ik_kinematics_plugin and trac_ik_lib package or add to your catkin workspace.
        问题应该出在不仅需要安装trac_ik_kinematics_plugin插件,还需要安装trac_ik_lib功能包,或者将trac_ik_lib功能包放置在工作空间下(git clone https://bitbucket.org/traclabs/trac_ik.git),这样就能够使用TRAC_IK求解插件了。

    • Gravatar 头像

      邹俊宇 回复

      @Terence 你把你的moveit更新一下,我也遇到了这个问题
      我输入sudo apt-get install ros-kinetic-moveit-*更新了一下moveit就好了

  3. Gravatar 头像

    bucket 回复

    古月老师您好,我想问下orientation constraint 中的absolute_x_axis_tolerance是相对末端坐标系还是指定的基座坐标系呢?我用的模型是SCARA四自由度机械臂,想实现ros by example 中的那个水平移动末端的案例,但是每次都会报错
    [ WARN] [1530171817.352887298]: RRTConnect: Skipping invalid start state (invalid state)
    [ERROR] [1530171817.352931006]: RRTConnect: Motion planning start tree could not be initialized!
    [ INFO] [1530171817.352958185]: No solution found after 0.000078 seconds
    [ WARN] [1530171817.362828271]: Goal sampling thread never did any work.
    不知道为何说初始状态无效,我把三个轴的容差值都设为3.14还是这个错误,请老师给点思路。谢谢

    • 古月

      古月 回复

      @bucket 这个坐标系是指定的坐标系,指定为base_link就是base_link。
      可以在规划前加一句当前姿态为其实姿态的设置试一下。

  4. Gravatar 头像

    于晓龙 回复

    您好古月老师,运行 openrave-robot.py "$MYROBOT_NAME".dae --info links
    之后出现openravepy is not set into PYTHONPATH env variable 。我尝试添加和git的方法之后仍然存在这样的问题,请问知道怎么解决么?

发表评论

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