☰
microduck-lab:Apple Silicon上的具身强化学习实践
2026/10/17 22:41:31 网站建设 项目流程

1. 项目全貌:microduck-lab 到底在做什么

1.1 一句话定位与动机解读

microduck-lab 这个项目,简单来说,就是一套跑在 Apple Silicon(也就是 M 系列芯片 Mac)上的具身智能强化学习原型实验室。它不是一个大而全的框架,而是一个精心裁剪过的“最小可行系统”:你有一台 MacBook,想入门具身智能里的 RL(强化学习)算法,不想一上来就面对 NVIDIA GPU、CUDA、大型仿真集群这些基础设施,并且希望能从仿真环境一路做到真实机械臂控制——microduck-lab 就是冲着这个场景来的。

这个定位非常有意思。我接触过不少想做具身智能的开发者,他们碰到的最普遍问题不是算法难,而是入门成本太高。一套能跑深度强化学习的桌面级 GPU 配置,动辄两三万,再加上机械臂、夹爪、相机这些硬件,预算轻松破五万。而 microduck-lab 的思路是:用一台 Mac mini 或者 MacBook Pro 作为训练和推理平台,用轻量级仿真环境做算法验证,再用低成本舵机或小机械臂做真机验证。成本能压到几千块,这在具身智能领域里是相当激进的“低成本”路线。

把这个项目和 Hugging Face 平台放在一起看,它的价值就更清楚了。Hugging Face 今天已经不只是一个模型仓库,它更像一个“AI 项目的社交网络”:代码、模型权重、数据集、实验记录的集合体。microduck-lab 选择发布在 Hugging Face 上,说明作者意图不只是丢一段代码,而是希望形成一个可迭代、可讨论、有版本记录的完整项目空间。对围观者来说,这意味着你不仅能拿到代码,还能看到这个项目的演进过程、issue 里踩过的坑、以及未来可能的扩展方向。对于学生、独立研究者、小型创业团队的前期预研,这种开源方式比扔一个 GitHub 仓库到搜索引擎里要友好太多。

1.2 在开源生态中的坐标:不是又一个 leRobot,也不是又一个 Isaac

要判断 microduck-lab 的定位,最好把它放到具身智能开源项目的光谱里看。一边是整个生态里偏重真机数据采集与模仿学习的项目,比如 Hugging Face 自家的 leRobot、斯坦福的 Mobile ALOHA 衍生项目,这些项目侧重点是“怎么让机械臂学会看和模仿”,对 GPU 训练、多机部署有较高要求,通常建议你用 Linux 桌面 + NVIDIA 显卡。另一边是 NVIDIA 的 Isaac Lab / Isaac Gym,这些是工业级仿真训练平台,功能极其强大,但对硬件有硬性要求,Apple Silicon 基本不在支持列表里。

microduck-lab 恰好卡在中间:它不做工业级的物理仿真渲染,不追求大规模并行环境采样,而是把目标定为“在一台 Mac 上把完整的 RL 训练闭环跑通”。这意味着它必须做出几个关键取舍。

第一,仿真器选择了对 macOS 支持友好的 MuJoCo 系或轻量 PyBullet,而不是 Isaac Gym。MuJoCo 在 M 系列芯片上可以原生运行,CPU 版就能完成小规模并行采样,虽然比不上 GPU 版 Isaac 的几千环境并行,但单机跑十几个并行环境做 PPO 训练是够用的。第二,策略网络和训练循环选择 PyTorch 的 MPS 后端,而不是走 CUDA。Apple Silicon 的统一内存架构在跑小 Batch 时性能不差,代价是生态兼容性需要额外打理。第三,硬件接口层做了抽象,把舵机控制、相机读取封装成独立模块,方便你在仿真训练结束后直接替换成真机执行器。

所以你把 microduck-lab 理解成“具身 RL 的入门级参考实现”更准确。它解决的是“怎么用便宜设备把 RL 这条路走通”的问题。横向对比下来的结论是:如果你已经有高端 GPU 集群,不需要看它;如果你想低预算入门具身 RL,它是目前我看到的一个非常合适的脚手架。

2. Apple Silicon 上做具身 RL 的硬约束与方案选型

2.1 算力账:为什么 Apple Silicon 值得认真对待

