跳转到内容

策略部署

策略运行器基类 PolicyRunnerBase 定义了输入观测、输出动作和推理生命周期。

virtual RobotAction getRobotAction(const RobotBasicState&, const UserCommand&) = 0;
virtual void OnEnter(const RobotBasicState&) = 0;
virtual void SetDecimation(int d);

Lite3PolicyRunner 是 Lite3 的 ONNX 策略实现。

session_ = Ort::Session(env_, policy_path_.c_str(), session_options_);
const int motor_num = 12;
const int observation_dim = 45;
const int action_dim = 12;

观测向量组成:

current_observation_ << base_omega, // 3 维(角速度 * 0.25)
projected_gravity, // 3 维(重力投影)
command, // 3 维(速度指令)
joint_pos_rl, // 12 维(关节位置 - 默认位置)
joint_vel_rl, // 12 维(关节速度 * 0.05)
last_action_eigen; // 12 维(上一步动作)
VecXf current_action_eigen = Onnx_infer(current_observation_);
for (int i = 0; i < 4; ++i){
robot_action.goal_joint_pos.segment(i*3, 3) = tmp_action_eigen.segment(i*3, 3);
}
robot_action.kp = kp_; // Vec3f(30, 30, 30).replicate(4, 1)
robot_action.kd = kd_; // Vec3f(1, 1, 1).replicate(4, 1)

策略和机器人的关节排列顺序可能不同,通过名称映射自动计算置换索引:

std::vector<std::string> robot_order = {
"FL_HipX_joint", "FL_HipY_joint", "FL_Knee_joint",
"FR_HipX_joint", "FR_HipY_joint", "FR_Knee_joint",
"HL_HipX_joint", "HL_HipY_joint", "HL_Knee_joint",
"HR_HipX_joint", "HR_HipY_joint", "HR_Knee_joint"};
robot2policy_idx = generate_permutation(robot_order, policy_order);
policy2robot_idx = generate_permutation(policy_order, robot_order);

模型文件位于:

src/Lite3_sdk_deploy/policy/policy.onnx
dof_default_eigen_policy << 0.0000, -0.8000, 1.6000,
0.0000, -0.8000, 1.6000,
0.0000, -0.8000, 1.6000,
0.0000, -0.8000, 1.6000;
std::vector<float> action_scale_robot = {0.125, 0.25, 0.25,
0.125, 0.25, 0.25,
0.125, 0.25, 0.25,
0.125, 0.25, 0.25};