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文件。

<launch>
  <node name="hcsr04_serial_lidar"          pkg="chaosheng_lidar"  type="hcsr04_serial_lidar" output="screen">
  <param name="serial_port"         type="string" value="/dev/zzz_chaoshenglidar"/>
  <param name="serial_baudrate"     type="int"    value="115200"/>
  <param name="frame_id"            type="string" value="laser"/>
  <param name="inverted"            type="bool"   value="false"/>
  <param name="angle_compensate"    type="bool"   value="true"/>
  </node>

</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"


  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值