具身智能项目历来被 CUDA 生态绑得很死,很多人在潜意识里认为“没有 NVIDIA 显卡就没法做 RL”。这个观念对大规模训练是对的,但对原型验证、教学实验、算法可行性探索来说,未必成立。我算过一笔账。

假设你要做的是单个机械臂的抓取任务,用 PPO 算法。环境是 MuJoCo 模型,状态维度 30 左右,动作维度 6 左右。在这种规模下,一个回合大约 200 步,一次策略更新需要采样 4096 步(PPO 的常见 batch)。推理一次的耗时在 MacBook Pro M3 Pro 上大概 1-2 毫秒,算下来一轮采样的耗时在 5-10 秒级别,加上反向传播和策略更新,一轮迭代(采样+更新)大约 10-15 秒。想要达到一个可用的策略,通常需要 1000-3000 轮迭代,也就是大约 3-10 个小时。

这个训练时长是可以接受的,尤其对学生和研究团队来说,睡一觉跑完训练,第二天起来看曲线,效率并不算低。相比之下,如果用云端租 GPU,一小时的费用几十块,一个月烧下来也是不小的开销。而 Mac 是日常设备,训练任务安排在夜间或空闲时间即可,边际成本几乎为零。

另外,Apple Silicon 的统一内存架构对小模型推理很友好。一个 50 万参数左右的多层感知机策略网络,权重只有几 MB,全部加载到统一内存里,CPU 和 GPU 之间不需要拷贝数据。对实验型工作流来说,省掉的这些数据搬运时间虽然绝对值不大,但让编码体验流畅很多——你不需要像在 NVIDIA 平台上那样时刻想着 host-to-device 的显式迁移。

2.2 模拟器选型:MuJoCo 与 macOS 的真实兼容情况

在 Apple Silicon 上跑具身仿真,现实的选择并不多。最主流的是 MuJoCo 和 PyBullet。我在评测 microduck-lab 的过程中,特意关注了它对这两个后端的态度。

MuJoCo 在 2.3.x 版本后对 macOS 的 arm64 支持相当成熟。安装方式是pip install mujoco,底层会自动拉取对应平台的预编译库。实测下来,在 M2 或 M3 芯片的 Mac 上,MuJoCo 的 CPU 渲染和物理解算都很流畅,单环境仿真频率能到 500Hz 以上。这个性能对 RL 训练来说够用了——毕竟一个回合 200 步,每步做一次物理仿真,500Hz 意味着每秒能产生 2-3 个完整回合,配合多进程并行能进一步放大吞吐。

PyBullet 是另一个选择,它对 macOS 的支持更老牌,很多传统机器人学教材都基于它。但 PyBullet 的渲染效率偏低,物理引擎定制性不如 MuJoCo,而且它的 API 风格偏繁琐,很多新项目已经转向 MuJoCo。microduck-lab 的主路径选择 MuJoCo,我认为是合理的。

需要注意的一点是,Mujoco 的 keyframe 和 XML 模型需要仔细检查。很多开源仓库里的机器人模型是 x86 或者 Linux 上传的,XML 里可能包含一些不太规范的物理参数(比如过大的摩擦系数、不合理的关节阻尼),在 macOS 上的解算行为会有微妙差异。静态评测时如果发现仿真器输出异常,第一步就是检查 XML 模型文件,而不是怀疑代码逻辑。

2.3 硬件层:低成本机械臂与“仿真到真机”的最小闭环

microduck-lab 的硬件设计思路是“能用就行,便宜最好”。它没有绑定特定厂商的机械臂,而是抽象出一套通用的伺服控制接口。我看下来,它的设计预期匹配的是那种 4-6 自由度的桌面小机械臂,使用串行总线舵机(比如 LX-16A、ST3215 这类),总成本可以控制在 1500 元以内。

这套硬件选型思路对应着一个非常现实的问题:具身智能研究的第一步是让程序真正控制真实世界的机械臂动起来,而不是马上追求复杂操作。用工业机械臂当然好,但一台 UR5e 的价格超过十万,对普通人来说不可能作为入门设备。低成本舵机机械臂虽然精度差、寿命短,但它能完成“夹取块状物、移动到目标位置、放下”这类基础 RL 任务,已经足够验证 sim2real 的核心思路。

相机方面,microduck-lab 的设计建议是普通 USB 摄像头,分辨率 720p 就够。视觉输入在它的默认任务里不是必需项——主要是基于关节角度和位姿的 state-based RL——但预留了视觉接口,方便后续扩展视觉策略。这种“从 state-based 起步,给 vision-based 留接口”的做法,对入门者特别友好:你不需要一上来就处理高维图像输入,而是先把 RL 算法逻辑跑通。

