跳到主要内容

手臂正逆运动学案例

说明

  • 路径:<kuavo-ros-opensource>/src/manipulation_nodes/motion_capture_ik

编译

catkin build motion_capture_ik

启动

启动参数

以下是 IK 模块启动时可选的参数:

  • visualize : 是否在 Rviz 中可视化, 默认值为 false
  • robot_version : 机器人版本号, 默认值为 ROBOT_VERSION 环境变量
  • control_hand_side : 用于设置控制对应的左右手臂, 0 为只控制左手, 1 为只控制右手, 2 为控制双手, 默认值为 2
  • eef_z_bias : 末端执行器 z 坐标的偏置, 默认值为 -0.17, 单位 m
  • model_path : IK 求解时加载的 URDF 文件路径, 一般无需手动设置, 默认会从 kuavo_assets 包下根据 robot_version 搜索设置
  • model_path_vis : 在 RVIZ 中可视化时加载的 URDF 文件, 一般无需手动设置, 默认会从 kuavo_assets 包下根据 robot_version 搜索设置
  • print_ik_info : 是否在终端打印求解的调试信息, 默认值为 false

启动示例

版本号为 43 的机器人, 且开启可视化:

source devel/setup.bash
roslaunch motion_capture_ik ik_node.launch robot_version:=43 visualize:=1 print_ik_info:=false

只求解右臂且不可视化 (robot_version 为环境变量中 ROBOT_VERSION):

source devel/setup.bash
roslaunch motion_capture_ik ik_node.launch control_hand_side:=1

ROS 接口

话题

订阅的话题

/ik/two_arm_hand_pose_cmd

话题描述: 手臂 IK 求解话题

消息类型: motion_capture_ik/twoArmHandPoseCmd

字段类型描述
hand_posestwoArmHandPose双手信息: 末端位置, 末端四元数, 手肘位置等
use_custom_ik_parambool是否使用自定义的 IK 参数, 设置为 true 时 会使用消息中的 ik_param 值用于求解
joint_angles_as_q0bool是否使用 hand_poses 中的 joint_angles 作为求解时的 q0
ik_paramikSolveParam自定义的 IK 求解参数

对于 ik_param 字段详细描述如下:

字段类型描述
major_optimality_tolfloat64snopt 参数, 即主要迭代中优化性的容差, 该参数决定最优性条件的满足程度
major_feasibility_tolfloat64snopt 参数, 即主要迭代中的可行性容差, 用于控制非线性约束
minor_feasibility_tolfloat64snopt 参数, 次要迭代中的可行性容差,主要用于线性化后的模型
major_iterations_limitfloat64snopt 参数, 主要迭代的最大次数
oritation_constraint_tolfloat64姿态约束参数
pos_constraint_tolfloat64位置约束参数, 该参数只会在 pos_cost_weight 大于 0.0 时生效
pos_cost_weightfloat64位置成本参数, 当设置成 0.0 时求解精度要求最高

如果您期望更高精度的 IK 求解, 可将 pos_cost_weight 设置成 0.0, 但与此同时也会降低求解成功的概率.

对于 hand_poses 字段详细描述如下:

字段类型描述
pos_xyzfloat64[3]末端期望的位置, 单位 m
quat_xyzwfloat64[4]末端期望的姿态
elbow_pos_xyzfloat64[3]手肘期望的位置, 全设置为 0.0 时忽略该参数
joint_anglesfloat64[7]如果 joint_angles_as_q0 为 true, 则使用该值作为求解时的 q0, 单位弧度

发布的话题

/ik/result

话题描述: 发布 IK 求解的结果

消息类型: motion_capture_ik/twoArmHandPose

发布 IK 结果中左右手的结果,

字段类型描述
pos_xyzfloat64[3]末端位置, 单位 m
quat_xyzwfloat64[4]末端姿态
elbow_pos_xyzfloat64[3]手肘位置, 单位 m
joint_anglesfloat64[7]手臂关节值, 单位弧度
/ik/debug/time_cost

话题描述: 可忽略, 主要调试输出求解耗时信息, 单位毫秒

消息类型: std_msgs/Float32MultiArray

  • data[0] : 循环耗时, 单位毫秒
  • data[1] : 解算耗时, 单位毫秒
/kuavo_arm_traj

话题描述: 当通过 /ik/two_arm_hand_pose_cmd 话题调用时, 有结果便会输出, 单位弧度

消息类型: sensor_msgs/JointState

服务

/ik/two_arm_hand_pose_cmd_srv

话题描述: IK 逆解服务

消息类型: motion_capture_ik/twoArmHandPoseCmdSrv

请求参数:

字段类型描述
twoArmHandPoseCmdRequesttwoArmHandPoseCmd详情请参考 /ik/two_arm_hand_pose_cmd 话题的内容

返回结果:

字段类型描述
successbool是否成功
with_torsobool是否包含躯干
q_armfloat64[]手臂关节值, 单位弧度
q_torsofloat64[]躯干的关节值
time_costfloat64求解耗时, 单位 ms
hand_posestwoArmHandPoseIK 求解结果, 具体内容见上述同类型消息
/ik/fk_srv

话题描述: FK 正解服务

消息类型: motion_capture_ik/fkSrv

字段类型描述
qfloat64[]长度为 14 ,内容为手臂关节的角度, 单位弧度
successbool返回参数, 是否成功
hand_posestwoArmHandPose返回参数, 正解结果, 具体内容见上述同类型消息

使用示例

  • 使用 IK 求解服务

以下代码展示了如何调用 IK 服务, 并打印返回的结果, 可通过运行如下命令调用:

source devel/setup.bash
rosrun motion_capture_ik example_ik_srv.py
  • 使用 IK 求解话题

以下代码展示了如何通过 IK 话题使用 IK 功能, 并打印返回的结果, 可通过运行如下命令调用:

source devel/setup.bash
rosrun motion_capture_ik example_ik.py
  • 使用 FK 求解服务

以下代码展示了如何调用 FK 服务, 并打印返回的结果, 可通过运行如下命令调用:

source devel/setup.bash
rosrun motion_capture_ik example_fk_srv.py