Skip to content

TRAC-IK 运动学求解器

TRAC-IK 是由 TRACLabs 开发的逆运动学求解器,它通过多线程并发运行两种 IK 实现来获得比常见开源 IK 求解器更可靠的解。以下引用自其文档:

(TRAC-IK) 提供了 KDL 中流行的逆雅可比方法之外的另一种逆运动学求解器。 具体来说,KDL 的收敛算法基于牛顿法,而牛顿法在存在关节限位时效果不佳——这对许多机器人平台来说都很常见。 TRAC-IK 并发运行两种 IK 实现。 一种是 KDL 基于牛顿法的收敛算法的简单扩展,通过随机跳跃来检测并缓解由关节限位引起的局部最小值。 第二种是 SQP(序列二次规划)非线性优化方法,它使用能更好地处理关节限位的拟牛顿法。 默认情况下,当这两种算法中的任何一种收敛到答案时,IK 搜索会立即返回。 此外还提供了距离和可操作性(manipulability)的次要约束,以便返回”最佳”IK 解。

包 trac_ik_kinematics_plugin 提供了一个可以替代默认 KDL 求解器的 KinematicsBase MoveIt 接口。目前不支持模仿关节(mimic joints)。

TRAC-IK 仓库的 rolling 分支拥有最新的 ROS 2 实现,但它也可以作为二进制包使用。

如果你想从源码构建,请进入你的 ROS 2 工作区,例如 ~/moveit2_ws:

Terminal window
cd ~/moveit2_ws/src
git clone -b rolling https://bitbucket.org/traclabs/trac_ik.git
  • 找到为你的机器人创建的 MoveIt 运动学配置教程(kinematics.yaml)文件。

  • 将 kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin(或类似的)替换为 kinematics_solver: trac_ik_kinematics_plugin/TRAC_IKKinematicsPlugin。

  • 确保在你的包对应的 package.xml 文件中添加 <depend>trac_ik_kinematics_plugin</depend> 标签。

  • 按需设置参数:

    • kinematics_solver_timeout(以秒为单位的超时时间,例如 0.005)和 position_only_ik 是受支持的。
    • solve_type 可以是 Speed、Distance、Manip1、Manip2(详情见下文)。默认为 Speed。
    • epsilon 是用于确定有效解的笛卡尔误差距离。默认为 1e-5。
    • kinematics_solver_attempts 参数不是必需的:与 KDL 不同,TRAC-IK 求解器在卡住时已经会自动重启。
    • kinematics_solver_search_resolution 在此不适用。

以下关于求解类型参数的信息来自 trac_ik_lib 包文档(略有修改):

  • Speed:非常快速地返回找到的第一个解。
  • Distance:运行完整的超时时间,然后返回使种子点误差平方和 (SSE) 最小的解。
  • Manip1:运行完整超时时间,返回使 sqrt(det(J*J^T))(雅可比矩阵奇异值的乘积)最大化的解。
  • Manip2:运行完整超时时间,返回使雅可比矩阵最小与最大奇异值之比最小化的解。