![8d5c4a2e28149ab600c40f7815232865.png](https://i-blog.csdnimg.cn/blog_migrate/05f500e1b0aeb7cc4444ac62326afde2.png)
最近为了采集P7的can数据,研究了一下can fd的采集方式。传统的自动驾驶数据采集会将所有传感器的数据都接入ROS中进行时间同步和统一的录制管理,canbus一般的处理方式是使用pcan设备从OBD或者其他位置的总线接口引入工控机,通过socketcan作为底层驱动(linux kernel自带),然后使用ros的canopen工具包中的socketcan_bridge包将can数据变成ros中的一个topic发布出去,这样就可以方便的进行订阅了。
ros采集普通can相关的资料比较多,can_fd还算比较新的一种can格式,网上资源不是很多。
首先要解决的是pcan设备的问题,支持fd的版本一般要贵一些,国产can设备比如周立功对linux下fd的支持度有限,所以直接上了pcan的mini PCI-E接口的4路canbus采集卡,通过工控机上的m2接口就可以直接对接can总线出来的db9接口。socketcan是支持fd的,但是要买到可以在linux下正常使用socketcan驱动的canfd设备,国内市场还是不好买。
其次是socketcan的配置问题。其实用udev规则直接配置就可以了,开机自启动非常的方便。对于canfd来说,配置可以是这样的。
SUBSYSTEM=="net", ACTION=="add", KERNEL=="can{{ loop.index0 }}", RUN+="/sbin/ip link set can{{ loop.index0 }} up type can bitrate {{ can.br }} sample-point {{ can.br_sp }} dbitrate {{ can.dbr }} sample-point {{ can.dbr_sp }} fd on listen-only on restart-ms 100"
因为用了ansible自动化部署,上面的代码里有{},直接就是变量替换的意思,我就懒得去掉了。一般canfd的扩展段的波特率都是2000kbps,普通段是500kbps,再把sample point写上就完事了,记得结尾fd on。这种写完似乎同时支持fd和非fd的can,也是怼错了之后发现的,后面可以再试一下真假。
这一步做完了之后可以ifconfig一下,如果看到can而且can底下rx是有收到数据的,就证明成功了,这一步做完candump就可以用了。
最后是,ros的canopen问题,目前master上的canopencan_fd还不支持canfd。本来以为需要自己port了,后面发现fork里头有小伙已经实现了,编译后发现也还算好使(虽然编译过程有点bug
simontegelid/ros_canopengithub.com![f00e6409b3c1f4e250ab3207143556a1.png](https://i-blog.csdnimg.cn/blog_migrate/960afee025ece09a2ec7152bdf6f9e68.png)
主要是要用gcc-7来编译,如果用ubuntu1604的话要自己装一下,不然会报错。然后还有就是有个CAN_FD_FRAME的常量需要定义一下,值是0x0800。
总之git clone上面的repo,编译过之后source一下就可以了,用法和不是canfd用法是一致的。节点起来之后,如果要rostopic echo,记得也要source一下之前编译的包,不然会报message的md5验证失败,因为本质上Frame.msg已经被修改了,data段由原来的8byte改成了不定长的数组。
Header header
uint32 id
bool is_rtr
bool is_extended
bool is_error
uint8 dlc
uint8[] data
uint8 DLC_FD_BRS_FLAG = 128
这一步完了之后就做完啦,可以开始录数据了。
推荐使用python下的cantools来解析,非常方便,python2.7下的版本安装的时候会有点报错,但是鼓捣一下依赖版本就可以搞定,python3.x就可以随便用,缺点是如果用的ros还是老的,比如kinetic,python3.x支持贼差,就可能满足不了你的需求。不过ros noetic用到现在大概几个月了还是挺好用的,如果没有特别的需求可以升级noetic了。
完结撒花。