3. 静态评测:仓库结构与代码组织

3.1 仓库目录结构分析

拿到 microduck-lab 的仓库,我先看目录结构。一个 RL 项目的可维护性,从目录组织就能看出七八分。它的结构大致是:

microduck-lab/ ├── assets/ # MuJoCo 模型文件、机械臂 XML、物体模型 ├── configs/ # 训练超参数配置,YAML/JSON ├── envs/ # 环境定义:仿真环境和真机环境 │ ├── sim_env.py │ ├── real_env.py │ └── register.py ├── policies/ # 策略网络定义 │ ├── mlp.py │ └── cnn.py ├── trainers/ # 训练器:PPO 实现 │ └── ppo.py ├── hardware/ # 硬件设备接口层 │ ├── servo_bus.py │ └── camera.py ├── utils/ # 日志、统计、模型保存加载 ├── scripts/ # 训练、评估、真机部署入口 │ ├── train_sim.py │ ├── eval_sim.py │ └── deploy_real.py ├── requirements.txt └── README.md

这个结构是很标准的 RL 项目模板,但细节有加分项。第一,配置与代码分离做得好。超参数全部集中在 configs 目录,训练代码不掺杂硬编码的数字,这一点对实验复现非常关键。我见过太多仓库把学习率、batch size 散落在代码各处,想复现某个实验简直是在玩“寻宝游戏”。第二,硬件接口层独立。hardware/模块不依赖任何策略代码,意味着你换一套舵机或换一种相机,只需要修改这一个模块,训练代码完全不受影响。第三,register.py的作用是环境注册,兼容 gym/gymnasium 的make机制,方便你后续接入其他开源 RL 库。

当然也有改进空间。比如assets/目录下的模型文件缺少一个 README 说明来源和许可,这对理解模型细节有一点障碍。另外,requirements.txt里的版本约束比较宽泛,对可复现性有潜在风险——这在第 5 部分我会展开说。

3.2 环境接口设计:gymnasium 规范与状态/动作空间

microduck-lab 的环境接口遵循 gymnasium(OpenAI Gym 的延续版本)的规范,这算是一个明智的选择。遵守这套规范意味着你可以直接复用社区里大量的现成工具——比如stable-baselines3、SampleFactory,以及各种环境 wrappers(归一化、裁剪、帧堆叠等)。

我仔细读了sim_env.py中的step和reset实现。任务定义很清晰:机械臂需要把工作台上的一个绿色方块,移动到指定目标区域。状态空间是一个 26 维向量,包含:

  • 机械臂 6 个关节的角度和角速度(12 维)
  • 末端执行器的三维位置和四元数姿态(7 维)
  • 方块的三维位置和四元数姿态(7 维)

动作空间是 6 维连续向量,对应 6 个关节的目标角度。这里没有用末端位置增量控制,而是直接用关节角度控制,降低了问题难度,也更符合低成本舵机机械臂的底层控制逻辑。

奖励函数的设计也值得拿出来说说。它的每个时间步的奖励包含三个部分:

  • 正向激励:方块离目标区域越近,奖励越高(基于距离的负指数函数)
  • 稀疏事件奖励:方块夹起成功时有额外奖励,放到目标区域则有更大的稀疏奖励
  • 动作惩罚:动作变化量过大时给一个小惩罚,鼓励平滑控制

这个奖励设计思路比较成熟。特别是动作惩罚项,很多新手做 RL 时容易忽略。如果不加这一项,训练出来的策略往往是高频抖动式的,在仿真里看着还行,一到真机就会被舵机的跳动折磨到崩溃。从代码层面你就能感觉到,作者是真跑过真机实验的,不是纯纸上谈兵。

3.3 训练器实现:PPO 的“最小可用”版本

训练器实现了 PPO(Proximal Policy Optimization,近端策略优化)算法。我知道有人会觉得“PPO 不是有现成库吗,为什么要自己写?”这里有必要解释一下。

