文章摘要:本文主要讲述Ros底层通讯,和一些设备配置
Ros底层
此处使用的是usb_cam功能包和esp32通讯,串口软件协议是基本的
USB-ID绑定
因为外设有usb摄像头,lidar,imu和里程计,以及uwb传感器所以在usb的ID绑定上要详细分清楚,这里是对USBID的操作指令有如下
1.1 查看usb设备
lsusb
可以看出我使用的usb设备主要两种,一种是ch340转ttl ,一种是cp2102转ttl。
这里我映射了3个usb设备到我的jetson-nano的USB接口上,分别是底盘控制器 雷达接口 uwb数据接口。
ls -l /dev |grep ttyUSB
1.2 编写自定义规则
这里开始编写自定义的usb设备规则,进入系统规则文件夹查看规则
cd /etc/udev/rules.d/
ls -l
这里查看的是对应的我编写的3个规则
1.2.1编号查询
为了不编写出错,先把所有需要编写的usb设备拔掉,在插入一个usb。
ls -l /dev |grep ttyUSB
获取得到红色的ttyUSB数字 ,我这是2
查看当前设备详细的usb参数
udevadm info -a -n /dev/ttyUSB*
这里的ttyUSB* 是上面获取的到的红色设备数字号,我这是ttyUSB2。当输入上面命令得到详细参数后,寻找到第四段参数如下图所示
1.2.2编写自定义规则
此处新建一个自定义名字的设备规则,如果是底盘控制器 我一般新建为hgrobot_controller。
sudo nano hgrobot_controller.rules
填写下面参数,其中KERNEL==“ttyUSB*”,MODE:=“0777”, GROUP:=“dialout”, 可以照着填写,最后一个参数一定要是👆那个文件名,其他四个参数是上面第四段得到的参数。
KERNEL=="ttyUSB*", KERNELS=="1-2.4.4.1", ATTRS{devpath}=="2.4.4.1", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", GROUP:="dialout", SYMLINK+="hgrobot_controller"
这个时候底盘控制器的USB接口规则文件就写完了,重启usb规则
sudo udevadm trigger
sudo udevadm control –reload-rules && sudo service udev restart && sudo udevadm trigger
查看规则是否生效
ls -l /dev |grep ttyUSB
如果映射成功,这个时候就可以直接在ros底盘控制文件里面打开调用这个接口进行底盘通讯
1.2.3 Ros调用
如果多个设备需要编写规则,直接重复上面的1.2.1-1.2.2 一个一个添加设备,对于Ros的接口直接调用,需要在自己编写的功能包中确定串口设备的名字,该名字也就是规则的名字
timeout_uwb=5; //uwb 检测1ms 没有信息 就不发布 uwb
timeout_esp=10; // esp 检测2 ms 没有信息就不发布esp 对应的话题
ros::NodeHandle private_nh("~");
private_nh.param<std::string>("usart_port_name",usart_port_name,"/dev/hgrobot_contorller"); //串口信息,自定义串口规则和 串口id
private_nh.param<std::string>("odom_frame_id",odom_frame_id,"odom_combined"); //机器人里程计 坐标系
private_nh.param<std::string>("robot_frame_id",robot_frame_id,"base_footprint"); //机器人中心坐标系
private_nh.param<std::string>("usart_port_name_uwb",usart_port_name_uwb,"/dev/hgrobot_uwb"); // uwb串口名
这里我添加的是2个设备的名字 一个是底盘控制器,一个是uwb定位usb接口。当在ros节点添加上面参数后,就可以直接在外面的launch文件调用usart_port_name 和 usart_port_name_uwb2个参数了。