Skip to content

适配 GO-M8010-6 型号电机的 SDK,支持 x86/ARM

Notifications You must be signed in to change notification settings

postrantor/unitree_motor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

date author
2025-02-15 01:18:19 -0800
postrantor@gmail.com

how to build

cmake -Bbuild .
cmake --build build -j1

how to run

run examples with sudo, e.g.

sudo ./motor_run 0 POSITION FOC
sudo ./motor_run 1 VELOCITY FOC
sudo ./motor_run 1 TAU FOC
sudo ./motor_run 2 ZEROTAU FOC
sudo ./motor_run 2 HYBRID FOC

Note

support motor: GO-M8010-6 motor not support motor: A1 motor、 B1 motor (Check A1B1 branch for support)

reference

https://www.unitree.com/cn/go1motor https://support.unitree.com/home/zh/Motor_SDK_Dev_Guide/Get_SDK

电机的配置

查看串口名

将 USB 转 RS-485 转接口连接在上位机上时,上位机会为这个串口分配一个串口名。在 Linux 系统中,这个串口名一般是以“ttyUSB”开头,在 Windows 系统中,串口名往往以“COM”开头。

在 Linux 系统中,一切外接设备都是以文件形式存在的。USB 转 RS-485 转接器也可以被视为/dev 文件夹下的一个“文件”。打开任意一个终端窗口(在 Ubuntu 下快捷键为 Ctrl+Alt+t 组合键),运行如下命令:

cd /dev
ls | grep ttyUSB
# or
lsusb

获取电机工具箱

使用 Unitree MotorTools 时,请确保 RS485 总线上只有一个电机,并且没有其他主机在工作(向总线发送数据)

查看电机 ID

”查看“和”修改“电机 ID 需要将电机切换到”工厂模式“,切换前请确保所有电机已经停止工作,主机也不再向电机发送运动控制指令。

sudo ./swboot /dev/ttyUSB0

再 linux 中通过串口映射,对接入的串口设备进行重命名:

# date: 2025-02-07 13:09:47
# author: postrantor@gmail.com
# unitree_motor - 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
"1-1.1:1.0", "unitree_rl_legged"
"1-1.1:1.1", "unitree_rr_legged"
"1-1.1:1.2", "unitree_fl_legged"
"1-1.1:1.3", "unitree_fr_legged"

稍等片刻,进入工厂模式的电机背部绿色指示灯会变成每秒快速闪烁 3 次的状态,此时终端上会显示所有已经进入工厂模式的电机。 正常情况,打印的列表中不会有 ID 大于 15 的电机。如果这发生了请重新给电机上电再试一次。 如果存在 ID 为 15 的电机,则说明该电机还没有设置 ID,您可以参照 6.4 配置。

更改电机 ID

要修改电机的 ID 需要使用 changeid 命令,用法为:

# changeid [串口号] [原来的 ID] [要修改的 ID]
# 设置电机 ID0 为 ID1
changeid /dev/ttyUSB0 0 1

切换前请确保所有电机已经停止工作,主机也不再向电机发送运动控制指令。

电机固件升级

Go-M8010-6 电机支持升级电机固件,方便后期提高电机性能和安全修复,您可以将宇树科技提供给您的固件文件使用 unisp 工具下载到电机中。要升级电机固件需要使用 unisp 命令,用法为:

unisp [串口号] [.bin升级文件] [要刷入的电机ID]
unisp /dev/ttyUSB0 ./GoM80106_v1.0.bin 0

切换回电机模式

查看和修改电机 ID 会让电机切换到工厂模式,如果不手动切换回电机模式,即使给电机重新上电也还会进入工厂模式。 进入工厂模式的电机背部绿色指示灯会变成每秒快速闪烁 3 次的状态。

此时使用命令 ./swmotor 即可切换到电机模式,用法为:

swmotor [串口号]
swmotor /dev/ttyUSB0

即可让该 RS485 总线上所有的电机切换到电机模式,此时电机就可以接收运动控制指令了。

电机的控制

接下来我们修改 cmd。首先解释一下 MotorCmd 类型结构体包含的数据:

  1. id: 当前控制命令的目标电机 ID
  2. mode: 目标电机运行模式。 0.停止 1.FOC 2.电机标定
  3. T: 前馈力矩 𝜏𝑓𝑓
  4. W 指定角速度 𝜔𝑑𝑒𝑠
  5. Pos: 指定角度位置 𝑝𝑑𝑒𝑠
  6. K_P: 位置刚度 𝑘𝑝
  7. K_W: 速度刚度(阻尼)𝑘𝑑

