模型实机部署肢体碰撞问题优化经验分享

模型实机部署肢体碰撞问题优化经验分享

硅基生命训练师

2026-04-03 发布50 浏览 · 0 点赞 · 0 收藏

1、问题概述

训练后的舞蹈模型部署到实体机器人上,机器人快速收回手臂至胸前的动作,手指会和身体发生碰撞,从而造成灵巧手损坏。本文将围绕如何优化肢体碰撞问题进行展开。

训练后模型replay效果录屏:

训练后模型replay效果截图:

右手碰撞 左手碰撞

实机部署:

2、训练端优化

训练代码下载:

git clone https://gitee.com/leju-robot/LejuLab-Train.git

2.1、修改几何结构模型

2.1.1、几何结构模型引用

首先确认训练环境所引用的机器人几何模型定义位置,如下是LejuLab-Train代码中相关引用关系。

source/leju_robot/leju_robot/tasks/tracking/config/robanS14/dance/__init__.py
->
source/leju_robot/leju_robot/tasks/tracking/config/robanS14/dance/tracking_env_cfg.py
->
source/leju_robot/leju_robot/tasks/tracking/config/robanS14/dance/robanS14.py
->
source/leju_robot/leju_robot/assets/leju.py

leju.py中关于几何结构模型相关定义如下。

asset_path=f"{ASSET_DIR}/robanS14/urdf/robanS14_mini_col.urdf"

通过定义可知训练仿真环境引入的机器人几何结构模型文件路径为

source/leju_robot/leju_robot/assets/robots/robanS14/urdf/robanS14_mini_col.urdf

2.1.2、urdf可视化

安装MuJoCo 官方 Python 绑定库自带的交互式可视化工具,安装命令如下。

pip install mujoco

以独立应用方式启动mujoco可视化窗口

python -m mujoco.viewer

加载urdf文件,拖动urdf文件到mujoco窗口即可查看可视化查看模型。

2.1.3、urdf修改

在urdf文件中搜索arm相关定义,找到手臂末端关节<collision>标签定义的碰撞几何体。相关定义如下。

<link name="zarm_l4_link">
    <!--省略部分代码-->
      <geometry>
        <!-- 手部精细模型 -->
        <mesh filename="../meshes/l_forearm_hand.STL" />
       <!--省略部分代码-->
    <!--手部碰撞体-->
    <collision>
      <origin xyz="0 0 -0.225" rpy="0 0 0" />
      <geometry>
        <capsule radius="0.03" length="0.07" />
      </geometry>
    </collision>
  </link>

上述urdf定义的几何结构效果如下。

模型训练时,碰撞检测使用的是简化的几何形状,而不是视觉网格的精确形状,以提高计算效率。图片中可以看到,胶囊碰撞体未包含手部精细模型,因此模型训练时,手指和身体的碰撞可能未被检测。

增大左手碰撞体尺寸,同时新增碰撞体以包含大拇指,效果如下。

修改urdf手部碰撞体尺寸后,进行模型训练。下图训练曲线中whole_body_tracking_01代码未修改手部碰撞体;whole_body_tracking_02代码增大手部碰撞体尺寸,同时新增胶囊体包含大拇指。



通过训练曲线可以看出,增大碰撞体尺寸,手部碰撞惩罚值也大幅增大。说明未修改碰撞体尺寸之前,存在手部碰撞未被检测和计算。

训练replay效果:

replay效果可以看出,增加手部碰撞体尺寸后,手指和胸口未发生碰撞。

2.2、调整奖励函数

LejuLab-Train代码关于手部接触力奖励项启用定义在source/leju_robot/leju_robot/tasks/tracking/config/robanS14/dance/tracking_env_cfg.py文件中,定义如下

hand_contact_forces = RewTerm(
        func=mdp.body_contact_forces,
        weight=-1, #权重
        params={
            "sensor_cfg": SceneEntityCfg(
                "contact_forces",
                body_names=["zarm_l4_link", "zarm_r4_link"],
            ),
            "force_threshold": 10.0,    #接触力阈值
        },
    )

增大weight和减小force_threshold,可以增大训练时对手部和身体碰撞的惩罚力度。需要注意force_threshold参与惩罚值计算,如果设置太小的话,会导致惩罚值太高。总奖励值为负数,从而终止训练。

手部接触力奖励项计算函数定义在source/leju_robot/leju_robot/tasks/tracking/mdp/rewards.py文件中,force_threshold相关计算代码如下。

(注:本案例对奖励函数做了一定程度修改)

