ros使用usb硬件,调用固定设备名修改设备权限的设置方法

ros项目使用usb接口串口通讯的传感器时,我们都希望有个固定的设备名供程序调用。


由于usb为即插即用设备,节点注册的ID不同,会导致设备名称会不同。
linux系统下如何让系统绑定固有的usb设备,使用设定好的设备名称?如何永久修改设备权限?

解决办法
编写规则文件,放到系统配置路径下,进行设置后,即可一劳永逸。




规则配置路径:
/etc/udev/rules.d/
规则文件以.rules作为扩展名。由于这些文件有优先级,所以一般在前面加上一个数字,系统按照数字进行排序,于是数字小的排前面优先级比较高。
规则格式:
KERNEL=="ttyUSB*", ATTRS{idVendor}=="xxxx", ATTRS{idProduct}=="xxxx", MODE:="0777",  SYMLINK+="device_name"
其中
ATTRS{idVendor}=="xxxx"
ATTRS{idProduct}=="xxxx" 从查询到的结果里进行配置

规则文件的写法可以看这篇文章http://blog.csdn.net/smfwuxiao/article/details/7640614
查询命令
lsusb -vvv
查看自己设备的idVendor和idProduct

规则文件配置完成后
执行命令
service udev reload

service udev restart
查看效果
ls /dev/device_name

然后在ros里的launch文件参数可以固定为 /dev/device_name

例如创建规则
80-zzz-chaosheng.rules
其内容为
KERNEL=="ttyUSB?",  ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523",  MODE="0666", SYMLINK+="zzz_chaoshenglidar"

注意1a86 7523 是输入的我查询的结果,需要根据自己硬件的实际情况填写
SYMLINK+=zzz_chaoshenglidar 就是自定义的设备名称

ros的launch文件 serial_port参数定义为/dev/zzz_chaoshenglidar可以实现对相应硬件的调用设置,而不必插拔usb后在查看到底是那个端口号反复修改launch文件。


  
  
  
  
  
  
  


开源riki底盘树莓派中系统使用的规则配置示例:


58-riki.rules
KERNEL=="ttyACM?", SUBSYSTEM=="tty", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="0483", ATTRS{serial}=="4294967295", MODE="0660" SYMLINK+="rikibase"
KERNEL=="ttyUSB?", SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="0001", MODE="0660" SYMLINK+="rikilidar"
KERNEL=="ttyUSB?", SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0660" SYMLINK+="rikistm32base"


49-teensy.rules
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", ENV{ID_MM_DEVICE_IGNORE}="1"
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789A]?", ENV{MTP_NO_PROBE}="1"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789ABCD]?", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", MODE:="0666"



10-local-rpi.rules
SUBSYSTEM=="vchiq", GROUP="video", MODE="0660"


40-scratch.rules
ATTRS{idVendor}=="0694", ATTRS{idProduct}=="0003", SUBSYSTEMS=="usb", ACTION=="add", MODE="0666", GROUP="plugdev"


99-com.rules
SUBSYSTEM=="input", GROUP="input", MODE="0660"
SUBSYSTEM=="i2c-dev", GROUP="i2c", MODE="0660"
SUBSYSTEM=="spidev", GROUP="spi", MODE="0660"
SUBSYSTEM=="bcm2835-gpiomem", GROUP="gpio", MODE="0660"

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\
        chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\
        chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio;\
        chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\
'"

KERNEL=="ttyAMA[01]", PROGRAM="/bin/sh -c '\
        ALIASES=/proc/device-tree/aliases; \
        if cmp -s $ALIASES/uart0 $ALIASES/serial0; then \
                echo 0;\
        elif cmp -s $ALIASES/uart0 $ALIASES/serial1; then \
                echo 1; \
        else \
                exit 1; \
        fi\
'", SYMLINK+="serial%c"


你可能感兴趣的:(ros)