跳到主要内容

策略模块搬箱子案例

⚠️⚠️⚠️ 注意: 综合案例为参考案例,复杂度较高,使用该案例需要具备相关领域基础知识

⚠️⚠️⚠️ 注意: 综合案例非标准交付功能,仅提供参考

(一)案例介绍

案例功能

  • 基于二维码识别实现箱体与货架的精准定位

  • 完成箱体的抓取、运输及摆放全流程

案例流程逻辑

  • 机器人自主移动至预设箱体位置

  • 机器人头部旋转扫描箱体二维码 → 精确定位 → 接近作业位置

  • 控制机械臂位控与力控结合抓取箱体

  • 自主移动至预设货架位置

  • 头部旋转扫描货架二维码 → 精确定位 → 接近放置位置

  • 完成箱体放置 → 返回起始点

注意: 经测试,使用夹板搬箱子的稳定性更好,因此建议用户将末端执行器更换为夹板

更换夹板说明

夹板物料准备

  • 用户需要自行联系3D打印厂商打印夹板, 推荐使用金属加工, 效果更好

    • gitee仓库模型文件位置: https://gitee.com/leju-robot/kuavo-ros-opensource/tree/master/docs/models
    • 3D打印文件位置: ~/kuavo-ros-opensource/docs/models/手掌板.STEP
    • 2D加工图纸位置: ~/kuavo-ros-opensource/docs/models/手掌板.pdf
  • 关于材质和相关加工要求, 请参考2D加工图纸上的内容

灵巧手更换为夹板

  • 若您的机器的末端执行器是灵巧手,可参考按如下步骤将灵巧手替换为夹板

    • 这里以右手灵巧手更换夹板为例,左手按相同步骤操作即可

    • 拧掉红圈中的螺丝(背面还有一个,共三个),将如图所示外壳拆下 灵巧手换夹板

    • 拧掉红圈中的螺丝(背面还有两个,共四个),将灵巧手拆下(注意要扶住灵巧手防止掉落) 灵巧手换夹板

    • 将灵巧手上的接线拔掉,按住箭头处拔掉即可 灵巧手换夹板

    • 将夹板从下方插入图示结构件中, 并拧紧螺丝(背面还有两个,共四个),安装好夹板(注意夹板安装方向) 灵巧手换夹板

    • 装上第一步拆下的手臂外壳,最终效果如图所示 灵巧手换夹板

自研夹爪更换为夹板

  • 若您的机器的末端执行器是乐聚自研夹爪, 请先打印替换支架并进行替换

    • 替换支架材料文件位置:

      • gitee仓库模型文件位置: https://gitee.com/leju-robot/kuavo-ros-opensource/tree/master/docs/models
      • 3D打印文件位置: ~/kuavo-ros-opensource/docs/models/手掌连接主支架.STEP
      • 2D加工图纸位置: ~/kuavo-ros-opensource/docs/models/手掌连接主支架.pdf
    • 关于材质和相关加工要求, 请参考2D加工图纸上的内容

  • 替换步骤(这里以左臂夹爪为例):

    • 拧掉红圈中的螺丝(两张图片,共五个) 夹爪换灵巧手支架 夹爪换灵巧手支架

    • 使用一字螺丝刀等工具,在箭头处一点点撬开结构件 夹爪换灵巧手支架

    • 撬开结构件后, 拧掉红圈中的螺丝(共四个) 夹爪换灵巧手支架

    • 按压箭头处将夹爪通信线取下,即可卸下夹爪 夹爪换灵巧手支架

    • 卸下夹爪后, 装上替换支架, 其余步骤和灵巧手更换为夹板的步骤相同

案例物料说明

  • 箱子需要用户自行购买, 推荐使用如图所示的塑料折叠箱(箱子尺寸: 外400 300 230mm)

    箱子示例

    推荐箱子购买链接

  • 货架需要用户自行购买, 推荐使用如图所示的货架(需要至少三层, 货架尺寸: 1500 400 2000mm)

    货架示例

    推荐货架购买链接

  • 搬箱子场景搭建物料清单

    搬箱子场景搭建物料清单

视频展示

(二)代码仓库配置

注意: 代码仓库配置只需要执行一次, 后续修改参数后直接重新运行程序即可

上位机代码编译

  • 编译相关功能包:
cd ~/kuavo_ros_application
git checkout opensource/navigation_demo
catkin build apriltag_ros
catkin build kuavo_camera dynamic_biped kuavo_tf2_web_republisher

