IKFast

在本节中,我们将逐步讲解如何为 MoveIt 配置一个 IKFast 插件。
什么是 IKFast?
Section titled “什么是 IKFast?”IKFast(机器人运动学编译器)是 Rosen Diankov 的 OpenRAVE 运动规划软件中提供的一个强大逆运动学求解器。IKFast 会自动分析任意复杂的运动学链,寻找可以解析求解的常见模式,并生成 C++ 代码来求解这些模式。 因此,IKFast 提供的解极其稳定,在现代处理器上只需几微秒即可求得。
MoveIt IKFast
Section titled “MoveIt IKFast”MoveIt 提供了相关工具,可使用 OpenRAVE 生成的 cpp 文件为 MoveIt 生成 IKFast 运动学插件。 本教程将引导你完成机器人的相关设置,以利用 IKFast 的强大功能。 MoveIt IKFast 已在 ROS Melodic 上使用 6 自由度和 7 自由度机械臂进行过测试。 虽然理论上可行,但 MoveIt IKFast 目前不支持超过 7 自由度的机械臂。
如果尚未完成,请先完成 Getting Started 中的步骤。
你应该已经使用 Setup Assistant 为你的机器人创建了一个 MoveIt 配置包。
OpenRAVE 是一个与 MoveIt 本身一样复杂的规划框架,安装它很棘手——尤其是因为它的公开文档已经不再维护了。 幸运的是,personalrobotics 提供了一个基于 Ubuntu 14.04 的 Docker 镜像,其中安装了 OpenRAVE 0.9.0 和 ROS Indigo,可以用来一次性生成求解器代码。
本教程中提供的命令会自动下载并启动这个 Docker 镜像,所以目前不需要额外步骤。
创建 IKFast MoveIt 插件
Section titled “创建 IKFast MoveIt 插件”为了方便复制粘贴,我们建议将机器人名称定义为环境变量:
export MYROBOT_NAME="panda_arm"OpenRAVE 使用 Collada 而不是 URDF 来描述机器人。为了自动将机器人的 URDF 转换为 Collada,你需要提供 .urdf 文件。 如果你的 .urdf 文件是由 xacro 文件生成的,可以使用以下命令生成 URDF:
ros2 run xacro xacro -o $MYROBOT_NAME.urdf $MYROBOT_NAME.urdf.xacro选择 IK 类型
Section titled “选择 IK 类型”你需要选择想要求解的 IK 类型。更多信息请参见这个页面。 最常见的 IK 类型是 transform6d。
如果你的机器人有多个机械臂或规划组,并且想为每个组都生成 IKFast 求解器,则需要为每个组重复以下过程。
以下说明假设你已经选定了一个 <planning_group_name>。此外,你还需要知道要求解的运动学链的基座连杆和末端执行器连杆的名称。
生成 IKFast MoveIt 插件
Section titled “生成 IKFast MoveIt 插件”要生成 IKFast MoveIt 插件,请执行以下命令:
ros2 run moveit_kinematics auto_create_ikfast_moveit_plugin.sh --iktype Transform6D $MYROBOT_NAME.urdf <planning_group_name> <base_link> <eef_link>这个过程的速度和成功率取决于你机器人的复杂度。对于基座或腕部有 3 个相交轴的典型 6 自由度机械臂,只需几分钟就能生成求解器代码。关于创建过程的详细说明以及额外的调整方法,请参见调整创建过程。
上述命令会在当前文件夹中创建一个名为 $MYROBOT_NAME_<planning_group_name>_ikfast_plugin 的新 ROS 包。
因此,你需要重新构建工作空间,以便新包被检测到:
colcon buildIKFast 插件可以作为默认 KDL IK 求解器的即插即用替代品,且性能大幅提升。生成脚本应该会自动编辑 MoveIt 配置文件,但在某些情况下可能失败。此时,你可以通过机器人 kinematics.yaml 文件中的 kinematics_solver 参数在 KDL 和 IKFast 求解器之间切换:
编辑以下部分:
<planning_group>: kinematics_solver: <myrobot_name>_<planning_group>_ikfast_plugin/IKFastKinematicsPlugin使用 MoveIt RViz Motion Planning 插件和交互式标记,检查是否能找到正确的 IK 解。
如果未来 MoveIt 或 IKFast 发生变化,你可能需要使用我们的脚本重新生成这个插件。为了方便起见,你的 IKFast MoveIt 包根目录中已自动创建了一个名为 update_ikfast_plugin.sh 的 bash 脚本。该脚本会根据 OpenRAVE 生成的 .cpp 求解器文件重新生成插件。
调整创建过程
Section titled “调整创建过程”创建 IKFast MoveIt 插件的过程包含几个步骤,创建脚本会依次执行:
-
下载 personalrobotics 提供的 Docker 镜像
-
将 ROS URDF 文件转换为 OpenRAVE 所需的 Collada 格式:
Terminal window ros2 run collada_urdf urdf_to_collada $MYROBOT_NAME.urdf $MYROBOT_NAME.dae有时在将 URDF 文件转换为 Collada 时会出现浮点数精度问题,导致 OpenRAVE 无法找到 IK 解。 借助一个工具脚本,可以轻松地将 .dae 文件中的所有数字四舍五入到 n 位小数。 根据经验,我们建议保留 5 位小数。如果 OpenRAVE IKFast 生成器寻找解的时间过长(比如超过一个小时),降低精度通常会有所帮助。例如:
Terminal window ros2 run moveit_kinematics round_collada_numbers.py $MYROBOT_NAME.dae $MYROBOT_NAME.rounded.dae 5 -
运行 OpenRAVE IKFast 工具生成 C++ 求解器代码
-
创建封装所生成求解器的 MoveIt IKFast 插件包
auto_create_ikfast_moveit_plugin.sh 脚本会根据输入文件的扩展名来判断要执行哪些步骤。若要从任意中间步骤重新运行该脚本(例如在调整过 .dae 文件的精度之后),只需将上一步的输出(.dae 或 .cpp)作为输入,而不是最初的 .urdf 文件。