ROS 中 USB设备 udev 文件编写

废话不说,直接上干货。

一、udev文件干嘛用

        在ROS开发过程中,我们会用到很多的串口转USB的设备,常见的有cp2102芯片和ch340芯片。当我们设备过多的时候,就需要用自定义的名字来区分这些设备。       

 udev文件 是 Linux 内核的设备管理器,负责管理 /dev 中的设备节点。同时,udev 也处理所有用户空间发生的硬件添加、删除事件,以及某些特定设备所需的固件加载。与传统的顺序加载相比,udev 通过并行加载内核模块提供了潜在的性能优势。异步加载模块的方式也有一个天生的缺点:无法保证每次加载模块的顺序,如果机器具有多个块设备,那么它们的设备节点可能随机变化。

二、映射方法

        将设备插入电脑,打开终端使用指令查询每个端口的KERNELS、idProduct、idVendor。

lsusb

ROS 中 USB设备 udev 文件编写

其中idVentor == ID:10c4, idProduct == ea60。这即是我这个cp2102在Ubuntu中的挂载。

三、编写udev文件
 

 通常我们用以 .rules作为后缀 的文件进行编写我们需要的映射,文件放在如图所示的目录下。

ROS 中 USB设备 udev 文件编写

 在此文件夹下打开终端,创建.rules文件,这里里ydlidar.rules为例进行编写。

sudo gedit ydlidar.rules

ROS 中 USB设备 udev 文件编写

 先说一下此文件中的一些赋值键

“==”:比较键、值,若等于,则该条件满足;
“+=”:为一个表示多个条目的键赋值。
“:=”:对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。

KERNEL键在使用ROS相关设备的时候通常为 ttyUSB*、ttyACM*、video*(这个是插入免驱摄像头时候使用的KERNEL)

ATTRS{idVendor}、ATTRS{idProduct} 上文已经提到,MODE是当前设备具有的权限,一般是“0666”或者“0777”,其中0777代表最高权限。SYMLINK 赋值键位赋值我们自己需要的命名,可以根据需要命名,这里我用的是ydlidar,此处需要注意如果在程序中需要调用此串口,则名字应为/dev/ydlidar。

四、使能设备

sudo service udev reload
sudo service udev restart

执行完上面指令后,最好重新插拔下设备,到此设备串口名映射完成。此时在终端中输入如下的指令可以查看刚刚映射的名字。

ll /dev | grep ttyUSB   // | grep 为过滤代码,过滤 /dev 目录下有关 ttyUSB的相关文件

ROS 中 USB设备 udev 文件编写

 五、特殊情况,id重名,两个设备使用同样的串口转USB设备

这种情况一般是我们使用两个以上cp2102时候,Ubuntu系统辨认不出来两个相同的设备,(一个IM u和一个laser),这时候我们就需要使用另外的属性(KERNELS)来区分设备。在rules.d文件中新增KERNELS匹配键,这样才能使IMU和Laser区分开,获取KERNELS的方式如下,先把其他的USB设备拔掉,只留下需要映射的设备,然后执行下面的指令。

ll /dev | grep ttyUSB      // 此时会出现ttyUSB的名字(ttyUSB0或者ttyUSB1)
udevadm info --attribute-walk --name=/dev/ttyUSB0 | grep KERNELS  // 注意其中的ttyUSB后面的数字与上一步得到的相对应

ROS 中 USB设备 udev 文件编写

然后我们就可以根据KERNELS的值来修改相应的ydlidar.rules文件。

ROS 中 USB设备 udev 文件编写

 同理我们还可以修改对应的IMU.rules文件。

除了使用KERNELS键来增加匹配外,我们还可以使用其他的键来进行匹配,例如使用串口号serial作为属性来区分。

udevadm info --attribute-walk --name=/dev/ttyUSB0

ROS 中 USB设备 udev 文件编写

 六、注意事项

1.使用udev规则来创建设备挂载点新的映射时,需要注意不能随意更换USB设备插的USB口了,因为每次更换USB口,那么相应的KERNELS就换了,切记!我们只要不更换USB设备插的USB口,那么无论开机时设备挂载顺序如何,即使rplidar a2的挂载点这次开机是ttyUSB0,下次开机变成ttyUSB1也不要紧,因为/dev/rplidar总能正确的创建相应的映射到rplidar的挂载点上。

2.在执行上面的各种命令时需要在ubuntu的终端里执行,不可以在windows下使用类似xShell的终端模拟软件来运行。

3、如果是廉价相机,可能串口号也相同,可以由连接HUB的物理端口不同(KERNEL或KERNELS绑定)来配置。注意KERNELS和KERNEL是物理端口,不可以改变设备插的USB口。

上一篇:CPU多级缓存-缓存一致性(MESI)


下一篇:《大话处理器》Cache一致性协议之MESI【转】