跳转到主要内容

概述

配置 MIT 阻抗控制参数,使能电机,把每个关节从当前测量位置平滑插值到零位,然后保持。 这是控制 Wuji Hand 2 的基本范式。示例本身做的是归零,但 publisher.send() 这条路径同样承载遥操作、轨迹回放、上层控制器输出。 对应的 Python 示例为 2.publish.py,C 示例为 1_control_motion.c。 关节命令的字段与取值范围见关节状态与控制,控制模式与安全边界见控制指南,本页只讲怎么跑起来与实测结果。
本示例会使能电机并驱动全部在线关节。开始前清空手部周围的人员、线缆与台面物品,全程有人监护,并保持随时断电的条件。

插值的作用

直接发 pos=0 和插值到 pos=0,在 MIT 阻抗下是两种完全不同的动作。 MIT 控制的力矩正比于位置偏差。手部原本弯曲时,第一帧 pos=0 的偏差就是「当前角度 − 0」,配上 kp=3 会产生一个大力矩,手猛地弹回零位。 插值的做法是先读当前位置,再把目标从当前值线性拉到 0。每帧的偏差都很小,力矩随之很小,整段动作柔和。柔和来自目标轨迹,不是来自调低增益,所以 kp 与 kd 保持正常值。

前置条件

硬件

本示例连接扫到的第一台 Wuji Hand 2(hand_devices[0])。共用网络里要改成指定 SN。

软件

控制参数

这三个控制量与出厂默认值一致,实测读回也是 kp=3, kd=0.05, effort_limit=1.5。

数据流

参数设置支持广播

effort_limit 与 mit_params 的 set() 是多态的:

运行时分支

ext_state 取值:0 为 Init,1 为 Ready,2 为 Enabled,3 为 Stopped。实测 enable 前全部关节是 1,enable 后 52 毫秒内全部变 2。

调用顺序

第 3 步不能省。第 6 步的失能要早于关闭发布器。

运行与输出

实测数据

在 20 关节全在线的右手 Wuji Hand 2 上实跑: enable() 返回与电机就绪之间差了 26 倍时间。这段窗口里发出的指令会被丢弃或产生非预期行为,等待步骤是必需的。 归零后各关节没有精确停在 0,残留在 0.02 rad 以内。MIT 阻抗是柔性控制,静摩擦与重力会让实际位置与目标存在稳态偏差,这是正常表现。

调整与适配

调整归零柔和度

改 HOME_SECONDS。调大让每帧位置增量更小,动作更柔和。不要用降低 kp 的方式求柔和,那会牺牲整体跟随精度。

接入自己的轨迹

将第 5 步的插值替换为轨迹源,publisher.send() 的调用方式不变。每次 send() 发送一个完整的 20 维帧,SDK 序列化后直接发出、不等待响应,因此能支撑高频循环。

发布频率的选择

示例用 200 Hz。更高的频率让轨迹更平滑,但要保证生成一帧的耗时稳定小于周期。上面的实测显示 200 Hz 下实际频率精确到 200.0 Hz,说明这个量级留有余量。

只控制部分关节

每帧仍然要发完整的 20 维数组。不想动的关节应该填它们当前的测量位置,而不是填 0。填 0 等于命令它们回到零位,这是 MIT 关节扫描踩过的坑。

相关内容