在四足机器狗、人形机器人或高性能机械臂的开发中,传统的“位置/速度/扭矩”独立控制模式往往因为通信帧率限制,无法满足全身高频动力学控制的需求。此时,MIT 控制模式成为了开发者们的首选。
本教程将手把手教您如何使用 C++ 语言,通过 CAN 总线配置并控制 CubeMars AK60-6 (KV80) 关节电机 的 MIT 模式。通过本教程,您将掌握底层通信协议的核心逻辑,解锁电机高响应、低延迟的极致控制性能。
在开始编写 C++ 代码之前,请确保您已准备好以下软硬件环境:
核心硬件:CubeMars AK60-6 (KV80) 关节电机、可靠的 CAN 通信接口(如 USB-to-CAN 模块、CANoe 或带 CAN 接口的开发板)。
软件环境:C++ 编译器(如 GCC, MSVC),以及支持 CAN 通信的第三方库(如 pcanbasic, socketcan 等)。
辅助工具:CubeMars 官方上位机软件(用于初始参数配置)。
在动手写代码前,我们需要明白为什么要用 MIT 模式。传统的控制模式每次只能发送一个参数(如只发位置或只发速度)。而 MIT 模式允许在仅仅一个标准的 8 字节 CAN 报文中,同时打包发送以下 5 个关键参数:
目标位置 (Position)
目标速度 (Velocity)
目标扭矩 (Torque / Kt * I)
位置 PD 增益 (Kp)
速度 PD 增益 (Kd)
这种“大一统”的报文设计,极大地降低了通信延迟,是實現机器人高频步态控制和柔顺力控的基石。
代码运行前,必须确保电机处于正确的物理和参数状态:
物理接线:将 CAN 接口的 CAN_H 和 CAN_L 分别对应连接至 AK60-6 电机的 CAN_H 和 CAN_L。确保共地。
上位机配置:
使用 CubeMars 上位机连接电机。
将电机的 CAN ID 设置为您期望的值(例如 0x01),并记住它,C++ 代码中需要用到。
将 波特率 (Baud Rate) 设置为 1Mbps (1000kbps),这是 MIT 模式下的推荐标准波特率。
点击软件中的 “进入 MIT 模式” 按钮。此时电机轴转动会有明显的电磁阻尼感,说明配置成功。
在 C++ 环境中,控制 AK60-6 的核心逻辑可以拆解为以下三个关键步骤(完整的工程代码及数据转换函数请下载下方附件):
1. 发送“使能 (Enable)”指令:电机进入 MIT 模式后,默认处于安全锁定状态。在发送控制报文前,必须先发送一个特定的使能报文(通常是将 8 字节数据全部置为 0x00,或发送特定的 Enable ID 和帧内容),解锁电机。只有听到电机发出“滴”的提示音,才代表使能成功。
2. 浮点数到无符号整型的“数据打包”:这是 MIT 模式 C++ 代码中最核心的算法。由于 CAN 报文只能传输整型字节,我们需要将物理世界的浮点数(如目标位置 -12.5 rad)映射为 16 位或 12 位的无符号整数。
逻辑:使用线性映射函数 float_to_uint(x, x_min, x_max, bits)。
操作:将目标位置、速度、扭矩、Kp、Kd 分别限制在电机允许的安全范围内,然后按比例转换为对应的 Hex 值。
3. 组装并发送 8 字节 CAN 报文:将上一步得到的 5 个整型参数,按照 CubeMars 通信协议规定的位序,拼接成一个 8 字节(64 bit)的数组。最后,调用您的 CAN 库函数,将这个数组通过指定的 CAN ID 发送给电机。电机接收到后,会瞬间解算并执行动作。
完成 C++ 代码的编译与烧录/运行后,给 AK60-6 电机上电。
运行您的 C++ 程序,您应该能看到电机轴随着代码中设定的目标位置、速度和扭矩参数,做出极其平滑且响应极快的动作。您可以尝试在代码中动态改变 Kp 和 Kd 的值,直观感受电机刚度和柔顺性的变化。
Q1:C++ 发送报文后,电机没反应或者报错?
A: 请检查以下三点:1. 电机是否已经成功发送了“Enable(使能)”指令?2. C++ 代码中的 CAN ID 是否与上位机设置的电机 ID 完全一致?3. 数据映射时,目标值是否超出了电机协议中规定的 P_MAX 或 V_MAX 限制?(超出限制会导致报文被电机拒绝)。
Q2:代码里的“大小端 (Byte Order)”问题怎么处理?
A: CubeMars 的 CAN 协议通常采用大端模式 (Big-Endian) 进行数据传输。在 C++ 中组装 8 字节报文时,请务必注意字节的高低有效位顺序(MSB/LSB),否则电机解算出的位置和扭矩会发生严重错乱。具体的字节拼接顺序请严格参考下载的《通信协议手册》。
Q3:如何实现电机的“零位 (Zero Position)”校准?
A: 在 MIT 模式下,发送特定的“将当前位置设为零位”的 CAN 指令(具体 ID 和数据帧请参考协议手册),电机会记录当前转子位置为机械零点。建议在每次系统上电初始化时执行此操作。
AK60-6 (KV80) 凭借其紧凑的 60mm 法兰尺寸和出色的动态性能,非常适合轻型机械臂、云台及四足机器人的腿部关节。
[深入了解 CubeMars AK60-6 (KV80) 产品详细参数与尺寸]