策略与参数调优
本页整理原快速开始中的策略替换、LQR 参数和姿态控制配置,供已经完成基础连接的开发者查阅。
修改前先确认
参数与策略取决于机器人构型及交付版本。修改前备份现有配置,按产品安全说明开展实机验证。下方保留原手册示例,不代表适用于所有设备。
策略替换
将你的policy拷贝在对应的文件夹下,例如test.onnx放在
双足/opt/d1_ros2/share/rl_controller/config/d1h
四足/opt/d1_ros2/share/rl_controller/config/d1
修改配置文件 以双轮足为例,vim /opt/d1_ros2/share/rl_controller/config/d1h/controller.yaml如下,在rl_policy_names中插入你的策略,例如test_policy,然后在rl_policy_names最下面新增字段如下所示。或者直接修改原有的策略,例如双轮足下的rl_climb字段
...
rl_policy_names:
...
- "test_policy"
...
test_policy:
policy_path: config/d1h/test.onnx
output_name: "nn_output"
# env
num_obs: 31
num_actions: 8
history_len: 10
observations_name: ["ang_vel", "gravity", "commands", "dof_pos_nwp", "dof_vel", "last_actions"]
commands_name: ["lin_vel_x", "lin_vel_y", "ang_vel_z"]
commands_scale: [2.0, 2.0, 0.25] # lin_vel_scale, lin_vel_scale, ang_vel_scale
max_commands: [1.0, 0.7, 1.0]
min_commands: [-0.5, -0.7, -1.0]
commands_comp: [0.0, 0.0, 0.0] # direct add offset to command
# control parameters
time_interval: 0.02 # forward thread seconds
default_joint_angles: [0.0, 0.8, -1.5, 0.0, 0.0, 0.8, -1.5, 0.0]
joint_kp: [40.0, 40.0, 40.0, 10.0, 40.0, 40.0, 40.0, 10.0]
joint_kd: [1.2, 1.2, 1.2, 0.6, 1.2, 1.2, 1.2, 0.6]
action_scales: [ 0.25, 0.5, 0.5, 0.5, 0.25, 0.5, 0.5, 0.5 ]
lin_vel_scale: 2.0
ang_vel_scale: 0.25
dof_pos_scale: 1.0
dof_vel_scale: 0.05
# Compensation items
output_torque_scale: 1.0
修改后重启service,systemctl restart d1_bringup后,查看journal中是否有正确加载在对应按键上journalctl -u d1_bringup
[×××_d1-5] [INFO] [2026-01-30 18:27:10] [d1h_rl_controller]: Get policy: /opt/d1_ros2/share/rl_controller/config/d1h/test.onnx in "rl_1" fsm
四足换策略 vim /opt/d1_ros2/share/rl_controller/config/d1/controller.yaml如下,在rl_policy_names中插入你的策略,例如rl_flat_lab2,然后在rl_policy_names最下面新增字段如下所示。
rl_policy_names:
...
- "rl_flat_lab2"
rl_flat_lab2:
policy_path: config/d1/flat_lab18.onnx
output_name: "nn_output"
control_type: "P_V"
# env
num_obs: 57
num_actions: 16
history_len: 10
decimation: 8
observations_name: ["ang_vel", "gravity", "commands", "dof_pos", "dof_vel", "last_actions"]
commands_name: ["lin_vel_x", "lin_vel_y", "ang_vel_z"]
max_commands: [1.0, 1.0, 1.0]
min_commands: [-1.0, -1.0, -1.0]
# commands_gain: [1.0, 0.0, 1.0]
# max_commands_rate: [5.0, .inf, .inf]
# min_commands_rate: [-5.0, -.inf, -.inf]
# control parameters
default_joint_angles: [0.0, 0.8, -1.5, 0.0, -0.0, 0.8, -1.5, 0.0, 0.0, 0.8, -1.5, 0.0, -0.0, 0.8, -1.5, 0.0]
joint_kp: [96.0, 96.0, 96.0, 0.0, 96.0, 96.0, 96.0, 0.0, 96.0, 96.0, 96.0, 0.0, 96.0, 96.0, 96.0, 0.0]
joint_kd: [3.2, 3.2, 3.2, 0.5, 3.2, 3.2, 3.2, 0.5, 3.2, 3.2, 3.2, 0.5, 3.2, 3.2, 3.2, 0.5]
action_scales: [ 0.25, 0.25, 0.25, 5.0, 0.25, 0.25, 0.25, 5.0, 0.25, 0.25, 0.25, 5.0, 0.25, 0.25, 0.25, 5.0 ]
# zero_cmd_brake_thresholds: [0.01, 0.5] # [cmd_magnitude, actual_vel(m/s)]
# zero_cmd_brake_gains: [0.00, 0.05] # [P(integral), D(velocity)]
# zero_cmd_brake_integral_clamp: 20.0
如果修改原有的策略,对应字段下框选出来的位置
loco:
policy_name: "rl_flat_lab2"
修改后重启service,systemctl restart d1_bringup后,查看journal中是否有正确加载在对应按键上journalctl -u d1_bringup
备注
注意以下事项:
对于四足,出厂默认平地模式使用强化控制,因此policy_loco_name字段必须不为空且对应的字段必须在rl_policy_names中出现。其他policy_jump_name,policy_recovery_name也是使用强化学习实现的,如果使用则需要在rl_policy_names中注册对应名字的policy并且在policy_jump_name,policy_recovery_name中声明,不声明则使用内置默认值(如果有)
已经在policy_jump_name,policy_recovery_name和policy_recovery_name注册过的rl_policy_names在rl_*按键中不会被映射上,剩下的策略则按照先后顺序映射在对应的rl_*中。
双足policy_loco_name默认使用lqr为非强化学习控制器。
...
policy_jump_name: "rl_forward_jump"
policy_loco_name: "rl_flat_np3o_still"
policy_recovery_name: "rl_recovery_np3o"
rl_policy_names:
- "rl_flat_np3o_still"
...
...
控制器参数修改
以四轮足模式为例子,/opt/d1_ros2/share/rl_controller/config/d1/controllers.yaml
transform_up:从折叠姿态 → 先 fold_jpos 过渡姿态 → 再 stand_jpos 站立姿态
transform_down:从站立 → 直接运动到 fold_jpos 折叠收拢姿态
transform_up:
policy_name: "" # 为空使用PD位置控制;填名字则加载RL策略
fold_jpos: [-0.05, 1.0, -2.4, 0.0, 0.05, 1.0, -2.4, 0.0, -0.05, 1.4, -2.4, 0.0, 0.05, 1.4, -2.4, 0.0]
stand_jpos: [-0.05, 0.8, -1.4, 0.0, 0.05, 0.8, -1.4, 0.0, -0.05, 0.8, -1.5, 0.0, 0.05, 0.8, -1.5, 0.0]
fold_timer: 0.5 # 折叠→过渡姿态耗时(s)
stand_timer: 1.0 # 过渡姿态→最终站立耗时(s)
ff_torque: [-0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 5.0, 0.0, -0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 5.0, 0.0] #前馈力矩
joint_kp: [400.0, 150.0, 300.0, 5.0, 400.0, 150.0, 300.0, 5.0, 400.0, 150.0, 300.0, 5.0, 400.0, 150.0, 300.0, 5.0]
joint_kd: [8.0, 8.0, 8.0, 0.5, 8.0, 8.0, 8.0, 0.5, 8.0, 8.0, 8.0, 0.5, 8.0, 8.0, 8.0, 0.5]
transform_down:
fold_jpos: [0.3, 1.30, -2.7, 0.0, -0.3, 1.3, -2.7, 0.0, 0.3, 1.3, -2.7, 0.0, -0.3, 1.3, -2.7, 0.0]
fold_timer: 1.5 # 站立→完全折叠耗时(s)
joint_kp: [300.0, 150.0, 300.0, 5.0, 300.0, 150.0, 300.0, 5.0, 300.0, 150.0, 300.0, 5.0, 300.0, 150.0, 300.0, 5.0]
joint_kd: [4.0, 8.0, 8.0, 0.2, 4.0, 8.0, 8.0, 0.2, 4.0, 8.0, 8.0, 0.2, 4.0, 8.0, 8.0, 0.2]
字段详解 transform_up 起立流程(两段式运动) 1、fold_jpos:起立中间过渡姿态(rad)
leg0:[-0.05, 1.0, -2.4, 0.0]
leg1:[0.05, 1.0, -2.4, 0.0]
leg2:[-0.05, 1.4, -2.4, 0.0]
leg[-0.05, 1.4, -2.4, 0.0]`
leg3:[0.05, 1.4, -2.4, 0.0] 注意后腿 (leg2/3) 第二个关节角度 1.4,比前腿 1.0 更大,后腿抬得更高,防止起立刮地。 2、stand_jpos:最终稳定站立关节角
leg0:[-0.05, 0.8, -1.4, 0.0]
leg1:[0.05, 0.8, -1.4, 0.0]
leg2:[-0.05, 0.8, -1.5, 0.0]
leg3:[0.05, 0.8, -1.5, 0.0] 后腿第三关节 - 1.5,前腿 - 1.4,前后腿微小差异,匹配机身重心。 3、fold_timer:0.5s:折叠姿态运动到中间过渡姿态耗时 4、stand_timer:1.0s:过渡姿态运动到最终站立姿态耗时 完整起立总时间:0.5 + 1.0 = 1.5 s 5、ff_torque 前馈力矩:每个腿第 3 关节施加+5 N·m前馈力矩。 第三关节一般是膝关节,用来抵消机身重力,减轻 PD 负担,防止起立下垂。其余关节前馈为 0。 6、joint_kp / joint_kd:起立阶段 PD 增益
kp 最高 400,刚度比趴下阶段更高;kd 也更大,抑制起立冲击抖动。
第 4 关节(足)kp=5、kd=0.5,保持柔性。