自动驾驶系统:CAN与ROS通信

2023-05-16

转载自:https://zhuanlan.zhihu.com/p/48632100

自动驾驶系统:CAN与ROS通信

Gen Li

Gen Li

睡午觉的滋味,妙不可言。不当调包侠。

最近接触到自动驾驶系统通信网络,特别是CAN与ROS通信问题,练习解决后,希望通过本文记录问题解决步骤,了解不深,如有错误还望指出。

通常,传统OEM的车辆控制网络使用CAN或CAN-FD,优点是速度相对较快,当通信冲突时可根据优先级高低进行传输,例如汽车发生碰撞时,ECU通过CAN向气囊模块发送起爆信号。对自动驾驶汽车,特别是目前demo车,通常软件模块使用ROS作为middleware进行开发,在ROS系统上运行preception model, localization model, path planning model等,control model的ROS节点发出制动油门转向信号,通过CAN网络控制车辆的加减速和转向。

主要目的:

  • 通过socket_can模块,启动talker 节点获得CAN信号并由/chatter的topic对外发布;listener节点订阅/chatter topic并获取CAN信号。

主要流程:

  • 硬件连接:计算机通过Kvaser Leaf hardware硬件连接CAN上某一节点,使用kvaser canking发送模拟CAN信号
  • 启动另外一台计算机,在ubuntu系统下导入socket_can模块
  • 启动ROS程序,初始化ROS package:'socket_can',编译‘listener.cpp’,'talker.cpp'和‘socket_can.cpp’代码,代码使用socket_can包实现ROS和CAN通信功能
  • 启动talker和listener两个nodes,观察CAN与ROS通信结果

具体步骤:

硬件连接不进行赘述,通过canking发送CAN信号之后,可观察到如下信息:

为运行本文所提程序,第一步需设置CAN模块,以便计算机能够接受CAN信号,在ubuntu系统下打开一个terminal,输入以下代码完成CAN的设置:

modprobe can_dev 
modprobe can 
modprobe can_raw
sudo ip link set can0 type can bitrate 500000 
sudo ifconfig can0 up 

modprobe是linux导入模块的命令,以上代码导入socket_can【1】环境,设置传输速率为500k,传输速率可调整,保证发送和接受速率一致即可。

第二步启动ROS程序并初始化package, 通常ROS的package中可设置多个节点,依据publish/subscribe模式,每个节点均可以发布和订阅topic,为运行talker和listener节点,第一次运行时需要初始化socket_can package。打开一个terminal,在home目录下输入以下代码:

mkdir -p exercise/src   
cd ~/exercise/src       
catkin_create_pkg socket_can  

此时在home根目录下新建文件夹'exercise/src',其中‘src’文件夹用于存储运行的代码。初始化'socketcan' package后,在‘src’下自动生成‘socket_can’文件夹,内部包含自动生成的‘CmakeLists.txt’和'package.xml',用于代码编译。

将已经编写完成的‘listener.cpp’, ‘talker.cpp’, ‘socket_can.cpp’ 和‘socket_can.h’拷入‘src’文件夹中。

由于‘listener.cpp’等代码中include外部包,在编译之前需要编辑‘CmakeLists.txt’和'package.xml'文件。打开‘CmakeLists.txt’,在'find_package'语句中添加代码中include的外部包(具体更改,根据代码依赖环境进行设置)。

find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)

在‘## Your package locations should be listed before other locations’后添加以下语句。

include_directories(include ${catkin_INCLUDE_DIRS} ${PCL.INCLUDE_DIRS})

add_executable(talker talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

add_executable(listener listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})

完成‘CmakeLists.txt’更改后,使用gedit打开‘package.xml’文件,在‘<!--<doc_depend>doxygen</doc_depend> -→’语句后增加如下代码:

<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>roscpp</exec_depend>  
<exec_depend>rospy</exec_depend> 
<exec_depend>std_msg</exec_depend> 

完成package初始化和编译文件修改后,打开一个terminal,启动ROS:

roscore

打开一个terminal,进入‘exercise’目录下,使用catkin编译代码:

cd exercise
catkin_make
source /devel/setup.bash

此时'exercise/src/socket_can'文件夹中新增‘devel’和‘build’文件夹。

打开两个terminal,分别运行talker和listener节点,此时可以观察到CAN发送的信息。

rosrun socket_can talker
rosrun socket_can listener

观察到以上信息,证明通信连接已建立。

注:

  • 【1】socket_can: SocketCAN - Wikipedia

发布于 2018-11-05

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动驾驶系统:CAN与ROS通信 的相关文章

随机推荐