现成的 RL 库(比如 stable-baselines3)虽然好用,但有三个问题。第一,它们依赖较重的抽象层,调试和定制比较麻烦。第二,它们的设计假设是通用场景,对具身控制这种需要频繁 reset、与环境强交互的任务,性能优化不足。第三,也是最重要的——学习目的。microduck-lab 显然是面向教学的,自己实现一个清晰版 PPO,让学习者能逐行读代码理解算法,这个价值是任何黑盒库都替代不了的。

我看了一下它的 PPO 实现,核心逻辑是完整的:

  • 计算 advantage 使用 GAE(广义优势估计),一个比较标准的实现
  • 价值网络和策略网络共享特征提取层,但输出头分离
  • 训练循环里有 mini-batch 的多次 epoch 更新
  • 剪辑目标函数用的是标准的 clip 公式,clip range 默认 0.2

这个实现没有做太多花哨的工程优化,比如没有实现并行环境采样、没有用 recurrent policy,但作为教学和原型验证是足够的。在代码阅读体验上,它比我将近十年前开始学 RL 时经常参考的那些老仓库要清晰太多——每个函数只做一件事,命名直白,注释也基本到位。

4. 核心实现逻辑深挖

4.1 RL 训练循环的数据流全解析

我把 microduck-lab 的训练数据流完整走了一遍,整个过程在train_sim.py+trainers/ppo.py里。核心循环是标准的 RL 三件套:采样、训练、评估。

采样阶段,sim_env会并行开多个环境(代码里默认是 8 个),每个环境独立跑,收集(state, action, reward, done)四元组。每个环境跑满 256 步之后截断,8 个环境并行能在一轮采样里收集 2048 条经验。这个数字很讲究——PPO 的作者在原始论文里建议的 batch size 就是 2048,microduck-lab 严格照做了。

训练阶段,这 2048 条经验会被打乱,然后分成 4 个 mini-batch,每批 512 条,在价值网络和策略网络上做 3 轮迭代更新。对于简单任务,这个更新量足够学到稳定策略。我观察了它的学习率设置,初始学习率 3e-4,这是 PPO 在连续控制任务里的经验最优值附近。

评估阶段,训练器每 50 轮迭代会暂停训练,跑 20 个不更新的纯采样回合,计算平均成功率。这里的成功标准是方块中心与目标区域中心的距离小于 2cm,且末端没有夹持方块。这个评估逻辑干净利落——真实验证你的策略是不是真的解决了任务。

数据流没有什么黑魔法,但它把一个容易出错的地方处理好了:截断状态的处理。在 RL 里,一个回合时间耗尽会导致环境主动截断(truncated),而自然终止是 done。这两者对 advantage 计算的影响完全不同。microduck-lab 在代码里明确区分了terminated和truncated两个标志,并分别传给 GAE 计算。这是很多入门实现会做错的地方,做错了会导致训练不稳定或者收敛到次优解。

4.2 MPS 加速:PyTorch MPS 后端的实现与坑

microduck-lab 在 PyTorch 上使用 MPS(Metal Performance Shaders)后端,代码里通过torch.device("mps")来指定。和 CUDA 相比,MPS 后端的代码本身没有太多不同,但有两个实际操作层面的坑需要讲清楚。

第一个坑是内存管理。PyTorch MPS 后端的显存回收机制不如 CUDA 成熟,长时间训练会出现“统一内存用量持续上涨”的问题。我在实测中观察到,跑 1000 轮训练后,内存占用比初始时高出 3-4 倍。microduck-lab 的处理方式是在每个 logging 间隔显式调用torch.mps.empty_cache()。这算是一个简单有效的缓解手段。如果你在 Mac 上跑长训练任务,一定要注意这个细节,否则训练到一半系统会因为内存压力过大而触发热降频,甚至直接 kill 掉进程。

第二个坑是 float32 与 float16 的选择。MPS 后端对 float16 的支持在某些算子(比如 layernorm、某些注意力操作)上不完整,会导致精度异常甚至报错。microduck-lab 的策略网络是纯 MLP,没有太多复杂算子,所以我倾向于建议保持默认的 float32 训练。虽然 float16 能带来一笔加速,但对于这种小规模网络,float32 的绝对速度并不慢,而稳定性收益是实打实的。到了真机部署阶段,如果对实时性有更高要求,再用 float16 做推理也不迟。

另外有一个和 MPS 没直接关系但值得说的小点:PyTorch 版本的兼容性。如果你用的是 PyTorch 2.0 之前的版本,MPS 后端很多算子不齐全,可能跑不起来。microduck-lab 的requirements.txt里推荐的版本是 PyTorch 2.1 以上,实测用 2.2 和 2.3 都没问题。

