Go2 + Z1 六轴臂 + 可动夹爪
把 Unitree Go2 四足机器人和带原装夹爪的 Z1 六轴机械臂装成一台机器,在 MuJoCo 物理引擎里做三个动作:夹爪反复开合、抓住红色方块抬离台面、把方块横移 10 厘米后放下。下面这个三维视窗回放的是仿真跑出来的真实轨迹——每一帧的位姿都由物理引擎算出,不是手工调的动画。
点任意一张图上的位置可以跳到那一刻。灰色竖带是阶段分界。
这台机器是怎么拼起来的
两个模型都来自 Google DeepMind 的 MuJoCo Menagerie(一个官方维护的机器人模型库),锁在提交 8161bba。机械臂用的是 z1_gripper.xml 而不是没有夹爪的 z1.xml——保留原厂的六个关节 joint1–joint6,加上原装旋转夹爪 jointGripper:一个固定指、一个活动指。
build_scene.py 做的是合并:给两个模型里重名的 default class 加前缀、重写网格路径、把 Z1 挂到 Go2 机身上方的一块安装板上,最后吐出一个可以直接在 MuJoCo 里打开的 scene.xml。
底盘是固定的。Go2 的机身被钉在世界坐标系里,四条腿由 PD 控制器(比例-微分控制,最常见的一种反馈控制)维持站姿。这一版不含自由浮动底盘的平衡、行走或全身控制——机械臂动的时候,狗不会被反作用力推动。安装位置是演示配置,不是标定过的实机安装参数。
抓取完全靠接触摩擦。运行过程中不往方块的位姿里写任何数值,也没有建立吸附或焊接约束——方块被夹住,是因为两个指头的接触力和摩擦真的托住了它。夹爪的原始碰撞形状全部保留,只把接触摩擦系数设成 3 .05 .005、condim=6、solref=.004 1。
三个 demo 分别在做什么
这次跑出来的数
下表直接读自本次仿真写出的 *_metrics.json,不是手抄的。每个 demo 都带一份逐帧 *_trace.json。
离桌间隙按「方块质心 z 减 20 毫米再减桌面高度 335 毫米」算,是名义值,没有按方块的旋转做修正。
这个 demo 不能证明什么
仿真器自己渲的画面
上面的三维视窗是用记录下来的位姿在浏览器里重绘的。下面这三段是 MuJoCo 离屏渲染器直接输出的原片,两者对得上,可以用来核对。
同一帧,两个渲染器
抓取抬升第 330 帧(t = 6.60 s,HOLD 阶段),同一台相机参数。把两张图的边缘图叠起来做互相关,最佳对齐位移是 0 像素,浏览器这边的边缘到仿真器边缘的中位距离也是 0 像素——机位和几何是对得上的,剩下的差别只在光照和材质。
自己跑一遍
源码包里带齐了模型、网格和各自的许可证,不需要另外下载。
python -m pip install -r requirements.txt
python demo.py --demo open_close --render
python demo.py --demo pick_lift --render
python demo.py --demo pick_place --render
视频和指标写到 output/。不加 --render 就是纯物理仿真,三个例子在一台 M 系列 Mac 上总共跑不到 3 秒。Linux 桌面上想开交互窗口用 MUJOCO_GL=glfw python demo.py --demo pick_lift --viewer;macOS 需要用 MuJoCo 的 mjpython 启动。
直接在 MuJoCo 里打开 scene.xml 也能看到这台机器,但那样没有 Python 侧的初始姿态和控制,建议还是从 demo.py 启动。