一、问题描述
在ROS中使用串口通讯时,由于传感器插入树莓派端口时间顺序不同,导致其对应的端口号也不同。先插上的是/dev/ttyUSB0,后插上的是/dev/ttyUSB1等等,依次递推。每次插入顺序不同,对应的串口号就不同,要想正常使用就得修改对应的串口配置文件。针对这一问题,我们可以通过将串口映射到固定端口的别名上来解决这一问题。
参考博客
【ROS学习】修改串口的别名_Q小鑫的博客-CSDN博客_串口名称怎么修改
二、查看串口号
lsusb
我们可以看到我们插入的设备的对应信息。
三、编写rule文件
进入rules.d文件夹,创建自己需要的传感器的.rules文件。
cd /etc/udev/rules.d
sudo vim rplidar.rules
编写规则,其中10ce,ea60就对应着之前查到的传感器串口信息。
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
KERNEL:设备在内核的名称(ttyUSB*)
ATTRS{idVendor}以及ATTRS{idProduct}:(之前查询到的号)
MODE:权限,(7代表设置读、写、执行权限,3个7代表给所有用户、群组用户、其他用户都设置可读可写可执行的权限)
r(读) | 4 |
w(写) | 2 |
x(执行) | 1 |
SYMLINK:设置别名(我设置的为rplidar)
四、查看串口别名
由于修改串口规则,所以需要重新加载服务
sudo service udev reload
sudo service udev restart
经过我自己测试,重新加载后不行,需要对usb线重新插拔才能正确显示。
使用以下命令进行查看
ll /dev | grep ttyUSB*
但是存在一个问题,STM32的芯片和思岚A1的芯片好像用的是同款芯片,他们的ATTRS{idVendor}以及ATTRS{idProduct}信息是一样的。这样在没有固定端口号的情况下,无法确定传感器与其别名是否是对应的。
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="robot"
如上所示,编写的规则文件中只有我们自己起的别名不同,无法使芯片ID一样的设备正常映射别名。
方法一:
其中通过查询命令,也可以将KERNEL值固定。
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
先插上一个传感器,记住树莓派上对应的端口,通过上述命令可以查到对应的KERNELS号,英雌可以将规则文件修改成固定端口号。
KERNELS=="1-1.2", KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="rplidar"
这时候这个传感器就只能插在这个端口上了,同理在测一下树莓派的其它端口的KERNELS值,对应修改,这时相同芯片ID号的传感器无论谁先插,都会正常映射到对应别名上。
方法二:
同样是使用方法一的命令去查询端口信息。
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
操作同上,只是这次修改的是ATTRS{devpath}值。
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{devpath}=="1.2", MODE:="0777", SYMLINK+="rplidar"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{devpath}=="1.3", MODE:="0777", SYMLINK+="robot"
修改完规则文件后,重新加载,再插拔usb线,这时候我们就可以看到无论怎么插拔先后顺序,串口别名都能正常映射。
五、机器人重启串口别名失效
但是根据我自身实验,重启机器人后串口别名规则失效,需要重新插拔usb线才能正常工作。这个问题目前采取的解决办法是,通过CP210xSetIDs.exe软件,将对应设备的ATTRS{serial}值给改了。修改之前,这些芯片的ATTRS{serial}值默认都是0001。
2022.9.13更新
以上方法需要重新插拔可能是传感器供电不足导致的。
下面举例修改思岚A1的ATTRS{serial}值。将雷达插在电脑上,按下图修改即可。
这时,我们回到ubuntu系统重新修改规则文件。
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60",ATTRS{serial}=="0002", MODE:="0777", GROUP:="dialout", SYMLINK+="rplidar"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60",ATTRS{serial}=="0001", MODE:="0777", GROUP:="dialout", SYMLINK+="robot"
这时我们无论如何插拔usb都可以正常映射,并且重新开机后不需要重新插拔usb线也可以正常映射了。