检查机器人接线
机器人相关的接线必须和图中的一摸一样,相关的链路要求保持一致。
打开 RoboTamerSdk4Qmini/include/user/Motor_thread.hpp 并修改 USB 转四路 485 适配器对应的四个串口 ID,可通过 ls /dev/serial/by-id 查看具体 ID,并将下方代码中 ****** 部分替换为真实 ID,注意如果存在多个串口,注意根据命名规律识别。
std::vector<SerialGroup> serialGroups = {
{"/dev/serial/by-id/usb-FTDI_USB__-__Serial_Converter_FT******-if03-port0", { 0, 5 }}, // CH4
{"/dev/serial/by-id/usb-FTDI_USB__-__Serial_Converter_FT******-if02-port0", { 1, 6 }}, // CH3
{"/dev/serial/by-id/usb-FTDI_USB__-__Serial_Converter_FT******-if00-port0", { 2, 3, 4 }}, // CH1
{"/dev/serial/by-id/usb-FTDI_USB__-__Serial_Converter_FT******-if01-port0", { 7, 8, 9 }} // CH2
};2
3
4
5
6
效果:
IMU指定
原有的机器人IMU有问题,我们换成了 N100 型号的IMU,所以我们需要修改 RoboTamerSdk4Qmini 中指定的IMU数据输出口。
打开 ~/RoboTamerSdk4Qmini/include/user/IMU/imu_receiver.py 文件,修改 N100 IMU 对应的 ID,可通过 ls /dev/serial/by-id 查看具体 ID:
将下方代码中 port 替换为真实 ID,注意根据命名规律识别:
权限管理
需要将用到的 /dev 设备全部给予 lckfb 用户访问权限,我们使用 udev 规则实现,这样的话我们就能针对性的对特定规则实现。
- 使用
ls -l /dev/serial/by-id查看相关的接口是什么:
可以看到有以下的对应关系:
USB转四路485适配器对应的接口就是ttyUSB0 ~ ttyUSB3N100 IMU对应的接口是ttyUSB4
- 创建
/etc/udev/rules.d/99-robot.rules文件,并写入以下内容:
根据显示信息修改相关参数。因为
USB转四路485适配器与N100 IMU对应的接口就是ttyUSB0 ~ ttyUSB4参数一致,只要写一条即可。
KERNEL=="ttyUSB*", MODE="0666"- 使其配置生效:
sudo udevadm control --reload-rules
sudo udevadm trigger2
修改通讯接口
打开 ~/RoboTamerSdk4Qmini/source/run_interface.cpp 此文件,需要将 eth0 改为 lo ,使用本地回环进行操作,这样我们就可以方便很多!
这是初始化 DDS 中间件(Unitree 用的是 CycloneDDS),网口只是告诉 DDS 在哪个网络接口上做节点发现和通信。DDS 在这里用于:
- 手柄/摇杆输入(
xRockerGamepad.InitDdsModel())- 发布/订阅
rt/lowcmd、rt/lowstate话题(供监控或其他节点用)
lckfb@localhost:~/RoboTamerSdk4Qmini$ git diff /home/lckfb/RoboTamerSdk4Qmini/source/run_interface.cpp
diff --git a/source/run_interface.cpp b/source/run_interface.cpp
index bf9ecdc..2966f0c 100644
--- a/source/run_interface.cpp
+++ b/source/run_interface.cpp
@@ -1,8 +1,8 @@
#include "user/custom.hpp"
int main(int argc, char const *argv[]) {
- std::cout << "Usage networkInterface: " << "eth0 of Q1 robot " << std::endl;
- std::string networkInterface = "eth0";
+ std::cout << "Usage networkInterface: " << "lo of Q1 robot " << std::endl;
+ std::string networkInterface = "lo";
G1 g1(networkInterface, false);
while (true) sleep(10);2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
关节调零
- 断开 Qmini 电源,关节电机绿色指示灯全部熄灭,使用USB线单独给主控电脑(泰山派3M-RK3576)供电
- 通过 SSH 登录主控电脑,修改
~/RoboTamerSdk4Qmini/include/user/Motor_Thread.hpp文件:
std::array<float, 10> Startq = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };- 保存并重新编译
# 进入构建目录
cd ~/RoboTamerSdk4Qmini/build
# 构建项目
cmake -DPLATFORM=arm64 .. && make -j22
3
4
5
- 编译完成后,开启
PS4手柄,连接蓝牙。 - 参考 Qmini 手册中的零位标定姿势(双腿外翻并向后扬起,每个关节均达到限位)即可,并牢记以后只要 Qmini 断电,必须摆放至该姿势后再进行上电:
- 关节上电
- 执行操作:
- 切换至
cd ~/RoboTamerSdk4Qmini/bin目录 - 运行
sudo ip link set lo multicast on开启 MULTICAST = DDS 进程互相认识的握手机制 - 运行
./run_interface 2>&1 | tee /home/lckfb/robot-logs/tmp_run_interface_$(date +%Y%m%d_%H%M%S).log,待数值趋于稳定后 - 复制任意一组
q值,例如:
复制 [] 中的数值,注释掉当前 Startq,将复制好的 10 个数四舍五入后,保留2位小数,并作为新的 q 值,例如:
//std::array<float, 10> Startq = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
std::array<float, 10> Startq = { 0.119672, 0.212419, 0.58618, 0.493727, 0.115964, 0.562708, 0.00526843, 0.476245, 0.0409862, 0.664455 };2
- 保存,并再次编译:
# 进入构建目录
cd ~/RoboTamerSdk4Qmini/build
# 构建项目
cmake -DPLATFORM=arm64 .. && make -j22
3
4
5
- 电机断电,然后电机重新上电(每次开机都要使用上述固定的姿势开机),切换至
~/RoboTamerSdk4Qmini/bin目录,再次运行./run_interface 2>&1 | tee /home/lckfb/robot-logs/run_interface_$(date +%Y%m%d_%H%M%S).log,此时你可以发现新打印的数值,几乎都接近零,代表零位标定完成,例如:
q: -0.00480433 0.00978649 0.00518107 0.00503349 0.00371964 0.00483339 -0.00739716 -0.00747706 0.00818987 0.0111182- 恭喜你,完成了调零,以后每次开机都要使用固定的姿势开机(机器人零位标定姿势示意图)!
测试
- 打开
~/RoboTamerSdk4Qmini/source/user/custom.cpp将相关的rpy输出打开:
- 重新编译
# 进入构建目录
cd ~/RoboTamerSdk4Qmini/build
# 构建项目
cmake -DPLATFORM=arm64 .. && make -j22
3
4
5
- 将机器人调整至机器人零位标定姿势并且上电,运行程序
cd ~/RoboTamerSdk4Qmini/bin && sudo ./run_interface,然后我们随意晃动机身,发现imu的rpy跟随机身摇晃,发生对应的变化即通过!