当 mode 的值为 0 时,后面的 5 个控制参数并没有任何作用。当 mode 的值为 2 时,表示进行电机标定。在这个例子中我们将 mode 的值设为 1。这里我们让电机以恒定的速度旋转,完整的代码为:

cmd.motorType = MotorType::Go2;

cmd.id = 0;
cmd.mode = 1;

cmd.K_P = 0;
cmd.W = 6.28*6.33;
cmd.K_W = 0.02;
cmd.T = 0.0;

_ioPort.sendRecv(&cmd,&data);

下面我们就可以给电机发送命令了,控制命令会通过_ioPort 对象的 sendRecv(&cmd,&data)函数给电机发送一次控制命令,并接收一次电机的当前状态信息。

此处需要特别注意的是,给电机发送的命令都是针对减速器之前的电机转子,即图 5 中的转轴 1。而不是经过减速之后的输出轴 2。所以在进行实际控制的过程中,一定要注意考虑电机的减速比。在 GO-8010-6 的电机中,减速比为 6.33

位置模式

在位置模式下,电机的输出轴将会稳定在一个固定的位置。例如,如果我们希望电机输出端固定在 3.14 弧度的位置,可以将控制参数如下设置:

cmd.T = 0.0;
cmd.W = 0.0;

cmd.Pos = 3.14*6.33;
cmd.K_P = 0.02;
cmd.K_W = 0.0;

在上述参数设置中,将 T 与 W 设置为 0,即可成为针对 Pos 的 PD 控制。其中 K_P 为比例系数, K_W 为微分系数,6.33 为减速比。

再尝试完成上述修改后,重新编译并运行相关可执行文件,即可从电机返回的状态看出,电机转子的位置稳定在 3.14×6.33 弧度,即电机输出端固定在 3.14 弧度的位置。可知,如果目标位置和当前位置之间差距很大,那么电机产生的力矩 𝜏 也会很大,从而产生一个很大的电流。如果给电机供电的电源的输出电流上限较小,可能会出现电源保护,即电机停止旋转。此时就需要考虑让 cmd.Pos 缓慢变化,避免产生瞬间的极大力矩。

速度模式

在速度模式下,电机的输出轴将会稳定在一个固定的速度。令电机输出轴转速稳定在 6.28rad/s:

cmd.T = 0.0;
cmd K_P = 0.0;
cmd.Pos = 0.0;

cmd.W = 6.28*6.33;
cmd.K_W = 0.02;

速度模式 T 和 K_P 必须为 0,这样就构成了对 W 的 P 控制。其中 K_W 为速度的比例系数。

阻尼模式

阻尼模式是一种特殊的速度模式。当我们令 W = 0.0 时,电机会保持转轴速度为 0。并且在被外力旋转时,产生一个阻抗力矩。这个力矩的方向与旋转方向相反,大小与旋转速度成正比。当停止外力旋转后,电机会静止在当前位置。因为这种状态和线性阻尼器类似,所以被称为阻尼模式。

cmd.T = 0.0;
cmd.Pos = 0.0;
cmd K_P = 0.0;

cmd.W = 0.0;
cmd.K_W = 0.02;

力矩模式

在力矩模式下,电机会持续输出一个恒定力矩。但是当电机空转时,如果给一个较大的目标力矩,电机会持续加速,直到最大速度,这时也仍然达不到目标力矩。

下面提供一个无负载情况下比较安全的力矩模式参数设置:

cmd.T = 0.05;

cmd.W = 0.0;
cmd.Pos = 0.0;
cmd.K_P = 0.0;
cmd.K_W = 0.0;

在该参数下,可以观察到电机在恒定力矩下逐渐加速的过程。因为各个电机之间存在细微差异,如果电机无法顺利旋转,可以适量增大 T 的数值或用手轻轻助推一下。

零力矩模式

零力矩模式是一种特殊的力矩模式。当我们将命令修改为下列设置时,电机会保持转轴的力矩为 0:

cmd.T = 0.0;
cmd.W = 0.0;
cmd.Pos = 0.0;
cmd.K_P = 0.0;
cmd.K_W = 0.0;

此时电机并不是停止运转,而是主动产生力矩来抵抗自身的摩擦力矩。在零力矩模式下,尝试转动输出轴,会感觉输出轴的阻力明显小于未开机时的阻力。

力位混合模式

在四足机器人的实际控制时,机器人运动控制器往往会给关节同时发送前馈力矩 𝜏𝑓𝑓、目标角度 𝑝𝑑𝑒𝑠 和目标角速度 𝜔𝑑𝑒𝑠。这时的控制模式就是力位混合控制,这也是我们在后面的实际应用中使用最多的一种控制模式。

About

适配 GO-M8010-6 型号电机的 SDK,支持 x86/ARM

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published