Skip to main content

概述

本篇实践介绍如何配置 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 模式,无需额外设置控制模式。

2. 使能并确认电机就绪

使能是一个动作请求。发送运动指令前,订阅 joint_diagnostics 并确认所有在线关节已进入 Enabled。Python 示例等待最多 5 秒,超时退出,诊断订阅在 finally 中关闭。
C 调用 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 关节指令帧。
smooth_home() 是 Python 示例 中的辅助函数。它等待有效状态帧,以当前位置为插值起点,每个周期调用 publisher.send()。C 的轨迹循环根据时间计算位置和速度,并用在线位图跳过离线关节。保留 Python 示例 和 C 示例 中的读取超时、发送失败和停止请求处理。

4. 停止发送并释放资源

Python 示例 和 C 示例 在发送循环结束后先关闭发布器,再失能、断开设备。Python 将清理放在 finally 中,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 序列化后直接发出、不等待响应,因此能支撑高频循环。

发布频率的选择

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

只控制部分关节

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

相关内容