MoveIt!入门教程-生成IKFast插件
MoveIt!入门教程-生成IKFast插件
说明
- 这章为MoveIt!生成IKFast插件
什么是IKFast
- 来自维基百科解释:ikfast,机器人运动学的编译器,在Rosen Diankov OpenRAVE运动规划软件提供,是一个强大的逆运动学求解器。不像大多数的逆运动学求解,ikfast可以求解任意复杂运动链的运动学方程,并产生特定语言的文件(如C++)后供使用。最终的结果是非常稳定的解决方案,在最新的处理器能以5微秒的速度完成运算。
MoveIt! IKFast
- MoveIt! IKFast是一种可利用OpenRAVE生成的cpp文件来生成 IKFast 运动学插件的工具。
- 本章指导如何在机器人使用IKFast强大功能
- MoveIt! IKFast测试环境是ROS Groovy,使用catkin编译,使用带有6dof和7dof的机器臂的OpenRave 0.8 。
- 理论上可以工作在任何自动度的机械臂,但目前 IKFast插件生成器不能工作在大于7自动度的机械臂上。
准备
- 应该已经通过MoveIt!配置助手生成MoveIt!配置包
MoveIt! IKFast 安装
两种安装方式:二进制debs包或源安装
Binary Install:
sudo apt-get install ros-indigo-moveit-ikfast
- 源安装:(在catkin工作空间)
git clone https://github.com/ros-planning/moveit_ikfast.git
OpenRAVE 安装
- Binary Install (only Indigo / Ubuntu 14.04)
sudo apt-get install ros-indigo-openrave
注意: 你必需设置 export PYTHONPATH=$PYTHONPATH:`openrave-config –python-dir (2016.9.1)
源安装:(来自Stéphane Caron的介绍)
git clone --branch latest_stable https://github.com/rdiankov/openrave.git
cd openrave && mkdir build && cd build
cmake ..
make -j4
sudo make install
创建Collada文件
- 首先需要基于Collada or OpenRave的格式机器人描述文件
- 如果你机器人不是这个格式,推荐创建URDF文件。然后用如下命令转化成Collada.dae文件
rosrun collada_urdf urdf_to_collada <myrobot_name>.urdf <myrobot_name>.dae
- <myrobot_name> 为你机器人名称
- URDF文件转换成Collada文件,常会出现浮点的问题。因此创建一个脚本来将所有的数字转换成x位小数再写入到Collada文件,你可以忽略这个脚本,使用默认转换的文件。如果生成器要花太长时间,比如说,1小时,那么就可尝试:
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
在你生成的Collada文件查看links
你可能需要安装libsoqt4-dev来让下面的命令显示
openrave-robot.py <myrobot_name>.dae --info links
如果你有7自由度手臂,你可以设置 –freeindex参数会有作用
测试你生成的Collada文件
openrave <myrobot_name>.dae
创建IKFast解决方法的CPP文件
- 一旦你有Collada文件,就可以用来生成 C++ .h头文件,这个文件包含你机器人的分析IK的解决方案
选择IK类型
- 你需要选择IK类型,可看这里了解更多,常用的IK类型是transform6d
选择规划组
- 如果你有多余1个机械臂或规划组用于生成IK解决方案的,先选择其中一个来生成。如下的介绍假设你选择一个<planning_group_name>来创建插件。一旦你确认插件能正常工作,就可以添加多个,如下添加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
A typical 6-DOF manipulator should have 6 arm links + a dummy base_link as required by ROS specifications. If no extra links are present in the model, this gives: baselink=0 and eelink=6. Often, an additional tool_link will be provided to position the grasp/tool frame, giving eelink=7.
The manipulator below also has another dummy mounting_link, giving baselink=1 and eelink=8.
name | index | parents |
---|---|---|
base_link | 0 | |
mounting_link | 1 | base_link |
link1_rotate | 2 | mounting_link |
link2 | 3 | link1_rotate |
link3 | 4 | link2 |
link4 | 5 | link3 |
link5 | 6 | link4 |
link6_wrist | 7 | link5 |
tool_link | 8 | link6_wrist |
生成IK求解(解算)
- 生成IK解决方案
python `openrave-config --python-dir`/openravepy/_openravepy_/ikfast.py --robot=<myrobot_name>.dae --iktype=transform6d --baselink=1 --eelink=8 --savefile=<ikfast_output_path>
- <ikfast_output_path>是指向ikfast61_<planning_group_name>.cpp文件的目录
- 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。
对于5和7自由度机械手,可以咨询 OpenRAVE 邮件列表和ROS Answers了解更多信息。
创建插件
- 创建包含IK插件的包,推荐名为<myrobot_name>ikfast<planning_group_name>_plugin。那么我们只需引用<moveit_ik_plugin_pkg>就可以使用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>
<moveit_ik_plugin_pkg> <ikfast_output_path>
参数
- myrobot_name - name of robot as in your URDF
- planning_group_name - name of the planning group you would like to use this solver for, as referenced in your SRDF and kinematics.yaml
- moveit_ik_plugin_pkg - name of the new package you just created
- ikfast_output_path - file path to the location of your generated IKFast output.cpp file
这会在src/目录生成新的源码在<myrobot_name>_<planning_group_name>_ikfast_moveit_plugin.cpp文件
再次编译,生成插件
cd ~/catkin_ws
catkin_make
- 这会生成新插件库lib/lib<myrobot_name>_<planning_group_name>_moveit_ikfast_moveit_plugin.so,让MoveIt使用的。
使用
- ikfast插件应该与默认的KDLIK求解器具有相同的功能,但大大提高了性能。MOVEit的配置文件是由moveit_ikfast脚本自动编辑,但是你可以在机器人的kinematics.yaml文件中通过kinematics_solver参数,在KDL和ikfast求解器之间切换。
rosed <myrobot_name>_moveit_config/config/kinematics.yaml
- 更改如下部分:
<planning_group_name>:
kinematics_solver: <myrobot_name>_<planning_group_name>_kinematics/IKFastKinematicsPlugin
-INSTEAD OF-
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
测试插件
- 使用MoveIt Rviz的运动规划插件,同时使用交互标记来看是否有正确IK解决方案
更新插件
- 将来MoveIt!或IKFast发生变化,你可能需要使用我们脚本重新生成插件,在你的IK插件包有名为update_ikfast_plugin.sh的文件,可以让你更容易进行升级。
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号