TX2(RTSO-9002)上有两个can接口,分别是P1上的5、6接口(CAN1_H,CAN1_L);7、8接口(CAN0_H,CAN0_L)。
CAN和ROS通信主要是通过ros_canopen(http://wiki.ros.org/ros_canopen?distro=kinetic)中的模块实现的。
1. 安装ros_canopen的各个模块:
1) 可以通过源码安装: https://github.com/ros-industrial/ros_canopen/tree/kinetic-devel
2)通过终端命令安装:
$ sudo apt-get install ros-kinetic-can-msgs
$ sudo apt-get install ros-kinetic-canopen-master
$ sudo apt-get install ros-kinetic-canopen-402
$ sudo apt-get install ros-kinetic-canopen-motor-node
$ sudo apt-get install ros-kinetic-canopen-chain-node
$ sudo apt-get install ros-kinetic-socketcan-bridge
$ sudo apt-get install ros-kinetic-socketcan-interface
2. 安装can_utils
$ git clone https://github.com/linux-can/can-utils.git
$ cd can-utils
$ make
$ sudo make install
can_utils主要用于配置TX2上can0和can1的属性,同时还能通过cansend和candump指令来测试can接口的收发是否正常。
可以参考 https://blog.csdn.net/xuezhunzhen9743/article/details/81877757
3. 配置can
在配置can之前,需要手动使能can接口:
sudo modprobe can
sudo modprobe can-raw
sudo modprobe can-bcm
sudo modprobe can-gw
sudo modprobe can_dev
sudo modprobe mttcan
可以将以上指令写成脚本,这样就不用每次都输入这么多指令,直接运行脚本即可:
创建脚本文件init_can
在文件中输入:
#!/bin/bash
modprobe can
modprobe can-raw
modprobe can-bcm
modprobe can-gw
modprobe can_dev
modprobe mttcan
保存并退出文件
更改文件权限:
$ chmod 777 init_can
运行脚本:
$ sudo ./init_can
即完成了can接口使能。
对can0和can1配置:
sudo ip link set can0 type can bitrate 500000
sudo ip link set up can0
sudo ip link set can1 type can bitrate 500000
sudo ip link set up can1
配置完成后,通过ifconfig,可以看到can0和can1的信息:
4. ros和can通信
ROS和can通信主要是通过ros_canopen中的socketcan_bridge来实现的。
通过从https://github.com/ros-industrial/ros_canopen/tree/kinetic-devel下载的源码,可以简单来看看通信的实现过程:
在ros_canopen-kinetic-devel/socketcan_bridge/src中可以看到里边有socketcan_to_topic_node.cpp以及topic_to_socketcan_node.cpp。
ROS和can的通信就是通过运行这两个结点实现的。
我们以socketcan_to_topic_node.cpp为例:
57和58行的函数原型在socketcan_to_topic.cpp中有具体的实现。
可以看出,ros将转化后的can信息以Frame.msg的格式通过received_messages这一话题进行发布。
可以进行如下测试:
在配置好can0之后(见3),
$ rosrun socketcan_bridge socketcan_to_topic_node
出现如下信息:
此时,通过rostopic list 可以发现,已经有/received_messages发布。然后在终端输入
$ rostopic echo /received_messages
此时由于can0还没有产生数据,所以topic中并没有东西。
在socketcan_bridge/test中,有一个launch文件,vcan0_to_vcan1.launch.该launch文件主要实现的是can0和can1的通讯(通过socketcan_to_topic_node和topic_to_socketcan_node实现)launch 文件中将topic_to_socketcan_node中的sent_messages话题映射为received_messages. 可以将launch文件中的参数<param name="can_device" value="vcan0" /><param name="can_device" value="vcan1" /> 分别改成can0和can1来进行实测。
如有错误还请指出。
转载请注明:https://mp.csdn.net/postedit/86229776
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)