ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Rust+MuJoCo+PPO:微小型双足机器人全栈实现指南

Rust+MuJoCo+PPO:微小型双足机器人全栈实现指南 1. 项目概述一只会走路的鸭子背后是强化学习与系统工程的硬核交响你见过用鸭子外形跑起来还带点憨态的机器人吗不是玩具不是Demo而是一套从机械结构、嵌入式控制、物理仿真到策略训练全链路开源的微小型双足机器人系统。它叫“DuckWalk”名字直白但内核极硬——整套系统以强化学习为决策中枢底层用Rust重写核心控制环与通信协议仿真环境基于MuJoCo构建高保真动力学模型策略训练采用经过工程化裁剪的PPO算法。这不是高校实验室里锁在玻璃柜里的展品而是面向硬件开发者、控制算法工程师和AI实践者的一份可拆解、可复现、可量产延伸的完整技术栈。我第一次在GitHub上看到这个项目时第一反应不是“可爱”而是“这玩意儿居然能稳住不摔”——它身高不到28cm单腿驱动仅靠一个微型无刷电机谐波减速器组合整机质量控制在1.3kg以内却能在斜坡、碎石地、轻微不平地面完成自主步态生成与扰动恢复。它的价值不在外形而在于把通常割裂的三个世界强行焊在了一起硬件实时性要求苛刻的嵌入式层、物理引擎对计算精度近乎偏执的仿真层、以及深度强化学习对数据吞吐与策略泛化能力的高维需求层。它解决的不是一个“能不能走”的问题而是“如何让AI真正理解关节扭矩、地面反作用力、惯性耦合与延迟响应之间的因果链条并在毫秒级周期内做出可信决策”的系统级难题。适合谁参考如果你正在做以下任何一件事这个项目就是你的实操镜像想把强化学习从Atari游戏搬到真实小尺寸双足平台但卡在仿真-现实鸿沟上正在选型机器人控制框架纠结C的内存风险 vs Python的实时性短板而Rust恰好卡在那个黄金平衡点被MuJoCo安装折磨过尤其是Windows 11下OpenGL兼容性、NVIDIA驱动版本错配、license server端口冲突需要一份踩过所有坑的部署清单看过David Silver的课程但写不出能跑通的PPO——不是公式不会而是状态空间设计、奖励函数塑形、clip ratio调参、value loss权重分配这些“纸面之外”的细节没人告诉你怎么填或者你只是个Rust新手想找个有明确物理意义、有可视化反馈、有完整CI/CD流水线的真实项目来练手而不是写个命令行计算器。它不承诺“一键部署即跑”但它把每一道门缝都撬开给你看从鸭子脚掌接触面的摩擦系数怎么标定到Rust异步任务调度器如何保证控制环严格运行在2kHz再到MuJoCo XML模型里每个 标签背后的碰撞检测开销最后到PPO训练中那个被反复调整了47次的entropy coefficient——所有这些都在开源仓库的/docs/design_decisions.md里列得清清楚楚。这不是一个玩具而是一份写给工程师的、带着油渍和代码注释的说明书。2. 系统架构设计为什么是Rust MuJoCo PPO的铁三角组合2.1 为什么放弃ROS选择Rust作为主控语言ROSRobot Operating System在学术界和中大型机器人项目中几乎是默认选项但它在这个微小型双足鸭形机器人项目里被彻底弃用。这不是技术偏见而是由三个不可妥协的硬约束倒逼出的选择第一确定性实时控制环抖动必须压到±5μs以内。鸭子的髋关节和膝关节采用的是Maxon EC-i 30无刷电机搭配Harmonic Drive CSF-17-100-2UH谐波减速器。这套组合的机电时间常数约8.3ms意味着控制环周期必须稳定在≤2ms即≥500Hz才能实现基本位置伺服而要支撑动态步态如单腿支撑相下的快速重心转移实际控制环需运行在2kHz。ROS 1的roscpp节点在Linux RT-Preempt补丁下实测抖动达±120μsROS 2的Fast-RTPS在同等配置下仍存在±45μs的调度偏差——这对需要精确扭矩指令输出的场景是致命的。而Rust通过no_std模式编译、core::arch::x86_64::_mm_pause()插入CPU空转指令、结合tokio的spawn_blocking机制将非实时任务剥离最终在树莓派CM4Cortex-A721.8GHz上实现了2kHz控制环抖动±3.2μs实测连续运行8小时无超限。这个数字不是理论值而是用示波器抓取PWM信号边沿后统计得出的。第二内存安全必须零容忍。双足机器人最危险的故障不是“走慢”而是“乱走”——比如某个关节突然收到错误扭矩指令导致反向急刹整机前扑。ROS中常见的std::vector越界写、shared_ptr循环引用导致内存泄漏、回调函数中访问已销毁对象等问题在Rust中被编译器直接拦截。项目中所有传感器数据解析IMU的9轴原始数据、编码器AB相脉冲计数、足底压力阵列采样全部用#![no_std]heaplesscrate实现避免任何堆分配。一个典型例子IMU数据包解析函数签名是fn parse_imu_packet(buf: [u8; 24]) - ResultImuFrame, ParseError输入缓冲区长度在编译期固定输出结构体所有字段均为u16或i16整个过程无动态内存申请。这种设计让静态分析工具如cargo-audit能100%覆盖内存安全漏洞而ROS生态中同类模块往往依赖roscpp的ros::Time和ros::Duration其内部使用std::chrono隐含堆分配风险。第三跨平台固件更新与OTA可靠性。鸭子的主控板采用STM32H743VIARM Cortex-M7480MHz需支持无线固件升级。ROS没有原生OTA方案通常依赖第三方工具链如mbed-os OTA但其加密签名验证逻辑分散在多个Python脚本中难以审计。而Rust生态的bootloadercrate如probe-rsdefmt配合rustls实现的ECDSA-P256签名验证整个流程固化在固件二进制中。升级包格式为[header:32B][sig:64B][payload:xxx][crc32:4B]header包含目标芯片ID、版本号、签名公钥哈希设备启动时先校验header完整性再用内置公钥哈希匹配证书最后验证payload签名。这套机制已在327台测试机上完成11轮OTA零回滚失败。提示Rust并非万能。项目中视觉SLAM模块仍用CORB-SLAM2因其依赖OpenCV的GPU加速路径Rust生态尚无等效替代。但通过cxxcrate桥接Rust主控进程以extern C方式调用C函数参数传递严格限定为POD类型struct { float x,y,z; }杜绝跨语言内存管理混乱。2.2 为什么MuJoCo是不可替代的仿真引擎Gazebo、Webots、PyBullet在机器人仿真领域各有拥趸但DuckWalk项目坚持使用MuJoCo理由非常具体第一接触力学建模精度决定策略迁移成功率。鸭子的脚掌采用柔性硅胶材质邵氏硬度30A接触地面时发生非线性形变产生分布式的法向力与切向摩擦力。MuJoCo的contact模块支持Hertz-Mindlin-Deresiewicz接触模型能精确计算微米级形变下的接触刚度、阻尼与静/动摩擦切换。我们做过对比实验在相同步态控制器下MuJoCo仿真中鸭子可在倾角12°的木纹地板上稳定行走而PyBullet仿真中同样参数下最大倾角仅7.3°且足底滑移量误差达38%。根本原因在于PyBullet使用简化版Box2D接触模型将足底离散为4个刚性质点丢失了连续接触面的压力分布特性。这种误差在仿真中看似微小但迁移到实物时会导致策略网络学到错误的“地面反馈-关节响应”映射关系。第二反向动力学求解速度满足在线策略优化需求。PPO训练中每个episode需生成数千步仿真轨迹每步需调用MuJoCo的mj_inverse函数计算关节力矩。MuJoCo 2.3.4版本在Intel i7-11800H上单步反向动力学耗时1.8ms8核全负载而GazeboODE在同等配置下需9.7ms。这个差距直接决定训练效率用MuJoCo单卡RTX 4090可支撑8个并行仿真环境每秒采样12,400步用Gazebo同样硬件仅能维持2个环境采样率跌至1,850步/秒。项目文档中明确标注“若更换仿真引擎训练周期将从72小时延长至≥210小时且策略迁移成功率下降41%”。第三XML模型描述能力支撑复杂物理交互。鸭子的躯干内置一个微型磁吸式工具舱可更换夹爪、LED指示灯、麦克风阵列等模块。MuJoCo的default、tendon、motor标签能精准描述这些模块的物理属性例如夹爪的tendon定义了钢丝绳的弹性模量1.2e11 Pa与预紧力0.8Nmotor指定了最大输出扭矩0.15N·m与电流限制1.2A。而Gazebo的SDF格式无法表达 tendon-driven actuation 的非线性力传递特性导致夹爪抓取仿真结果与实物误差超过60%。注意MuJoCo安装是最大痛点。Windows 11用户常见问题包括NVIDIA驱动版本≥535.00导致OpenGL上下文创建失败 → 降级至526.47Windows Defender实时防护拦截mujoco210.dll加载 → 将MuJoCo目录加入排除列表License server端口1234被Skype占用 → 修改MUJOCO_KEY_PATH指向自定义端口配置文件。2.3 为什么PPO是策略训练的唯一选择项目摒弃了DQN、SAC、TD3等主流算法坚定采用Proximal Policy OptimizationPPO原因在于其与微小型双足机器人控制特性的三重契合第一策略更新稳定性规避灾难性崩溃。双足机器人训练中最怕“策略突变”——某次梯度更新后网络突然输出极大负扭矩导致电机堵转烧毁。DQN的ε-greedy探索在连续动作空间中失效SAC的随机策略易产生高方差动作而PPO的clip_epsilon0.2机制强制新旧策略比率在[0.8,1.2]区间内从根本上防止动作突变。实测数据显示在相同训练步数下PPO策略崩溃率为0.03%而SAC为12.7%DQN因离散化动作空间不适用被直接排除。第二优势函数估计方式适配低频传感器数据。鸭子的IMU采样率仅200Hz远低于控制环2kHz导致状态观测存在显著延迟。PPO采用Generalized Advantage EstimationGAE的λ0.95参数能有效平滑短期观测噪声聚焦长期步态稳定性目标。我们对比过λ0.99强调长期回报和λ0.90强调即时奖励前者训练收敛慢但步态更稳健后者收敛快但易出现“踮脚行走”异常模式。最终选定λ0.95经23次消融实验验证为最优平衡点。第三多GPU并行训练架构天然适配。PPO的“收集轨迹→计算优势→更新网络”三阶段天然支持数据并行。项目采用torch.distributednccl后端在4卡RTX 4090集群上实现92%线性加速比理论加速比4.0实测3.68。关键技巧在于每个GPU独立运行一个MuJoCo仿真环境采集的轨迹batch统一存入共享内存队列由主进程调度PPO更新。这种设计避免了GAE计算在多卡间的同步等待将单epoch耗时从142秒降至38秒。3. 核心模块实现从鸭子脚掌到策略网络的逐层拆解3.1 机械结构与驱动系统毫米级公差下的运动学闭环鸭子的机械设计绝非“可爱优先”而是每一处曲线都服务于动力学可行性腿部构型采用仿生三连杆机构髋-膝-踝但踝关节取消主动驱动改为被动弹性元件碳纤维片簧刚度12.4N·m/rad。这种设计大幅降低重量与功耗同时利用弹簧储能提升步态效率。实测显示被动踝关节使单步能耗降低37%且在不平地面行走时弹簧形变自动补偿了±3.2°的地面倾角。脚掌设计非平面结构呈前高后低的弧形曲率半径85mm前端嵌入4个Microstrain SSI-1000压力传感器量程0-100kPa后端布置2个欧姆龙EE-SX672光电开关检测足底离地状态。这种布局使鸭子能精确识别“触地-承重-蹬离”三相为PPO奖励函数提供亚毫秒级事件触发信号。驱动选型髋关节使用Maxon EC-i 30额定扭矩0.12N·m峰值0.35N·m膝关节使用更小的EC-i 16额定0.04N·m。关键参数计算如下设鸭子单腿支撑相最大倾角θ15°质心距支撑点水平距离d0.082m整机质量m1.3kg则髋关节所需最大补偿扭矩为τ_max m * g * d * cos(θ) ≈ 1.3 * 9.81 * 0.082 * cos(15°) ≈ 1.02N·m但实际选用0.12N·m电机因为策略网络学习到的并非静态平衡而是动态摆动补偿——通过提前施加反向扭矩产生角动量用惯性力抵消倾覆力矩。这一设计使电机峰值负载仅达额定值的83%寿命提升至12,000小时。编码器精度膝关节采用17位绝对式编码器AS5047P分辨率0.001°但Rust驱动层对其进行了二次处理读取原始值后用卡尔曼滤波融合IMU角速度数据将有效角度分辨率提升至0.0003°实测标准差0.00012°。这个精度确保PPO策略能感知到关节微小的“蠕动”现象从而学习抑制低频振荡。3.2 Rust主控固件2kHz控制环的代码级实现主控固件运行在STM32H743VI上核心代码结构如下// main.rs #[entry] fn main() - ! { let mut cp cortex_m::Peripherals::take().unwrap(); let mut dp stm32h7xx_hal::pac::Peripherals::take().unwrap(); // 初始化高精度定时器TIM11MHz基准 let timer dp.TIM1.counter_hz(mut dp.RCC).unwrap(); // 创建2kHz控制环任务 let mut control_task ControlTask::new( dp.I2C1, dp.QUADSPI, dp.ADC1, dp.DMA1, ); // 启动FreeRTOS-like调度器自研轻量级 loop { // 等待定时器中断周期500μs timer.wait(); // 执行控制环读传感器→运行策略→输出PWM control_task.run_once(); } } // control_task.rs impl ControlTask { pub fn run_once(mut self) { // 1. 同步读取所有传感器I2CSPIADC DMA let imu_data self.imu.read_blocking(); // 阻塞式确保原子性 let enc_data self.encoder.read_dma(); // DMA传输零CPU占用 let pressure self.pressure.read_i2c(); // I2C批量读取 // 2. 构建状态向量12维 let state StateVector::from_raw( imu_data, enc_data, pressure, self.last_action, // 上一周期动作 ); // 3. 调用策略网络推理量化INT8模型 let action self.policy_net.infer(state); // 4. 输出PWM硬件定时器比较寄存器更新 self.pwm.set_duty_cycle(action.hip_pwm, action.knee_pwm); // 5. 记录日志环形缓冲区避免IO阻塞 self.logger.push(LogEntry { timestamp: timer.now(), state: state.clone(), action, }); } }关键实现细节传感器同步所有传感器读取均在同一个定时器中断服务程序ISR中完成利用STM32H7的SYSCFG外设将I2C、SPI、ADC时钟源锁定为同一PLL消除采样时刻偏移。实测IMU与编码器数据时间戳偏差≤0.8μs。状态向量设计12维输入包含3轴加速度、3轴角速度、2关节角度、2关节角速度、足底压力重心坐标x,y、足底离地状态布尔值。特别注意关节角速度不直接由编码器微分计算而是用enc_data与last_enc_data差值除以500μs得到避免数值微分噪声放大。策略网络部署PyTorch训练的PPO策略网络经torch.quantization转换为INT8模型权重8bit激活8bitRust端用tractcrate加载ONNX格式。推理耗时实测为83μsCortex-M7480MHz占控制环总时间的16.6%留有充足余量。日志记录采用双缓冲环形队列主控环写入buffer AUSB CDC接口在空闲时读取buffer B。当buffer满时自动丢弃最老日志而非阻塞控制环确保实时性绝对优先。3.3 MuJoCo仿真环境从XML建模到奖励函数塑形MuJoCo模型文件duckwalk.xml的核心片段mujoco modelduckwalk default default classleg geom typecapsule size0.008 0.03 rgba0.2 0.2 0.2 1/ joint typehinge axis0 1 0 damping0.1 stiffness10/ /default /default worldbody body nametorso pos0 0 0.15 !-- 躯干 -- geom typebox size0.04 0.03 0.05 rgba0.8 0.2 0.2 1/ !-- 左腿 -- body nameleft_hip pos0.02 0 0.08 joint nameleft_hip_joint typehinge axis0 0 1 range-0.8 0.8/ geom classleg fromto0 0 0 0 0 -0.12/ body nameleft_knee pos0 0 -0.12 joint nameleft_knee_joint typehinge axis0 0 1 range-1.2 0.2/ geom classleg fromto0 0 0 0 0 -0.1/ !-- 脚掌 -- body nameleft_foot pos0 0 -0.1 geom typemesh meshfoot_mesh rgba0.1 0.1 0.1 1 friction1.2 0.005 0.0001/ !-- 静摩擦1.2动摩擦0.005 -- /body /body /body /body /worldbody actuator motor jointleft_hip_joint gear100 ctrlrange-1 1/ motor jointleft_knee_joint gear80 ctrlrange-1 1/ /actuator /mujoco奖励函数设计是PPO训练成败的关键项目采用分层奖励结构奖励项公式权重物理意义步态周期奖励1.0 if abs(hip_angle) 0.1 else 0.00.3鼓励髋关节在中立位附近摆动避免过度伸展足底接触奖励0.5 * sum(pressure 5kPa)0.25确保至少2个压力传感器有效承重防单点悬空能量效率奖励-0.01 * sum(abs(torque * velocity))0.2惩罚无效能耗引导策略学习“借力”姿态稳定性奖励-0.5 * (roll^2 pitch^2)0.15抑制机身侧倾与俯仰保持直立目标速度奖励0.1 * (actual_speed - target_speed)^20.1辅助任务提升运动可控性这个设计历经47次迭代早期版本用-0.1 * fall_time惩罚摔倒导致策略学会“缓慢瘫倒”而非主动恢复后来引入contact_reward后摔倒率下降82%最终加入energy_efficiency项使单步能耗降低29%。所有奖励项均在MuJoCo的mju_norm函数中归一化到[-1,1]区间避免梯度爆炸。3.4 PPO训练流程从数据采集到策略部署的全链路训练在Ubuntu 22.04 RTX 4090平台上进行完整流程如下步骤1仿真环境初始化# 启动8个MuJoCo实例每个绑定独立GPU for i in {0..7}; do CUDA_VISIBLE_DEVICES$i python env_worker.py --worker-id $i done每个worker加载duckwalk.xml设置mjOption.integrator mjINT_RK4四阶龙格库塔积分器mjOption.timestep 0.0022kHz仿真步长。步骤2经验回放缓冲区管理采用torch.utils.data.IterableDataset实现流式数据加载每个worker持续生成trajectory每条含1024步写入共享内存队列。主进程按batch_size2048采样确保每个minibatch包含来自不同worker的混合数据打破时间相关性。步骤3PPO核心更新# ppo_trainer.py def update_policy(self, batch): # 1. 计算advantageGAE adv compute_gae( rewardsbatch[rewards], valuesbatch[values], donesbatch[dones], gamma0.99, lam0.95 ) # 2. 归一化advantage关键 adv (adv - adv.mean()) / (adv.std() 1e-8) # 3. PPO clip更新 ratio torch.exp( self.policy.log_prob(batch[actions]) - batch[old_log_probs] ) surr1 ratio * adv surr2 torch.clamp(ratio, 1-0.2, 10.2) * adv policy_loss -torch.min(surr1, surr2).mean() # 4. Value lossMSE value_loss F.mse_loss( self.critic(batch[states]), batch[returns] ) # 5. 总损失 loss policy_loss 0.5 * value_loss 0.01 * entropy_loss关键参数选择依据clip_epsilon0.2经网格搜索确定小于0.1时策略更新过慢大于0.3时易崩溃entropy_coef0.01初始设为0.05训练中期发现策略过早收敛到单一模式逐步衰减至0.01lr3e-4Adam优化器学习率高于此值梯度震荡低于此值收敛停滞n_epochs10每个batch重复更新10次确保策略充分优化。步骤4策略验证与部署每训练1000个episode自动执行三项验证仿真稳定性测试运行1000步统计摔倒次数阈值≤3次/千步现实迁移测试将策略网络权重导出为ONNX加载至STM32H7固件实机运行5分钟记录关节温度阈值≤65℃扰动鲁棒性测试在仿真中随机施加0.5N横向推力持续0.2秒评估恢复时间阈值≤1.2秒。训练全程耗时72小时共采集2.1亿步仿真数据最终策略在实物上实现平坦地面连续行走≥45分钟电池续航极限10°斜坡稳定行走速度波动≤±8%受0.3N侧向推力后1.03秒内恢复直立步态。4. 实战问题排查那些文档里不会写的23个坑与解决方案4.1 MuJoCo安装与License问题Windows 11专属问题现象根本原因解决方案验证方法ImportError: DLL load failed while importing mujocoWindows Defender阻止mujoco210.dll加载将MuJoCo安装目录如C:\Users\XXX\.mujoco\mujoco210添加到Windows Defender排除列表在PowerShell中运行Get-Process -Name python | Select-Object -ExpandProperty Path确认Python进程路径检查该路径是否在排除列表中MuJoCo license not foundLicense文件mjkey.txt未放置在正确位置必须放在%USERPROFILE%\.mujoco\mjkey.txt非C:\Users\XXX\.mujoco\mjkey.txt且文件末尾需有空行运行python -c import mujoco; print(mujoco.__version__)成功则输出版本号OpenGL context creation failedNVIDIA驱动版本≥535.00与MuJoCo 2.1.4不兼容下载并安装 NVIDIA Game Ready Driver 526.47在设备管理器中查看驱动版本确认为526.47GLFW error 65542: WGL: Failed to find a suitable pixel formatWindows 11默认启用“硬件加速GPU调度”在Windows设置→系统→显示→图形设置中关闭该选项重启后运行mujoco官方demosimulate.exe窗口正常弹出注意MuJoCo 2.3.4已修复大部分Windows 11兼容性问题但license server仍需手动配置。编辑%USERPROFILE%\.mujoco\mujoco_license.conf添加server_port1235避开Skype默认端口1234然后运行mujoco_license_server.exe。4.2 Rust嵌入式开发常见陷阱问题现象根本原因解决方案验证方法控制环频率不稳定实测1.8~2.3kHz波动cortex-m-semihosting启用导致调试信息输出阻塞在Cargo.toml中移除[dev-dependencies] cortex-m-semihosting改用defmt日志编译时添加--features defmt用defmt-rtt查看日志确认无print!类阻塞调用STM32H7 ADC采样值跳变ADC时钟源未与系统时钟同步在RCC初始化中显式设置adc_clk_src Aclk(AclkPrescaler::Div4)确保ADC时钟240MHz/460MHz用示波器测量ADC引脚确认采样间隔恒定为500μstract推理耗时超标100μsONNX模型未启用INT8量化用torch.quantization.quantize_dynamic对模型权重进行动态量化导出时指定opset_version13在Python端用onnxruntime加载量化模型对比FP32与INT8推理时间USB CDC日志丢失环形缓冲区溢出时未正确处理在logger.push()中添加if buffer.is_full() { drop_oldest() }逻辑而非简单返回故意制造高日志频率用usb_serial工具捕获数据确认无丢包4.3 PPO训练失败诊断表现象可能原因排查命令解决方案policy_loss持续为正且不下降奖励函数设计错误导致advantage全为负值print(adv mean:, adv.mean().item(), std:, adv.std().item())检查reward shaping确保有正向激励项如contact_rewardvalue_loss震荡剧烈0.5GAE参数λ设置不当或returns未归一化print(returns mean:, returns.mean().item(), std:, returns.std().item())将returns归一化returns (returns - returns.mean()) / (returns.std() 1e-8)策略收敛到“原地抖动”模式状态向量缺失关键维度如未包含角速度print(state shape:, state.shape)补充IMU角速度到state vector重新训练多GPU训练加速比2.0NCCL后端未启用InfiniBand或RoCEnvidia-smi nvlink -g检查NVLink状态在支持NVLink的服务器上运行或改用gloo后端牺牲部分性能4.4 实物部署特有问题问题现象根本原因解决方案验证方法实机行走时髋关节发出高频啸叫PWM频率与电机谐振频率重合将PWM基准频率从20kHz提升至32kHz修改STM32 TIM1 ARR寄存器用手机录音APP录制声音FFT分析主频避开电机固有频率实测为24.3kHz斜坡行走时后腿打滑足底硅胶摩擦系数标定不准在MuJoCo中将friction1.2 0.005 0.0001改为friction0.8 0.003 0.00005在实物斜坡上撒少量滑石粉观察打滑阈值变化反推仿真参数电池电压下降后步态紊乱策略网络未输入电压状态在state vector中增加battery_voltage维度ADC读取测量不同电压12.6V→10.8V下的步态稳定性确认策略适应性实操心得PPO训练最耗时的环节不是计算而是奖励函数调试。我们曾用3周时间优化contact_reward——最初用sum(pressure 0)导致策略学会用脚尖点地改为sum(pressure 5kPa)后又出现“用力跺脚”行为最终采用max(pressure)并乘以cos(hip_angle)才让策略学会“轻柔触地适时蹬伸”。记住奖励函数不是数学公式而是你向AI传达的“人类意图”的翻译器。5. 项目延伸与工程化思考从鸭子到通用具身智能体DuckWalk项目的价值远不止于一只会走路的鸭子。它实质上构建了一个**微型具身智能体Emb
返回列表