下位机代码编译

  • 下载依赖环境
# 更新软件源
sudo apt-get update
# grab_box功能包相关依赖
sudo apt-get install ros-noetic-behaviortree-cpp-v3 ros-noetic-roslint ros-noetic-eigen-conversions -y
sudo apt-get install libgeographic-dev ros-noetic-geographic* -y
  • 编译相关功能包:
cd ~/kuavo-ros-opensource
git checkout opensource/kuavo4pro_course_code
sudo su
catkin clean -y
catkin config -DCMAKE_ASM_COMPILER=/usr/bin/as -DCMAKE_BUILD_TYPE=Release
source installed/setup.bash
catkin build humanoid_controllers kuavo_msgs gazebo_sim ar_control grab_box

下位机kuavo-humanoid-sdk安装

cd ~/kuavo-ros-opensource/src/kuavo_humanoid_sdk/
./install.sh

报错解决

  • 若前面几部配置正常无报错, 可跳过此部分

  • 若执行git checkout时报错Please commit your changes or stash them before you switch branches.

    • 原因:本地编译过其他分支的代码或存在自行修改的代码
    • 解决:手动备份自己需要的代码,再执行git reset --hard,就可以运行git checkout切换分支了
  • 若执行git checkout时报错Permission Denied

    • 原因:本地在sudo用户下执行过git操作
    • 解决:下位机执行sudo chmod 777 /home/lab/kuavo-ros-opensource -R,就可以运行git checkout切换分支了
  • 若执行sudo apt update时报错

    • 需要手动更新ros源,按如下步骤操作
    # 删除现有 ROS 密钥
    sudo apt-key del F42ED6FBAB17C654
    # 重新导入 ROS 官方密钥
    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys F42ED6FBAB17C654
    # 更新密钥环
    sudo apt update
    • 之后再执行sudo apt update即可

(三) 预设参数调整

⚠️⚠️⚠️ 注意: 调整参数后建议先在gazebo仿真中进行测试, 确认效果无误后再在实物上运行

文件位置: src/kuavo_humanoid_sdk/examples/strategies/grasp_box_example.py

距离配置

  • 抓取/放置时机器人与 AprilTag 的停靠距离(不能为负数):
GRASP_DISTANCE = 0.28    # 抓取时与AprilTag的距离(米)
PLACE_DISTANCE = 0.53 # 放置时与AprilTag的距离(米)

中间位置配置

  • 放置位置的 AprilTag 在机器人后方时,需要先走到中间位置再转向识别:
MID_POSITION = (-0.5, 0.0)  # 中间位置坐标 (odom坐标系)

箱子与货架二维码配置

  • 粘贴在箱子上的 AprilTag 信息:AprilTag ID、标签尺寸(单位是米)和基于odom坐标系下的大致位姿

    • 用户使用时需将 AprilTag ID 和标签尺寸修改为与实际一致
    target_april_tag = AprilTagData(
    id=[1], # AprilTag ID
    size=[0.1], # AprilTag 标签尺寸
    pose=[PoseQuaternion(
    # TODO: 需要根据实际情况调整
    position=(1.0, 0.0, 0.8), # 基于odom坐标系下的大致位置, 查找时会对齐到这个方向
    orientation=(0.0, 0.0, 0.0, 1.0) # 四元数方向
    )]
    )
  • 粘贴在放置位置(货架)的 AprilTag 信息:AprilTag ID、标签尺寸(单位是米)和基于odom坐标系下的大致位姿

    • 用户使用时需将 AprilTag ID 和标签尺寸修改为与实际一致
    placement_april_tag = AprilTagData(
    id=[2], # 放置位置的AprilTag ID
    size=[0.1], # AprilTag 标签尺寸
    pose=[PoseQuaternion(
    # TODO: 需要根据实际情况调整
    position=(-1.0, 0.0, 0.8), # 放置位置的大致坐标
    orientation=(0.0, 0.0, 1.0, 0.0) # 四元数方向 - 旋转180度
    )]
    )

箱子信息设定

  • 描述箱子信息:宽, 长, 高(单位是米) 和 箱子重量 (单位是kg)
  • 这里以示例中的箱子参数为例, 用户使用时需根据实际情况填写
box_size = (0.3, 0.4, 0.22)  # xyz(宽, 长, 高) 单位是米
box_mass = 1.5 # 箱子重量 (单位是kg)

