Skip to content

pick_ik 运动学求解器

pick_ik 是一个与 MoveIt 2 兼容的逆运动学 (IK) 求解器,由 PickNik Robotics 开发。它旨在提供稳健且可定制的 IK 解,并具备丰富的功能。

pick_ik 中的求解器是 bio_ik 的重新实现,集成了全局优化器和局部优化器。全局优化器利用进化算法在解空间内探索候选解并寻找全局最优解。在全局优化器所得结果的基础上,局部优化器应用梯度下降法对解进行迭代细化。它以全局优化器提供的潜在最优解作为输入,旨在提高其精度并最终收敛到最优解。

在继续之前,请确保你已完成入门指南中概述的步骤。

此外,还需要一个专门为你的机器人定制的 MoveIt 配置包。该包可以使用 MoveIt Setup Assistant 创建。

确保你的 ROS 2 安装已 source,然后运行以下命令:

Terminal window
sudo apt install ros-$ROS_DISTRO-pick-ik

创建一个 colcon 工作区。

Terminal window
export COLCON_WS=~/ws_moveit2/
mkdir -p $COLCON_WS/src

将本仓库克隆到工作区的 src 目录。

Terminal window
cd $COLCON_WS/src
git clone -b main https://github.com/PickNikRobotics/pick_ik.git

设置 colcon mixins。

Terminal window
sudo apt install python3-colcon-common-extensions
sudo apt install python3-colcon-mixin
colcon mixin add default https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yaml
colcon mixin update default

构建工作区。

Terminal window
cd /path/to/your/workspace
colcon build --mixin release

你可以使用 MoveIt Setup Assistant 为你的机器人创建配置文件以供 MoveIt 使用,或者直接编辑机器人 config 目录中的 kinematics.yaml 文件,将 pick_ik 用作 IK 求解器:

panda_arm:
kinematics_solver: pick_ik/PickIkPlugin
kinematics_solver_timeout: 0.05
kinematics_solver_attempts: 3
mode: global
position_scale: 1.0
rotation_scale: 0.5
position_threshold: 0.001
orientation_threshold: 0.01
cost_threshold: 0.001
minimal_displacement_weight: 0.0
gd_step_size: 0.0001

注意:安装 pick_ik 后,你也可以使用以下命令启动一个预配置的演示:

Terminal window
ros2 launch moveit2_tutorials demo_pick_ik.launch.py

该命令启动的演示与 RViz 快速入门 教程中的演示类似,不过它专门使用了位于 moveit2_tutorials/doc/pick_ik/config 目录的机器人运动学配置文件 kinematics_pick_ik.yaml(这里)。

有关参数的完整列表,请参阅参数 YAML 文件。

以下是一些你可能想先了解的关键参数:

  • mode:选择 local 时,求解器仅进行局部梯度下降;选择 global 时,还会启用进化算法。全局求解器性能较差,但如果你难以摆脱局部最小值,它可能会有所帮助。建议在相对运动、笛卡尔插值、端点点动(endpoint jogging)等场景使用 local,而在需要求解与初始条件差距较大的目标时使用 global。

  • memetic_<property>:所有仅在 global 求解器下才生效的属性。关键是 memetic_num_threads,因为进化算法已启用多线程求解。

  • position_threshold / orientation_threshold:只有当位姿差分别小于这些阈值(以米和弧度为单位)时,优化才算成功。position_threshold 为 0.001 意味着 1 毫米的精度,orientation_threshold 为 0.01 意味着 0.01 弧度的精度。

  • cost_threshold:该求解器会根据位姿距离、关节相对于初始猜测的移动量以及你添加的自定义代价函数来构建代价函数。只有当代价小于 cost_threshold 时优化才算成功。请注意,如果你添加了自定义代价函数,可能需要将此阈值设置得相当高,转而依靠 position_threshold 和 orientation_threshold 作为决定性因素,此参数则作为参考。

  • approximate_solution_position_threshold / approximate_solution_orientation_threshold:在端点伺服(endpoint servoing)等应用中使用近似 IK 解时,pick_ik 有时可能返回与目标坐标系相差甚远的解。为防止此类解跳变带来的问题,这些参数定义了最大平移和旋转位移。建议在大多数应用中将此设置为几厘米和几度左右。

  • position_scale:如果你只想要旋转 IK,将其设为 0.0。如果你想求解自定义的 IKCostFn(在 setFromIK() 调用中提供),请将 position_scale 和 rotation_scale 都设为 0.0。你也可以使用任何其他值来加权位置目标——它是代价函数的一部分。请注意,如果你使用 position_scale = 0.0,任何使用 position_threshold 的检查都将被忽略。

  • rotation_scale:如果你只想要位置 IK,将其设为 0.0。如果你想同等对待位置和方向,将其设为 1.0。你也可以使用介于两者之间的任何值——它是代价函数的一部分。请注意,如果你使用 rotation_scale = 0.0,任何使用 orientation_threshold 的检查都将被忽略。

  • minimal_displacement_weight:这是标准的代价函数之一,用于检查初始猜测与解之间的关节角度差。如果你需要求解远距离目标,请将其保持为零,否则它会无故抬高代价。如果你在进行沿路径的笛卡尔插值或用于伺服的端点点动,请将其设为一个小的非零值(例如 0.001)。

你可以在 RViz 中实时测试此求解器,因为该插件使用 generate_parameter_library 包来响应每次求解时的参数变更。这意味着你可以使用 ROS 2 命令行界面动态修改变量值,例如:

Terminal window
ros2 param set /rviz2 robot_description_kinematics.panda_arm.mode global
ros2 param set /rviz2 robot_description_kinematics.panda_arm.minimal_displacement_weight 0.001