为雷达、飞控各种设备添加udev符号连接


我们在Linux上运行设备程序的时候必须指定设备的端口,这个端口会随插入顺序的不同而改变,所以每次运行一个传感器时我们每次都要查看设备的端口,这很不方便,下面我讲一下如何用udev解决这个问题。
关于udev具体的原理啥的这里不讲,有兴趣自己百度。百度上关于解决符号标示启动多个雷达的博客暂时还没有,这里主要针对这个问题说一下。
我最开始是urg_node的wiki官网上知道的这种方法,但是官网的教程有问题,后面就自己研究了一下,记录一下过程。

用设备号标识多个Hokuyo雷达

当我们有多个雷达的时候,采用符号链接的方式就显得很方便,它不管插入雷达的时间都能够用相同的launch文件启动。
要添加udev,我们其实只需要在/etc/udev/rules.d/为设备添加相应的规则文件就可以了。
先为hokuyo雷达创建一个规则文件,名字随便取什么都ok,我是按照我的设备名字取的。

sudo gedit /etc/udev/rules.d/hokuyo_H1747925.rules

然后把下面内容拷贝进去保存退出。

SUBSYSTEMS=="usb", KERNEL=="ttyACM[0-9]*", ACTION=="add", ATTRS{idVendor}=="15d1", ATTRS{idProduct}=="0000", MODE="666", PROGRAM="/opt/ros/kinetic/env.sh rosrun urg_node getID %N q'",SYMLINK+="sensors/hokuyo_%c", GROUP="dialout"

然后执行下面的命令,刷新udev

sudo udevadm control --reload-rules && sudo service udev restart && sudo udevadm trigger

重新插拔雷达过后我们查看一下设备

ls -l /dev/sensors/

下面是我电脑上的输出

dck@dck-HP-Notebook:~$ ls -l /dev/sensors/
总用量 0
lrwxrwxrwx 1 root root 10 222 20:49 hokuyo_H1747925 -> ../ttyACM0
dck@dck-HP-Notebook:~$ 

我们发现建立了一个软连接,这个软链接指向了ttyACM0。
此后我们只要把需要输入雷达端口 /dev/ttyACM0替换为/dev/sensors/hokuyo_H1747925,即可。
以后无论我们的设备的插入顺怎么变,都可以正常的启动雷达。

为pixhawk飞控添加符号链接

无人机上运行还需要运行飞控,下面为pixhawk添加符号链接。
无人机一般只有一个飞控,而且和其他设备一般很明显能区分开,下面我们用一个最简单的方法。
我们先将飞控链接的线拔出,运行下面的命令,查看当前设备的usb设备。

lsusb

在我的电脑上输出如下:

dck@dck-HP-Notebook:~$ lsusb 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0bda:57d6 Realtek Semiconductor Corp. 
Bus 001 Device 003: ID 0bda:b006 Realtek Semiconductor Corp. 
Bus 001 Device 002: ID 413c:301a Dell Computer Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
dck@dck-HP-Notebook:~$ 

然后我们把飞控的USB线插上上,再运行一下这个命令,在我的电脑上输出如下:

dck@dck-HP-Notebook:~$ lsusb 
dck@dck-HP-Notebook:~$ lsusb 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0bda:57d6 Realtek Semiconductor Corp. 
Bus 001 Device 003: ID 0bda:b006 Realtek Semiconductor Corp. 
Bus 001 Device 002: ID 413c:301a Dell Computer Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
dck@dck-HP-Notebook:~$ lsusb 
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0bda:57d6 Realtek Semiconductor Corp. 
Bus 001 Device 003: ID 0bda:b006 Realtek Semiconductor Corp. 
Bus 001 Device 002: ID 413c:301a Dell Computer Corp. 
Bus 001 Device 060: ID 26ac:0011  
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
dck@dck-HP-Notebook:~$ 

我们可以看到多了一个设备,这个设备正是刚刚插入的飞控的端口,一般每个设备的ID号,都不相同,我们可以用这个来区分飞控的其它的设备。
和刚才同样的我们先为这个设备新建一个规则文件

sudo gedit /etc/udev/rules.d/pixhawk_1.rules

然后我们把下面的内容拷贝进去,保存退出,简单对下面的内容说一下,每个逗号分隔为一个选项,带有“==”为判断,这些判断的标准是区分设备的依据,SYMLINK是添加软链接的命令,MODE是设置权限,GROUP是设置从属组。所以我们用ID来区分设备,把飞控的ID 26ac:0011 写入即可 即 ATTRS{idVendor} ATTRS{idProduct}两个选项。

SUBSYSTEMS=="usb", ACTION=="add", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE="666", SYMLINK+="sensors/pixhawk", GROUP="dialout"

下面我们在launch文件里面把默认的/dev/ttyUSB0 替换为/dev/sensors/pixhawk_1即可

<launch>
	<!-- vim: set ft=xml noet : -->
	<!-- example launch script for PX4 based FCU's -->

	<arg name="fcu_url" default="/dev/sensors/pixhawk:921600" />
	<arg name="gcs_url" default="" />
	<arg name="tgt_system" default="1" />
	<arg name="tgt_component" default="1" />
	<arg name="log_output" default="screen" />
	<arg name="fcu_protocol" default="v2.0" />
	<arg name="respawn_mavros" default="false" />

	<include file="$(find mavros)/launch/node.launch">
		<arg name="pluginlists_yaml" value="$(find mavros)/launch/px4_pluginlists.yaml" />
		<arg name="config_yaml" value="$(find mavros)/launch/px4_config.yaml" />

		<arg name="fcu_url" value="$(arg fcu_url)" />
		<arg name="gcs_url" value="$(arg gcs_url)" />
		<arg name="tgt_system" value="$(arg tgt_system)" />
		<arg name="tgt_component" value="$(arg tgt_component)" />
		<arg name="log_output" value="$(arg log_output)" />
		<arg name="fcu_protocol" value="$(arg fcu_protocol)" />
		<arg name="respawn_mavros" default="$(arg respawn_mavros)" />
	</include>
</launch>

之后我们发现随便我们的插入顺序怎么变化,都可以正常的启动。

后续

上面的方法只是最简单的一直解决办法,udev的本质就是当所有匹配的通过过后给设备添加一个标示,如果上面的方法不能区分过后,我们可以如下方法。
用下面命令查看设备的udev信息

udevadm info -a -p $(udevadm info -q path -n /dev/ttyACM0)

在我的电脑上得到如下的输出

dck@dck-HP-Notebook:~$ udevadm info -a -p $(udevadm info -q path -n /dev/ttyACM0)

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/tty/ttyACM0':
    KERNEL=="ttyACM0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0':
    KERNELS=="1-2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="cdc_acm"
    ATTRS{authorized}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceClass}=="02"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{bInterfaceProtocol}=="01"
    ATTRS{bInterfaceSubClass}=="02"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{bmCapabilities}=="6"
    ATTRS{supports_autosuspend}=="1"

由于输出内容过多我只截取了其中的一部分输出,这里面的每一个选项都可以作为你区分的设备的判断依据,选取能区分设备的选项后用逗号分隔符分开就行了。
设置完成过后可以用下面的命令测试

udevadm test $(udevadm info -q path -n /dev/ttyACM0)

关于udev的使用就讲到这里,一般用上面最简单的方法就可以解决问题了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值