抓取点偏移配置

  • xyz_offset 为相对于 AprilTag 中心点的偏移量,用于将坐标从标签平面偏移到箱子中心:
box_info = BoxInfo.from_apriltag(
box_tag_data,
xyz_offset=(box_size[0]/2 + 0.03, 0.0, -0.06), # tag粘贴在箱子正面,偏移到箱子中心
size=box_size,
mass=box_mass
)

预设手臂姿态(可以通过手臂软件调整)

  • 手臂在抓取前按顺序经过的预设关节角度(角度制),每组14个关节:左臂7个 + 右臂7个:
ARM_POSES = {
# 安全收起姿态
"side": [
20, 90.8, 0.0, -30, 0.0, 0.0, 0.0, # 左臂
20, -90.8, 0.0, -30, -0.0, 0.0, 0.0 # 右臂
],
"safe": [
7.6, 68.8, 0.0, -90.8, 77.1, 0.0, 0.0, # 左臂
7.6, -68.8, 0.0, -90.8, -77.1, 0.0, 0.0 # 右臂
],
# 手臂抬高准备姿态(避免撞到桌子)
"prepare_high": [
7.6, 68.8, -25.0, -90.8, 77.1, 0.0, 0.0, # 左臂
7.6, -68.8, 25.0, -90.8, -77.1, 0.0, 0.0 # 右臂
],
}

备用放置位置

  • 当无法识别放置位置 AprilTag 时,使用固定坐标作为备用:
placement_pose = KuavoPose(
position=(0.5, 0.0, 0.8), # 目标放置位置坐标(机器人正前方0.5m)
orientation=(0.0, 0.0, 0.0, 1.0) # 目标放置方向(四元数)yaw=0°
)

(四) 实物运行

⚠️⚠️⚠️ 注意: 确保已通过零点工装完成机器人关节标定,参考:机器人关节标定

⚠️⚠️⚠️ 注意: 确保机器人头部零点和手臂零点正确

⚠️⚠️⚠️ 注意: 机器人站立后,建议先执行原地踏步,观察机器人状态,确保机器人状态正常再进行后续操作

⚠️⚠️⚠️ 注意: 当前版本机器人抓取箱子时不会下蹲,箱子所在平台高度需在 0.7m~0.9m 范围内,超出此范围手臂可能无法到达抓取位置

环境配置

  • 上位机需要先修改 ~/kuavo_ros_application/src/ros_vision/detection_apriltag/apriltag_ros/config/tags.yaml 文件, 将 tag 的 size 尺寸修改为实际大小,比如 0.1 米
standalone_tags:
[
{id: 0, size: 0.1, name: 'tag_0'},
{id: 1, size: 0.1, name: 'tag_1'},
{id: 2, size: 0.1, name: 'tag_2'},
{id: 3, size: 0.1, name: 'tag_3'},
{id: 4, size: 0.1, name: 'tag_4'},
{id: 5, size: 0.1, name: 'tag_5'},
{id: 6, size: 0.1, name: 'tag_6'},
{id: 7, size: 0.1, name: 'tag_7'},
{id: 8, size: 0.1, name: 'tag_8'},
{id: 9, size: 0.1, name: 'tag_9'}
]
  • 机器人会以站立时的位置作为其坐标系原点,箱子在坐标系原点的正前方(x正方向),货架在坐标系原点的正后方(x负方向)

启动场景说明

  • 机器人会以站立时的位置作为其坐标系原点,面朝x轴正方向站立

  • 箱子在机器人正前方(x正方向),货架(放置位置)在机器人正后方(x负方向)

  • 机器人站立时,需保证站立位置在箱子与货架之间的连线上,正前方朝向箱子

  • 摆放箱子和货架的详细位置参数

    • 以机器人站立位置为参照,箱子需在机器人正前方约150cm处,箱子需放置于高度 0.7m~0.9m 的平台上(当前版本机器人不会下蹲,超出此范围手臂无法到达),箱子上二维码中心点距地高度约为80cm

    • 以机器人站立位置为参照,货架需在机器人正后方约150cm处,放置层高度约为70cm,货架上二维码中心点距地高度约为180cm

  • 若用户的使用场景与案例中完全一致, 可先按照实物运行参数调整预先调整好参数, 再在实物上运行

上位机运行

  • 上位机打开终端,运行
