参考资料:
ROS探索总结(五十二)—— MoveIt!中的运动学插件
Installing OpenRAVE on Ubuntu 14.04
Kinematics and Dynamics Library (KDL)是MoveIt!中的默认运动学插件,在使用MoveIt! Setup Assistant进行模型配置时,可以进行配置。
TRAC-IK和KDL类似,也是一种基于数值解的运动学插件,但是在算法层面上进行了很多改进,求解效率高了很多。比如在下边这张图中,左侧的红点是KDL无法求解的姿态点,但是在右侧使用TRAC-IK是可以求解的。
ROS的软件源中已经集成了TRAC-IK的安装包,可以直接使用以下命令安装:
sudo apt-get install ros-kinetic-trac-ik-kinematics-plugi
但是TRAC-IK也有问题,它是一种数值算法,每次求解得到的关节位置不一定相同。
IKFAST是一种基于解析算法的运动学插件,可以保证每次求解的一致性。
配置过程:
OpenRAVE提供了一个机器人运动规划算法测试开发环境,专注于运动规划相关的运动仿真和分析。并且OpenRAVE的独立特行使他能集成到任何现存的机器人系统中。本文安装OpenRAVE主要是为应用其中的IKFast插件,根据机器人构型生成特定的运动学求解器,在ROS 中用于MoveIt运动规划仿真。
最好安装OpenRAVE的方式是从源码安装,根据官方教程上安装会出现很多错误,因为OpenRAVE在不断更新,官方教程没实时更新。
首先确保安装了以下项目
sudo apt-get install cmake g++ git qt4-dev-tools zlib-bin
sudo apt-get install ipython python-dev python-h5py python-numpy python-scipy python-sympy
安装依赖库
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 libmpfr-dev libode-dev libogg-dev libopenscenegraph-dev libpcre3-dev libpcrecpp0 libqhull-dev libqt4-dev libsoqt-dev-common libsoqt4-dev libswscale-dev libswscale-dev libvorbis-dev libx264-dev libxml2-dev libxvidcore-dev
唯一从openrave ppa 上可以安装的包是 collada-dom
sudo add-apt-repository ppa:openrave/release
sudo sh -c 'echo "deb-src http://ppa.launchpad.net/openrave/release/ubuntu `lsb_release -cs` main" >> /etc/apt/sources.list.d/openrave-release-`lsb_release -cs`.list'
sudo apt-get update
sudo apt-get install collada-dom-dev
从源文件安装
git clone https://github.com/rdiankov/openrave.git
并编译
cd openrave
mkdir build
cd build
cmake ..
make
sudo make install
编译过程会遇到错误,诸如
openrave/plugins/bulletrave/bulletcollision.h: In member function
‘bool BulletCollisionChecker::CheckCollisionP(btOverlapFilterCallback,
OpenRAVE::CollisionReportPtr)’:
openrave/plugins/bulletrave/bulletcollision.h:335:25: error: ‘class
OpenRAVE::CollisionReport’ has no member named ‘numCols’
只需要到openrave/plugin/cmakefile 文件中将 bulletrave 注释掉,我这里还注释掉了fclrave。
将openrave 的bash文件加到添加到系统环境( .bashrc)
最后一行加入以下路径代码
source /usr/local/share/openrave-0.9/openrave.bash
3.运行实例
openrave0.9.py --example hanoi
MoveIt! IKFast 安装
源安装:(在catkin工作空间)
git clone https://github.com/ros-planning/moveit_ikfast.git
OpenRAVE 安装
参考前面环境配置过程
创建Collada文件
首先需要基于Collada or OpenRave的格式机器人描述文件,如果你机器人不是这个格式,推荐创建URDF文件。然后用如下命令转化成Collada.dae文件
rosrun collada_urdf urdf_to_collada <myrobot_name>.urdf <myrobot_name>.dae
rosrun moveit_ikfast round_collada_numbers.py <input_dae> <output_dae> <decimal places>
依据经验,推荐设置为5位小数,如果OpenRave ikfast生成器花太长时间来找到解决方案的话,减少位数应该有帮助。
rosrun moveit_ikfast round_collada_numbers.py .dae .rounded.dae 5
如果你有7自由度手臂,你可以设置 –freeindex参数会有作用
测试你生成的Collada文件
openrave <myrobot_name>.dae
一旦你有Collada文件,就可以用来生成 C++ .h头文件,这个文件包含你机器人的分析IK的解决方案
选择IK类型
你需要选择IK类型,可看这里了解更多,常用的IK类型是transform6d
选择规划组
如果你有多余1个机械臂或规划组用于生成IK解决方案的,先选择其中一个来生成。如下的介绍假设你选择一个来创建插件。一旦你确认插件能正常工作,就可以添加多个,如下添加2个:
= "left_arm"
= "right_arm"
确定链接数
你需要base_link和end_link之间的IK会计算的link的索引数。如果下面的命令来计算
openrave-robot.py .dae --info links
按照ROS规范的要求,典型的6自由度机械手应该有6个臂连杆+虚拟base_link。如果模型中没有额外的链接,则给出:baselink = 0和eelink = 6。通常,将提供额外的tool_link来定位抓握/工具框架,从而给出eelink = 7。
生成IK求解(解算)
python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot=<myrobot_name>.dae --iktype=transform6d --baselink=1 --eelink=8 --savefile=<ikfast_output_path>
注意:
python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot=<myrobot_name>.dae --iktype=transform6d --baselink=1 --eelink=8 --freeindex=4 --savefile=<ikfast_output_path>
这个过程的速度和成功将取决于你的机器人的复杂性。一个典型固定在基座或手腕3相交轴的6自由度机械手将只需要几分钟的时间来生成IK。
已知问题: –freeindex参数有一个Bug, 不能正确处理树索引. 就是说–baselink=2 –eelink=16 和连接数从3-9不能正确关联到目前的规划组链。在这种情况下–freeindex期望指数2为链接2,但指数3为链接10…和索引9作为链接16。
创建插件
创建包含IK插件的包,推荐名为ikfast_plugin。那么我们只需引用就可以使用IKFast包
cd ~/catkin_ws/src
catkin_create_pkg
cd ~/catkin_ws
catkin_make
创建插件源码
rosrun moveit_ikfast create_ikfast_moveit_plugin.py <myrobot_name> <planning_group_name> <moveit_ik_plugin_pkg> <ikfast_output_path>
非ROS方式
python /path/to/create_ikfast_moveit_plugin.py <myrobot_name> <planning_group_name>
再次编译,生成插件
这会生成新插件库lib/lib__moveit_ikfast_moveit_plugin.so,让MoveIt使用的。
更新插件
将来MoveIt!或IKFast发生变化,你可能需要使用我们脚本重新生成插件,在你的IK插件包有名为update_ikfast_plugin.sh的文件,可以让你更容易进行升级。