赞
踩
转载自:https://zhuanlan.zhihu.com/p/48632100
睡午觉的滋味,妙不可言。不当调包侠。
最近接触到自动驾驶系统通信网络,特别是CAN与ROS通信问题,练习解决后,希望通过本文记录问题解决步骤,了解不深,如有错误还望指出。
通常,传统OEM的车辆控制网络使用CAN或CAN-FD,优点是速度相对较快,当通信冲突时可根据优先级高低进行传输,例如汽车发生碰撞时,ECU通过CAN向气囊模块发送起爆信号。对自动驾驶汽车,特别是目前demo车,通常软件模块使用ROS作为middleware进行开发,在ROS系统上运行preception model, localization model, path planning model等,control model的ROS节点发出制动油门转向信号,通过CAN网络控制车辆的加减速和转向。
主要目的:
主要流程:
具体步骤:
硬件连接不进行赘述,通过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
观察到以上信息,证明通信连接已建立。
注:
发布于 2018-11-05
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。