MoveIt!中的运动学求解器

参考资料:
ROS探索总结(五十二)—— MoveIt!中的运动学插件
Installing OpenRAVE on Ubuntu 14.04

MoveIt!中的运动学求解器

KDL

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

这里写图片描述
这里写图片描述

TRAC-IK

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

ROS的软件源中已经集成了TRAC-IK的安装包,可以直接使用以下命令安装:

sudo apt-get install ros-kinetic-trac-ik-kinematics-plugi

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

IKFAST

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  

生成IKFast插件

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 <myrobot_name>.dae <myrobot_name>.rounded.dae 5

如果你有7自由度手臂,你可以设置 –freeindex参数会有作用
测试你生成的Collada文件

openrave <myrobot_name>.dae

一旦你有Collada文件,就可以用来生成 C++ .h头文件,这个文件包含你机器人的分析IK的解决方案
选择IK类型
你需要选择IK类型,可看这里了解更多,常用的IK类型是transform6d
选择规划组
如果你有多余1个机械臂或规划组用于生成IK解决方案的,先选择其中一个来生成。如下的介绍假设你选择一个来创建插件。一旦你确认插件能正常工作,就可以添加多个,如下添加2个:

<planning_group_name> = "left_arm"
<planning_group_name> = "right_arm"

确定链接数
你需要base_link和end_link之间的IK会计算的link的索引数。如果下面的命令来计算

openrave-robot.py <myrobot_name>.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>

注意:

  1. 与srdf对应,并且需要myrobot_name_moveit_config 对应,程序默认查找这个命名包下的参数文件进行修改
  2. baselink 与前面步骤显示的 index 对应
  3. 是指向ikfast61_.cpp文件的目录
  4. 7自由度手臂,你需要指定一个free link
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 <moveit_ik_plugin_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的文件,可以让你更容易进行升级。

猜你喜欢

转载自blog.csdn.net/qq_36764147/article/details/80563129