手臂防碰撞功能使用文档
功能包说明
用于检测机器人手臂的碰撞情况, 仅支持机器人双手臂之间的碰撞、机器人手臂与机器人本体之间的碰撞检测, 无外部环境(如障碍物、操作人员、外部设备等)感知及碰撞防护能力, 使用时需确保周围环境无额外干扰。
当启用 “手臂碰撞后自动归位” 功能时, 检测到上述范围内的碰撞后, 将自动控制手臂移动至碰撞发生前 3 秒的姿态位置, 避免碰撞加剧。
自动归位动作完成后, 系统会自动将手臂控制模式切换为"1-保持姿势", 此时手臂将固定在归位后的姿态, 无法通过外部指令直接驱动。
自动归位动作完成后, 若需重新控制手臂, 需重新将手臂控制模式切换为"2-外部控制", 切换完成后方可接收外部控制指令
注意事项
使用前建议参考机器人关节标定文档中的"头部和手臂零点自动标定"章节进行标定, 以确保检测效果准确
碰撞检测并无"预判功能", 具有一定滞后性, 因此用户使用时不建议手臂移动速度过快
用户自行使用此功能包时,如果需要启动碰撞归位功能,需要将原本的目标话题
kuavo_arm_traj和kuavo_arm_target_poses改为/arm_collision/kuavo_arm_traj和/arm_collision/kuavo_arm_target_poses,否则发送碰撞归位时会发送冲突
启动方式
step 1:编译功能包
cd /home/lab/kuavo-ros-opensource
sudo su
catkin build kuavo_arm_collision_check
step 2:修改配置文件
- 若您的机器无手腕相机, 可修改配置文件, 以令检测效果更准确
- 文件位置如下,请根据您的机器版本选择:(若不清楚, 可在下位机终端输入
echo $ROBOT_VERSION查询)- 45版本:
/home/lab/kuavo-ros-opensource/src/kuavo_arm_collision_check/config/s45_collision_config.yaml - 49版本:
/home/lab/kuavo-ros-opensource/src/kuavo_arm_collision_check/config/s49_collision_config.yaml
- 45版本:
- 编辑文件, 将文件结尾添加如下内容即可
ignore_links:
- l_hand_tripod
- r_hand_tripod
step 3:启动手臂碰撞检测程序(并开启碰撞自动归位)
cd /home/lab/kuavo-ros-opensource
sudo su
source devel/setup.bash
roslaunch kuavo_arm_collision_check arm_collision_check.launch arm_collision_enable_arm_moving:=true
step 4.启动 VR 遥操(并启用碰撞检测归位)
确保已按step 3启动手臂碰撞检测程序
cd /home/lab/kuavo-ros-opensource
sudo su
source devel/setup.bash
roslaunch noitom_hi5_hand_udp_python launch_quest3_ik.launch use_arm_collision:=true use_cpp_ik:=false
若以此方式启动VR程序, 则:
- VR 控制手臂发生碰撞时, 会自动将手臂位置恢复到 3 秒前的状态
- 手臂位置恢复到 3 秒前状态后, 手臂会保持在这个位置, VR 手柄需按下 X+A 才可恢复手臂跟踪。
模型文件说明
该节点启动后根据 ROBOT_VERSION 环境变量读取 URDF 文件,并加载相应的 STL 模型。模型加载优先级如下:
- cache 文件夹:优先使用缓存模型(经过处理的模型)
- kuavo_assets:如果上述文件夹中没有 STL 文件,则对 kuavo_assets 内的原始 STL 文件进行膨胀处理, 将处理后的模型文件导入cache 文件夹
注意:当前仅支持 ROBOT_VERSION=45 和 ROBOT_VERSION=49,其他版本可能导致关节不匹配问题。
配置文件说明
- 配置文件路径为:$(find kuavo_arm_collision_check)/config/s$(arg robot_version)_collision_config.yaml
- 45版本:
src/kuavo_arm_collision_check/config/s45_collision_config.yaml - 49版本:
src/kuavo_arm_collision_check/config/s49_collision_config.yaml
- 45版本:
- 如下内容中提到的配置文件均代指这个文件
1. 膨胀系数(Inflation)
- 说明:每个关节或 STL 模型的膨胀系数(单位:米)。膨胀系数用于在碰撞检测时,对模型进行微小放大,以提高安全性和鲁棒性。
inflation:
torso_STL: 0.020
camera_STL: 0.020
...
r_hand_pitch_STL: 0.020
head_yaw_STL: 0.020
head_pitch_STL: 0.020
- 注意事项:
- 为了避免 ROS 参数名称不合法,原文件名中的
.或-已经被替换成_。 - 可以针对不同关节设置不同膨胀系数,例如手臂关节可以略大于腿部关节以增加碰撞安全边界。
- 修改膨胀系数时,需要保证数值在合理范围(一般 0.01~0.05 米),过大可能导致虚假碰撞,过小可能漏检。
- 若修改了某个模型的膨胀系数, 需要删掉
cache 文件夹中的对应模型文件, 这样才会使用新的膨胀系数重新加载模型 - 示例:使用sudo用户删除全部缓存文件:
sudo rm -rf src/kuavo_arm_collision_check/cache/*
- 为了避免 ROS 参数名称不合法,原文件名中的
2. 碰撞过滤规则(Collision Filter)
- 说明:定义不进行碰撞检测的关节对(joint pairs),用于屏蔽机械臂自身相邻关节或特定关节的碰撞检测。
collision_filter:
- [r_hand_tripod, zarm_r5_link]
- [l_hand_tripod, zarm_l5_link]
- 注意事项:
- 列表中每一项是一个关节对 [linkA, linkB]。
- 关节名必须与机器人模型加载时使用的名称一致。
- 当检测到 linkA 与 linkB 时,将跳过该碰撞对。
- 可以根据不同机器人版本或手型添加新的屏蔽规则
- 默认的屏蔽规则是正确的, 除非用户需要在机器人上额外添加物理结构件, 否则无需更改此部分内容
3. 单边 Link 碰撞屏蔽(Ignore Links)
- 说明: ignore_links 用于指定在碰撞检测中完全忽略的 link。 当某个 link 被加入此列表后,它将不会参与任何碰撞检测,适用于一些非关键结构件、辅助支架、传感器模型等。
ignore_links:
- l_hand_tripod
- r_hand_tripod
- 注意事项:
- 列表中每一项为一个 link 名称。
- 被忽略的 link 将不与任何其他 link 进行碰撞检测(包括机器人自身以及环境)。
- 若 ignore_links: 为空(例如仅写成 ignore_links:),则表示无任何 link 被忽略,不影响正常运行。
功能包详细说明
此部分为对手臂碰撞检测包的详细说明
缓存机制
程序首次加载时会使用 OpenMesh 库处理 STL 模型,并将处理后的文件存储在 cache 文件夹内。后续启动将直接使用缓存模型以提高性能。
注意:编译时会清空 cache 文件夹,以防止代码修改导致缓存模型失效。
工作流程
- 加载 STL 文件
- 将 STL 文件内的模型添加为 FCL 的碰撞体
- 订阅 TF,实时更新碰撞体的位姿
- 按照设定频率(默认 5Hz)计算碰撞检测
- 发生碰撞时发布碰撞信息
- 持续记录传感器数据(默认 3 秒)
发布的话题
/arm_collision/info:碰撞信息,包含涉及碰撞的关节名- 消息类型:
kuavo_msgs/armCollisionCheckInfo
- 消息类型:
/arm_collision/check_duration:碰撞检测耗时(毫秒)/arm_collision/markers:用于 RViz 显示的碰撞标记(可选,启用会增大耗时)- 消息类型:
kuavo_msgs/sensorsData
- 消息类型:
/kuavo_arm_target_poses:手臂目标位姿- 消息类型:
kuavo_msgs/armTargetPoses
- 消息类型:
/kuavo_arm_traj:手臂轨迹数据- 消息类型:
sensor_msgs/JointState
- 消息类型:
订阅的话题
/arm_collision/kuavo_arm_traj:手臂轨迹数据- 消息类型:
sensor_msgs/JointState
- 消息类型:
/arm_collision/kuavo_arm_target_poses:手臂目标位姿- 消息类型:
kuavo_msgs/armTargetPoses
- 消息类型:
/sensors_data_raw:原始传感器数据- 消息类型:
kuavo_msgs/sensorsData
- 消息类型:
服务
/arm_collision/wait_complete:等待碰撞回归完成- 服务类型:
std_srvs/SetBool - 用于同步操作,等待当前操作完成
- 服务类型:
/arm_collision/set_arm_moving_enable:设置手臂移动检测启用状态- 服务类型:
std_srvs/SetBool - 动态启用或禁用手臂发生碰撞时移动归位功能
- 服务类型:
节点参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
/arm_collision/check_freq | double | 5.0 | 碰撞检测频率(Hz) |
/arm_collision/publish_collision_markers | bool | false | 是否发布碰撞标记用于 RViz 显示 |
/arm_collision/enable_arm_moving | bool | false | 是否启用手臂碰撞后自动归位 |
/arm_collision/arm_move_diff | double | 0.1 | 手臂移动差异阈值 |
依赖项
- ROS
- FCL (Flexible Collision Library)
- OpenMesh
- kuavo_msgs
- kuavo_common
- tf2_ros
- sensor_msgs
- visualization_msgs
使用示例
启动碰撞检测节点:
roslaunch kuavo_arm_collision_check arm_collision_check.launch查看碰撞信息:
rostopic echo /arm_collision/info在 RViz 中显示碰撞标记:
roslaunch kuavo_arm_collision_check arm_collision_check.launch arm_collision_publish_collision_markers:=true(默认禁用,需要手动启用)
调整检测频率:
roslaunch kuavo_arm_collision_check arm_collision_check.launch arm_collision_check_freq:=10.0禁用手臂移动检测:
roslaunch kuavo_arm_collision_check arm_collision_check.launch arm_collision_enable_arm_moving:=false
故障排除
- 如果碰撞检测频率过低,可以调整
arm_collision_check_freq参数 - 如果模型加载失败,检查 URDF 文件路径和 STL 文件是否存在
- 如果缓存出现问题,可以手动删除
cache文件夹重新生成 - 如果手臂移动检测不工作,检查
enable_arm_moving_check_参数是否正确设置 - 确保
ROBOT_VERSION环境变量已正确设置(当前支持版本 45 49) - 如果传感器数据记录异常,检查
/sensors_data_raw话题是否正常发布 - 如果服务调用失败,检查服务是否正常启动和参数是否正确