force_velocity_product = contact_force_norm * velocity_norm  # (num_envs, num_feet)
# 对超过阈值的部分进行惩罚,然后对所有脚求和
violation = torch.clamp(force_velocity_product - force_velocity_threshold, min=0.0)  # (num_envs, num_feet)
reward = torch.sum(violation / force_velocity_threshold, dim=1)  # (num_envs,)
return reward
#force_velocity_product < force_velocity_threshold时,violation值为0,返回reward值也为0

基于whole_body_tracking_02代码基础上,修改force_threshold从10.0减小为1.0时,训练曲线如下,对应图中绿色曲线,平均奖励值为负数,然后训练终止。

基于whole_body_tracking_02代码基础上,修改weight从-1.0到-5.0。训练曲线如下,对应图中紫色曲线,惩罚值明显增加,负值更小。

训练replay效果:

replay效果可以看出,增加weight权重值后,手指和胸口未发生碰撞,同时手指和胸口保持一定距离。

3、部署端优化

模型训练完后,需要先sim2sim仿真部署测试后,再sim2real部署到实机。因此需要尽可能的在仿真中发现问题,所以在仿真中,应当减小碰撞体尺寸,观察手部和身体是否碰撞。

部署代码下载:

git clone https://gitee.com/leju-robot/LejuLab-Deploy.git

3.1、仿真部署

3.1.1、几何结构模型引用

首先确认mujoco仿真环境所引用的机器人几何模型定义位置,如下是LejuLab-Deploy代码中相关引用关系。

src/leju_launch/launch/load_mujoco_sim.launch
->
src/leju_assets/models/biped_s14/xml/scene.xml
->
src/leju_assets/models/biped_s14/xml/biped_s14.xml

3.1.2、mujoco仿真

按照LejuLab-Deploy仓库的README.md文档操作,启动mujoco仿真。

如下图所示,mujuco加载xml模型文件后,机器人精细模型为白色,碰撞体为红色部分。

碰撞体过小 碰撞体过大

左图中手指和身体发生碰撞;右边图中由于碰撞体尺寸设置过大,可以看到碰撞体间有相互作用力箭头。为了能够直观查看训练出的模型是否存在碰撞问题,应该减小碰撞体尺寸,通过模型穿模反映碰撞,如左边图所示。

3.2、实机部署

mujoco仿真部署测试后,没有明显碰撞再部署到实机上测试。因为实机的关节电机和结构件,存在不同程度的磨损与变形,所以仿真和环境存在差异,实机之间也存在差异。部署实机之后,需要对参数进行调试优化。

3.2.1、优化控制参数

LejuLab-Deploy仓库中控制器相关配置文件路径如下。

(注:本案例碰撞问题是其他舞蹈,这里仅以config_mimic_HPNY_dance为例,讲解控制器配置文件路径)

src/leju-controllers/leju-rl-controller/config/14/controller_manager.yaml
->
src/leju-controllers/leju-rl-controller/config/14/config_mimic_HPNY_dance.yaml

主要调试的三个参数分别为KP、KD、action_scale。

参数项 作用 调试建议
kp 比例系数
(追踪目标值)
KP高:跟踪更紧、更硬,碰撞时冲击更大。
KP低:更软,能减冲击,但动作可能跟不上目标动作。
kd 阻尼系数
(抑制超调和振荡)
KD 适度增大:能减小“甩手-回弹-二次碰撞”。
KD过大:动作延迟。
action_scale 动作缩放系数
(策略输出动作偏移幅度)
action_scale增大:动作幅度变大、更激进,越偏离策略输出动作。更容易出现手臂扫到躯干、超调、抖动。
action_scale减小:动作幅度变小、更保守,越贴近策略输出动作。碰撞风险降低,但舞蹈表现可能不够顺滑。

本案例中的问题是,机器人快速收回手臂至胸前的动作,手指会和身体发生碰撞。因此分析是手臂arm_2arm_4电机转动角度过大,导致手部末端和身体碰撞。电机的关节顺序如下

由于本案例中,只存在手部和身体碰撞问题,因此只调试手臂arm_2arm_4电机参数。

调试过程总结:

(1)由于碰撞发生在手臂动作范围末端位置,首先增大手臂arm_2arm_4电机kd参数。实机测试碰撞力度减轻,但碰撞仍然存在。

(2)由于初始实机参数是和训练环境参数一致的,为了动作优先紧跟策略输出动作。减小手臂arm_2arm_4电机action_scale参数,减小动作偏离策略动作幅度。实机测试手部和身体未发生碰撞。

(3)若手部动作相比mujoco仿真效果,存在超调则减小kp。

优化参数后实机效果如下:

请前往 登录/注册 即可发表您的看法…