cd ~/kuavo_ros_application
source devel/setup.bash
# 根据您的机器人版本运行不同的命令
# 旧版4代, 4Pro
roslaunch dynamic_biped load_robot_head.launch
# 标准版, 进阶版, 展厅版, 展厅算力版
roslaunch dynamic_biped load_robot_head.launch use_orbbec:=true
# Max版
roslaunch dynamic_biped load_robot_head.launch use_orbbec:=true enable_wrist_camera:=true
  • 另启一个新终端,运行
cd ~/kuavo_ros_application
source devel/setup.bash
roslaunch kuavo_tf2_web_republisher start_websocket_server.launch

下位机运行

注意:

⚠️⚠️⚠️ 确保已阅读(三) 预设参数调整部分, 并完成相应配置内容的检查

⚠️⚠️⚠️ 受imu飘移及机器人机况影响, 若需要连续搬运, 建议搬运三次后就关掉程序让机器人重新站立, 这样在机况良好的情况下可以达到90%以上的搬箱子成功率

  • 下位机打开终端一,让机器人站立(推荐使用tmux终端, 防止网络问题导致终端断开)
cd ~/kuavo-ros-opensource
sudo su
source devel/setup.bash
roslaunch humanoid_controllers load_kuavo_real.launch joystick_type:=bt2pro
  • 下位机打开终端二,启动Tag Tracker节点
cd ~/kuavo-ros-opensource
sudo su
source devel/setup.bash
roslaunch ar_control robot_strategies.launch real:=true
  • 下位机打开终端三,运行搬箱子示例:

命令行参数说明:

参数说明
--sim仿真模式(实物运行不需要此参数)
--velocity-control使用速度控制模式(运动更平滑,推荐使用)
--wait-for-bottle等待抓水瓶任务完成信号后再开始(用于连续任务)
cd ~/kuavo-ros-opensource
sudo su
source devel/setup.bash
cd src/kuavo_humanoid_sdk/examples/strategies

# 基本运行(默认单步控制模式)
python3 grasp_box_example.py

# 使用速度控制模式(推荐,运动更平滑)
python3 grasp_box_example.py --velocity-control

实物运行参数调整

  • 因为每台机的机况不同, 箱子也可能不同, 因此用户可能需要根据实际情况调整抓取或放置的参数

  • 调整抓取/放置距离GRASP_DISTANCE / PLACE_DISTANCE

    • 若机器人停靠位置与箱子或货架的距离不合适,调整文件顶部的距离配置:
    GRASP_DISTANCE = 0.28    # 抓取时与AprilTag的距离(米)
    PLACE_DISTANCE = 0.53 # 放置时与AprilTag的距离(米)
  • 调整中间位置MID_POSITION

    • 若机器人搬运路径上需要经过不同的中间点,调整:
    MID_POSITION = (-0.5, 0.0)  # 中间位置坐标 (odom坐标系)
  • 若箱子抓取点偏前(机器人的x正方向)

    • 需要调整 xyz_offset 的第一个参数:
    # 调整前
    box_info = BoxInfo.from_apriltag(
    box_tag_data,
    xyz_offset=(box_size[0]/2 + 0.03, 0.0, -0.06),
    size=box_size,
    mass=box_mass
    )
    # 调整示例:x方向减小0.05m
    box_info = BoxInfo.from_apriltag(
    box_tag_data,
    xyz_offset=(box_size[0]/2 + 0.03 - 0.05, 0.0, -0.06),
    size=box_size,
    mass=box_mass
    )
  • 调整手臂预设姿态

    • 若需要调整手臂经过的预设点,修改 ARM_POSES 字典中对应姿态的关节角度(角度制):
    ARM_POSES = {
    "safe": [
    7.6, 68.8, 0.0, -90.8, 77.1, 0.0, 0.0, # 左臂7个关节角度
    7.6, -68.8, 0.0, -90.8, -77.1, 0.0, 0.0 # 右臂7个关节角度
    ],
    }

故障排查

问题解决方案
找不到AprilTag检查标签ID配置(箱子ID=1,放置位置ID=2),检查尺寸配置和光照条件
抓取失败调整 GRASP_DISTANCE 参数或 xyz_offset 偏移量
放置失败调整 PLACE_DISTANCE 参数
行走不稳定使用 --velocity-control 参数,或检查箱子重量和手臂姿态配置
无法识别放置位置检查 MID_POSITION 中间位置设置,确保机器人能转向识别AprilTag
WebSocket连接失败确认 kuavo_tf2_web_republisher 服务已启动
basePitch限制警告程序会自动关闭限制,若仍有问题请检查机器人状态