< >
Home » MoveIt!入门教程 » MoveIt!入门教程-生成IKFast插件

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
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的文件,可以让你更容易进行升级。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: moveit!入门教程