首先,拔掉所有设备,这是为了保证系统在开机时不会去自动的随机分配USB接口号。
同时,我们使用指令进行验证
ll /dev/ttyUSB*
ls: cannot access '/dev/ttyUSB*': No such file or directory
通过返回的消息,可以发现此时没有USB设备连接到我们 Jetson。
我们这里需要绑定的设备有四个,分别是
连接好了 Ros 扩展板之后,我们再运行检索 USB 接口的指令
ll /dev/ttyUSB*
crwxrwxrwx 1 root dialout 188, 0 9月 29 11:09 /dev/ttyUSB0
会发现此时连接了一个 USB 设备,其编号为 “ttyUSB0”。
然后,我们先查看HUB板的端口信息,主要是查看设备路径信息,在 Jetson 的终端里输入(注意指令里的 “ttyUSB0” 要正确)
udevadm info --attribute-walk --name=/dev/ttyUSB0 |grep devpath
我们可以得到如下消息
jetson@yahboom:~$ udevadm info --attribute-walk --name=/dev/ttyUSB0 |grep devpath
Udevadm info starts with the device specified by the devpath and then
ATTRS{devpath}=="2.4.2"
ATTRS{devpath}=="2.4"
ATTRS{devpath}=="2"
ATTRS{devpath}=="0"
返回的消息中,ATTRS{devpath}=="2.4.2"
表明了该设备的路径信息。
接下来,我们通过修改 /etc/udev/rules.d/rplidar.rules
文件,从而绑定好 Ros 扩展板的端口号。可以通过在终端中输入
sudo vim /etc/udev/rules.d/rplidar.rules
其中最后边的参数 SYMLINK+="USB_Ros"
是以后要用到的别名,自己可以根据连接的 USB 设备取个名字。
重启一下服务,使得修改立即生效。
sudo udevadm trigger
重启后,我们就完成把 ttyUSB0 取别名为 USB_Ros 的操作了,以后在程序里直接访问 USB_Ros,就可以与这个设备通信了。
ll /dev/USB_Ros
lrwxrwxrwx 1 root root 7 9月 29 11:35 /dev/USB_Ros -> ttyUSB0
我们可以看到 USB_Ros 和 ttyUSB0 建立了映射关系。
jetson@yahboom:~$ ll /dev/ttyUSB*
crwxrwxrwx 1 root root 188, 0 9月 29 11:35 /dev/ttyUSB0
crwxrwxrwx 1 root dialout 188, 1 9月 29 11:36 /dev/ttyUSB1
jetson@yahboom:~$ udevadm info --attribute-walk --name=/dev/ttyUSB1 |grep devpath
Udevadm info starts with the device specified by the devpath and then
ATTRS{devpath}=="2.4.3"
ATTRS{devpath}=="2.4"
ATTRS{devpath}=="2"
ATTRS{devpath}=="0"
jetson@yahboom:~$ sudo vim /etc/udev/rules.d/rplidar.rules
jetson@yahboom:~$ sudo udevadm trigger
jetson@yahboom:~$ ll /dev/ttyUSB*
crwxrwxrwx 1 root root 188, 0 9月 29 11:42 /dev/ttyUSB0
crwxrwxrwx 1 root root 188, 1 9月 29 11:42 /dev/ttyUSB1
jetson@yahboom:~$ ll /dev/USB_Speech
lrwxrwxrwx 1 root root 7 9月 29 11:42 /dev/USB_Speech -> ttyUSB1
jetson@yahboom:~$ ll /dev/USB_*
lrwxrwxrwx 1 root root 7 9月 29 11:42 /dev/USB_Ros -> ttyUSB0
lrwxrwxrwx 1 root root 7 9月 29 11:42 /dev/USB_Speech -> ttyUSB1
jetson@yahboom:~$ ll /dev/ttyUSB*
crwxrwxrwx 1 root root 188, 0 9月 29 11:42 /dev/ttyUSB0
crwxrwxrwx 1 root dialout 188, 1 9月 29 11:45 /dev/ttyUSB1
crwxrwxrwx 1 root dialout 188, 2 9月 29 11:52 /dev/ttyUSB2
jetson@yahboom:~$ udevadm info --attribute-walk --name=/dev/ttyUSB2 |grep devpath
Udevadm info starts with the device specified by the devpath and then
ATTRS{devpath}=="2.4.4"
ATTRS{devpath}=="2.4"
ATTRS{devpath}=="2"
ATTRS{devpath}=="0"
jetson@yahboom:~$ sudo vim /etc/udev/rules.d/rplidar.rules
jetson@yahboom:~$ sudo udevadm trigger
jetson@yahboom:~$ ll /dev/USB_*
lrwxrwxrwx 1 root root 7 9月 29 11:54 /dev/USB_Ros -> ttyUSB0
lrwxrwxrwx 1 root root 7 9月 29 11:54 /dev/USB_Speech -> ttyUSB1
lrwxrwxrwx 1 root root 7 9月 29 11:54 /dev/USB_UWB -> ttyUSB2
jetson@yahboom:~$ ll /dev/ttyUSB*
crwxrwxrwx 1 root root 188, 0 9月 29 11:54 /dev/ttyUSB0
crwxrwxrwx 1 root root 188, 1 9月 29 11:54 /dev/ttyUSB1
crwxrwxrwx 1 root root 188, 2 9月 29 11:54 /dev/ttyUSB2
crwxrwxrwx 1 root dialout 188, 3 9月 29 11:55 /dev/ttyUSB3
jetson@yahboom:~$ udevadm info --attribute-walk --name=/dev/ttyUSB3 |grep devpath
Udevadm info starts with the device specified by the devpath and then
ATTRS{devpath}=="2.4.1"
ATTRS{devpath}=="2.4"
ATTRS{devpath}=="2"
ATTRS{devpath}=="0"
jetson@yahboom:~$ sudo vim /etc/udev/rules.d/rplidar.rules
jetson@yahboom:~$ sudo udevadm trigger
jetson@yahboom:~$ ll /dev/USB_*
lrwxrwxrwx 1 root root 7 9月 29 11:57 /dev/USB_Ros -> ttyUSB0
lrwxrwxrwx 1 root root 7 9月 29 11:57 /dev/USB_Speech -> ttyUSB1
lrwxrwxrwx 1 root root 7 9月 29 11:57 /dev/USB_UWB -> ttyUSB2
lrwxrwxrwx 1 root root 7 9月 29 11:57 /dev/USB_ZigBee -> ttyUSB3
至此,我们就实现了对4个 USB 设备固定端口的设置。需要注意的是,以后不能再随意更改 USB 设备的位置了,否则就会造成设备无法正常工作的情况。
最后再附一张我手里设备的实物图
按照上述过程修改后,我去操作小车进行移动,发现有个报错
jetson@yahboom:~/Desktop$ python3 PyTest/RosmasterTest.py
Traceback (most recent call last):
File "/home/jetson/.local/lib/python3.6/site-packages/serial/serialposix.py", line 322, in open
self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
FileNotFoundError: [Errno 2] No such file or directory: '/dev/myserial'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "PyTest/RosmasterTest.py", line 4, in <module>
bot = Rosmaster()
File "/usr/local/lib/python3.6/dist-packages/Rosmaster_Lib-1.7.3-py3.6.egg/Rosmaster_Lib/Rosmaster_Lib.py", line 20, in __init__
File "/home/jetson/.local/lib/python3.6/site-packages/serial/serialutil.py", line 244, in __init__
self.open()
File "/home/jetson/.local/lib/python3.6/site-packages/serial/serialposix.py", line 325, in open
raise SerialException(msg.errno, "could not open port {}: {}".format(self._port, msg))
serial.serialutil.SerialException: [Errno 2] could not open port /dev/myserial: [Errno 2] No such file or directory: '/dev/myserial'
Exception ignored in: <bound method Rosmaster.__del__ of <Rosmaster_Lib.Rosmaster_Lib.Rosmaster object at 0x7faed5d4a8>>
Traceback (most recent call last):
File "/usr/local/lib/python3.6/dist-packages/Rosmaster_Lib-1.7.3-py3.6.egg/Rosmaster_Lib/Rosmaster_Lib.py", line 129, in __del__
AttributeError: 'Rosmaster' object has no attribute 'ser'
分析后发现是串口调用问题。结合小车移动是通过调用 Ros 扩展板来实现的。因此,将问题聚焦在 Ros 扩展板的串口上,也就是我们的 ttyUSB0。
同时,在报错中看到了 myserial 的字样,这个名字是本来自带的程序中对 Ros 扩展板串口的别名。通过尝试后,我们发现将一开始自己取的 Ros 扩展板别名 “USB_Ros” 改成 “myserial” 中就行了。
总的来说,Ros 扩展板没问题,修改别名 “USB_Ros” 也没问题。但是一些示例程序中对 Ros 扩展板调用时使用的别名是 “myserial”。如果挨个修改程序中的别名太费事,因此直接将自己想的别名改成示例程序中的别名,那么问题就迎刃而解了。修改界面如下图