4.3 从仿真到真机的迁移路径

仿真训练得再好,最后还是要落到真机上。microduck-lab 提供了一条简单直接的 sim2real 路径。

第一步,把训练好的策略权重保存为 PyTorch state dict。scripts/deploy_real.py会加载这个权重文件,并构建只包含策略网络部分的推理模型。第二步,hardware/servo_bus.py负责连接舵机控制总线,把 PyTorch 输出的动作向量转换为舵机目标角度。第三步,真机环境的step函数会读取当前关节角度(通过舵机反馈),再配合目标位置计算下一帧动作。

这里的关键是延迟。仿真环境里,状态更新没有延迟;真机环境里,从发出指令到舵机反馈状态,通常有几十毫秒的延迟。如果策略网络对状态变化过于敏感,真机部署就会抖动。microduck-lab 的策略没有显式处理延迟,但它的低动作惩罚系数(0.01)和较平滑的奖励函数设计,天然会引导出保守型策略,降低了 sim2real 的难度。

我个人的建议是,在上真机之前,先在仿真环境里加一点观测噪声和延迟,再做一次训练。这是标准的 domain randomization 思想,microduck-lab 虽然没有默认开启这个功能,但它的代码架构里预留了 wrapper 位置,你在envs/register.py的创建逻辑里加一行ObservationNoiseWrapper(env)就能实现,非常方便。

5. 静态评测中的隐患与避坑指南

5.1 依赖版本与 Apple Silicon 的兼容雷区

我在评测 microduck-lab 的代码时,发现一个容易被新手忽略的地方:requirements.txt里没有锁定 PyTorch 的具体版本。这在大规模工程里是大忌,但在这个项目里我理解作者的意图——他想支持尽量多的环境。不过如果你想完整复现它的训练效果,我建议你手动锁定这几个包的版本:

软件包建议版本原因
PyTorch2.2.xMPS 后端稳定,算子齐全
gymnasium0.29.x0.29 之后register接口有变化,老代码会报错
mujoco2.3.7 以上对 arm64 macOS 原生支持
numpy1.26.x2.0 版本后 API 变化较大,可能影响旧代码

这里有同学可能会问:为什么 numpy 也要锁版本?因为 MuJoCo 和 gymnasium 在底层都依赖 numpy 的 C 扩展接口,numpy 2.0 调整了 ABI(应用二进制接口),导致很多预编译包直接崩溃。这个问题在 Apple Silicon 上尤其明显,因为很多包的 macOS arm64 轮子还没有完全跟上 numpy 2.0 的脚步。我在评测第一个晚上就因为这个浪费了 2 个小时排查:环境一启动就报Segmentation fault,后来把 numpy 降回 1.26.4 才恢复正常。

5.2 训练不稳定的排查思路

RL 训练哭爹喊娘是常态,microduck-lab 也不免俗。我整理了静态评测中可能会遇到的几个典型情况,以及对应的排查方向。

第一,loss 出现 NaN。这个现象大概率不是算法问题,而是数值精度问题。排查顺序是:先检查 MuJoCo 仿真器是否在特定状态下输出异常值(比如方块掉出工作台,位置变成 inf);再检查奖励函数是否出现除零;最后检查 MPS 后端的 float16 问题。microduck-lab 的代码在这几处都有防御性检查,但如果你改了模型文件或者奖励函数,就要特别注意。

第二,策略收敛太快但成功率低。这是典型的“局部最优”现象。通常原因是奖励函数中稀疏事件奖励占比太高,模型过早学会了“不动作”策略来规避惩罚。调整思路是降低稀疏奖励权重,提高距离引导奖励的权重。另外一个常见原因是在仿真的早期阶段,方块初始位置太集中,导致策略没有见过多样化的状态分布。

第三,真机部署时剧烈抖动。这基本可以确定是 sim2real gap 的问题,不是算法 bug。建议的做法是:先检查动作平滑项是否生效;再看策略网络的输出频率是否高于舵机的响应频率;最后考虑在仿真环境中增加随机扰动来提升鲁棒性。microduck-lab 的代码里没有内置的“动作平滑”模块,但这是一个 5 分钟就能写出来的小 wrapper,强烈建议部署真机前加上。

5.3 硬件与仿真不一致的静态检查清单

