pick_ik 运动学求解器
pick_ik 是一个与 MoveIt 2 兼容的逆运动学 (IK) 求解器,由 PickNik Robotics 开发。它旨在提供稳健且可定制的 IK 解,并具备丰富的功能。
pick_ik 中的求解器是 bio_ik 的重新实现,集成了全局优化器和局部优化器。全局优化器利用进化算法在解空间内探索候选解并寻找全局最优解。在全局优化器所得结果的基础上,局部优化器应用梯度下降法对解进行迭代细化。它以全局优化器提供的潜在最优解作为输入,旨在提高其精度并最终收敛到最优解。
在继续之前,请确保你已完成入门指南中概述的步骤。
此外,还需要一个专门为你的机器人定制的 MoveIt 配置包。该包可以使用 MoveIt Setup Assistant 创建。
从二进制包安装
Section titled “从二进制包安装”确保你的 ROS 2 安装已 source,然后运行以下命令:
sudo apt install ros-$ROS_DISTRO-pick-ik创建一个 colcon 工作区。
export COLCON_WS=~/ws_moveit2/mkdir -p $COLCON_WS/src将本仓库克隆到工作区的 src 目录。
cd $COLCON_WS/srcgit clone -b main https://github.com/PickNikRobotics/pick_ik.git设置 colcon mixins。
sudo apt install python3-colcon-common-extensionssudo apt install python3-colcon-mixincolcon mixin add default https://raw.githubusercontent.com/colcon/colcon-mixin-repository/master/index.yamlcolcon mixin update default构建工作区。
cd /path/to/your/workspacecolcon build --mixin release将 pick_ik 用作运动学插件
Section titled “将 pick_ik 用作运动学插件”你可以使用 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 命令行界面动态修改变量值,例如:
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