date | author |
---|---|
2025-02-15 01:18:19 -0800 |
postrantor@gmail.com |
cmake -Bbuild .
cmake --build build -j1
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)
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 需要将电机切换到”工厂模式“,切换前请确保所有电机已经停止工作,主机也不再向电机发送运动控制指令。
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 需要使用 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 类型结构体包含的数据:
- id: 当前控制命令的目标电机 ID
- mode: 目标电机运行模式。 0.停止 1.FOC 2.电机标定
- T: 前馈力矩 𝜏𝑓𝑓
- W 指定角速度 𝜔𝑑𝑒𝑠
- Pos: 指定角度位置 𝑝𝑑𝑒𝑠
- K_P: 位置刚度 𝑘𝑝
- 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;
此时电机并不是停止运转,而是主动产生力矩来抵抗自身的摩擦力矩。在零力矩模式下,尝试转动输出轴,会感觉输出轴的阻力明显小于未开机时的阻力。
在四足机器人的实际控制时,机器人运动控制器往往会给关节同时发送前馈力矩 𝜏𝑓𝑓、目标角度 𝑝𝑑𝑒𝑠 和目标角速度 𝜔𝑑𝑒𝑠。这时的控制模式就是力位混合控制,这也是我们在后面的实际应用中使用最多的一种控制模式。