在做静态评测时,我还重点关注了硬件与仿真的一致性。因为具身 RL 项目最大的陷阱之一,就是仿真里所有东西都看起来正确,但到了真机才发现关节定义、方向约定、单位制都不一样。

检查清单如下:

  • 关节顺序是否一致。仿真模型里的关节索引顺序必须和舵机控制总线的检测顺序一致。microduck-lab 在servo_bus.py里通过servo_id做了映射,但映射错误是很隐蔽的问题。
  • 角度单位是否一致。MuJoCo 默认使用弧度,舵机控制大多是角度值。这个换算如果出错,训练出的策略看起来完全正常,但真机动作会差 57.3 倍。
  • 正负方向是否一致。很多机械臂的关节正方向定义各不相同,需要逐个关节核对。

这些检查项在 README 里没有特别强调,但它们是实际部署真机前必须过一遍的步骤。

6. 从项目演进看具身 RL 的硬件和工具链趋势

6.1 不只是“跑通”,还能往哪些方向扩展

microduck-lab 当前版本解决的是“单臂 + 方块放置”的任务,但它的代码架构为扩展留下了充足空间。我在评测中预估了几个可以直接落地的扩展方向。

第一个方向是视觉策略。现在的状态输入是纯低维状态(关节角度、位置坐标),但具身智能的主流方向是视觉输入。项目里预留了policies/cnn.py,说明作者考虑过视觉扩展。你只需要在环境里加一个“在 MuJoCo 渲染主相机图像”的步骤,并把图像输入到 CNN 策略网络里,就能升级成视觉反馈的 RL 训练。复杂度会上升不少,但基础设施是现成的。

第二个方向是多任务学习。比如让机械臂学会“夹取方块”和“推方块到目标位置”两个任务。microduck-lab 的环境接口用task_name参数就能切换不同任务配置,这个设计预留得不错。多任务 RL 的价值在于,它比单任务训练出的策略泛化性强很多,对后续迁移到真实世界更有帮助。

第三个方向是双臂协同。虽然单臂任务是最简单的一类具身问题,但如果想更接近现实场景(比如双手协作折叠衣物),代码架构需要做大调整。好在hardware/层的抽象能复用,主要改动集中在环境定义和状态/动作空间的设计上。

6.2 个人体会:静态评测之外,你还能从 microduck-lab 里学到什么

这次静态评测做到后面,我越来越觉得 microduck-lab 的价值不止于“一个能跑通 RL 的仓库”。它更像一个关于“如何低成本进入具身智能”的方法论样本。

它在几个关键决策上展示了什么叫做“克制”。不用庞大的 Isaac Lab,而是用简单的 MuJoCo;不追求分布式训练,而是用单机的 8 并行环境;不花巨额预算买工业机械臂,而是用总线舵机机械臂;不硬上视觉 RL,而是先用 state-based 把闭环跑通。这一套组合拳的思考模式,比单个算法本身更有学习价值——如果你以后要做一个新的具身项目,这种“先明确约束条件,再倒推技术选型”的思路能帮你避开很多不必要的复杂度。

我也必须说,这个项目不是没有短板。它的 PPO 实现比较基础,和工业级实现相比缺少一些优化技巧(比如学习率衰减、梯度裁剪、advantage 归一化),这些对任务成功率有实质性影响,你不能指望开箱即用地跑出最优结果。另外,assets/里的仿真模型精度一般,如果你想做更精细的 sim2real,可能需要自己动手调模型参数。

但反过来讲,这些“不完美”恰恰是这个项目最可贵的地方。一个完全工业化的框架会把你淹没在大量抽象层里,让你学不到东西;而 microduck-lab 这种“裸奔”状态,能让你一眼看清楚每个组件是怎么工作的。踩到坑,再自己修好,这个过程中获得的理解,比跑通十个黑盒 demo 都要深刻。我个人始终认为,具身智能的难点不在大模型,而在于对物理世界建模的执念——一个能让你低成本反复试错的项目,才最有可能引导新手建立起这种执念。

如果你是刚入坑具身 RL,手里恰好是一台 M 系列芯片 Mac,预算有限但有折腾的精神,那 microduck-lab 是个值得从README开始细读的起点。从仿真到真机,从环境到算法,从被坑到填坑,这不只是一个开源项目,也是我见过最能拉低具身智能入门门槛的一次尝试。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询