概述
本篇实践介绍如何配置 MIT 参数并发布关节控制指令,将在线关节从当前位置平滑移动到零位。应用场景包括平滑归零、接入遥操作和发送上层控制器生成的目标轨迹。 对应的 Python 示例为 2.publish.py,C 示例为 1_control_motion.c。 指令字段见 JointCommand,控制参数见 MitParam。本示例会使能电机并驱动全部在线关节。开始前清空手部周围的人员、线缆与台面物品,全程有人监护,并保持随时断电的条件。
前置条件
硬件
本示例连接扫到的第一台 Wuji Hand 2(
hand_devices[0])。共用网络里要改成指定 SN。
软件
控制参数
这三个控制量与出厂默认值一致,实测读回也是
kp=3, kd=0.05, effort_limit=1.5。
数据流
参数设置支持广播
effort_limit 与 mit_params 的 set() 是多态的:
集成步骤
1. 连接并配置控制参数
扫描并连接目标 Wuji Hand 2 后,设置力矩上限和 MIT 参数。Python 使用参数访问器,C 使用对应的 Hand 2 设置函数。固件默认使用 MIT 模式,无需额外设置控制模式。- Python
- C
2. 使能并确认电机就绪
使能是一个动作请求。发送运动指令前,订阅joint_diagnostics 并确认所有在线关节已进入 Enabled。Python 示例等待最多 5 秒,超时退出,诊断订阅在 finally 中关闭。
wuji_hand_2_enable(dev, NULL),通过 wuji_hand_2_subscribe_joint_diagnostics() 注册 on_diag。回调更新原子状态,主线程等待就绪或超时,再关闭诊断订阅。超时或订阅失败时失能并退出。
3. 创建发布器并发送轨迹
Python 示例 和 C 示例 演示不同的运动。Python 在 1.5 秒内从当前位置平滑归零,再保持零位 5 秒。C 运行多段正弦轨迹,在每段之间发送零位指令。两者都按 200 Hz 发送 20 关节指令帧。- Python
- C
smooth_home() 是 Python 示例 中的辅助函数。它等待有效状态帧,以当前位置为插值起点,每个周期调用 publisher.send()。C 的轨迹循环根据时间计算位置和速度,并用在线位图跳过离线关节。保留 Python 示例 和 C 示例 中的读取超时、发送失败和停止请求处理。
4. 停止发送并释放资源
Python 示例 和 C 示例 在发送循环结束后先关闭发布器,再失能、断开设备。Python 将清理放在finally 中,C 的发送失败路径也跳转到清理代码。
- Python
- C
运行与输出
- Python
- C
实测数据
在 20 关节全在线的右手 Wuji Hand 2 上实跑:enable() 返回与电机就绪之间差了 26 倍时间。这段窗口里发出的指令会被丢弃或产生非预期行为,等待步骤是必需的。
归零后各关节没有精确停在 0,残留在 0.02 rad 以内。MIT 阻抗是柔性控制,静摩擦与重力会让实际位置与目标存在稳态偏差,这是正常表现。
注意事项
ext_state 取值:0 为 Init,1 为 Ready,2 为 Enabled,3 为 Stopped。实测 enable 前全部关节是 1,enable 后 52 毫秒内全部变 2。
扩展用法
调整归零柔和度
改HOME_SECONDS。调大让每帧位置增量更小,动作更柔和。不要用降低 kp 的方式求柔和,那会牺牲整体跟随精度。
接入自己的轨迹
将第 5 步的插值替换为轨迹源,publisher.send() 的调用方式不变。每次 send() 发送一个完整的 20 维帧,SDK 序列化后直接发出、不等待响应,因此能支撑高频循环。