文章目录
预备知识与前期工作
最近阅读了前段时间刚部署到电脑上的源码,作者的源码是基于c++的,最近穿插着复习c++并完成了雷达的源码阅读,对源码关键部分进行了注释,增加了可读性。另外此架构上进行修改,完成了雷达滤波的初步开发,下一步部署到电脑进行效果验证。
首先,雷达检测有两种方式,一种是cluster模式,即点云模式,将所有的扫描到的点云经过内部滤波后,不加处理的发布出来,具体效果可见我前一篇博客。这种状态下生成的地图可以看作点云图,优点是点云信息密集,利于二次开发。缺点也很明显:噪声大,一个物体上存在多个雷达点,分辨起来较为困难。
另一种模式就是object模式,其中将点云进一步处理,以RCS等参数判断物体的类别并输出。这种模式的优点是:可视化程度高,易于分辨,同时噪声点少。缺点是:难以进行二次开发,对的点云特征的利用度较低。
ARS_40X源码架构
如图所示,源码主要分为三个功能部分:
- 与雷达接口socket_can的通信与数据处理、发布等任务;
- 在第一个的基础上,实现与rviz“通信”的可视化任务;
- 同样在第一个人物的基础上,实现object mode下的目标姿态发布任务;
图中源码文件结构如图所示,基本上由hpp文件定义通信的数据基本格式和所有类的初始化,然后再src文件中对所有类进行初始化,其中./src/ros文件下的ros文件初始化各类上层接口类,其功能包含利用service服务将更改的参数传递给socket_can接口,可视化点云等上层服务。
雷达数据格式及流向
数据流向图
如上图所示,soket_can负责与毫米波雷达的通信,包括对数据的封装以及读取等功能,供ars_40x_can.cpp使用,包括建立的通信类来实现与socket_can的通信、并负责更新所有数据,,实现的功能有:receive_data(), write_data(),端口设置,获取雷达状态等,这个是底层接口中最重要的文件。
实现了数据的更新后,上层的ros接口要继承底层接口,建立ROS功能包间的通信,以进一步实现可视化与用户的实时更改。综上,实现了数据从底层获取到上层的接口开发,具体细节请读者自行看源码。
雷达数据格式
数据的通信包含:源码与socket_can包的通信、源码内部之间的数据通信。通信之间的数据格式对于理清楚源码的架构及运行机制有着重要作用。在大陆雷达开发手册中有着清楚的说明,建议读者首先读一下开发手册。
socket_can通信格式(以雷达配置帧通信为例)
源码与socket_can通信是符合大陆雷达的标准格式的。
数据发送包括:数据头(fram_id) + 数据(n byte)
其中:数据头说明我要发送什么数据:例如配置数据中对于最大距离的配置、滤波配置等。
数据请求:数据头(fram_id) + 数据(n byte),与数据发送同理,不过功能是对于雷达状态的请求、雷达点云数据的请求等。
这是雷达配置信息的设置帧参数:可以看到,其中对于雷达的配置帧,包含了8 * 8位的数据,每一位都有特殊的用途,例如要设置雷达最大距离,就要设置其中的max_distance块,并包装进一个8byte的数据中,发送出去,当然,这些底层的移位操作作者通过union体帮我们解决了,我们只需要按照作者给定的格式进行编码,如下图所示。
如上图,这是雷达的配置数据格式,这些变量按照名字都是雷达配置帧中的关键变量。雷达的配置帧数据格式是按照:第一位,第二位…每一位分别配置的,通过union体与":"符号(每个变量后面都是一个整数,这是设置的union位域)是每个变量对应其在8byte中特定的位置,免去了需要单独移位的操作。
raw_data就是8byte的数据,raw_data用来保存所有的数据,同时还能够按照位域整体接收来自socket_can的雷达8byte数据,这样在查看某个参数时也不需要移位操作就能取到对应的雷达配置参数,非常方便。
通过以上,可以了解到源码内部对于雷达配置等参数的封装格式以及和底层雷达通信的数据格式,下面介绍其他比较关键的数据格式。
关键数据介绍及格式说明
同样重要的还有:雷达状态帧、目标模式下的目标帧、cluster模式下的数据帧、can_messages
重点介绍:cluster下的数据帧,can_messages
cluster数据帧
cluster数据帧主要是包括三个部分:
- cluster_0_status:包含一帧内的点云数量等基本点云信息;
- cluster_1_general:点云的速度和方向等信息;
- cluster_2_quality:点云的质量信息:例如点的真实存在概率等;
can_messages
这个信息头的作用在于发送的时候作为fram_id,说明自己要发送或者要取什么数据,例如要ars_40x_can.cpp中的receive_data()中,要发送数据前必须要加上frame_id = RadarCfg。
前面的can_messsages作为frame_id就是这个作用,通过socket_can提供的can_.write来确定写入的信息类别,类的get方法返回的raw_data传入雷达中修改配置信息等雷达运行参数。
关键参数:topic与服务
通过查看topic,可以实时获取雷达的当前状态与目标点的信息等,ROS的topic机制实现了ROS系统内的信息共享,免去了复杂的进程间通信,利用其在系统内发布的信息进行订阅,继而可以方便的进行二次开发。
Message | Type | Description | Message Box |
---|---|---|---|
/radar_status | ars_40X/RadarStatus | Describe the radar configuration | 0x201 |
/ars_40X/clusters | ars_40X/ClusterList | Raw clusters data from radar | 0x600, 0x701 |
/ars_40X/objects | ars_40X/ObjectList | Raw objects data from radar | 0x60A, 0x60B, 0x60C, 0x60D |
/visualize_clusters | visualization_msgs/MarkerArray | Clusters markers for RViz visualization | - |
/visualize_objects | visualization_msgs/MarkerArray | Object markers for RViz visualization | - |
这是作者源码中定义的基本topic。
$sudo rostopic echo /radar_status
通过这个语句,可以获取实时的雷达状态:最大距离、功率等信息。
Subscription
Message | Type | Description | Message Box |
---|---|---|---|
/odom | nav_msgs/Odometry | Velocity and accleration information | 0x300, 0x301 |
Services
Services |
---|
/set_ctrl_relay_cfg |
/set_max_distance |
/set_output_type |
/set_radar_power |
/set_rcs_threshold |
/set_send_ext_info |
/set_send_quality |
/set_sensor_id |
/set_sort_index |
/set_store_in_nvm |
这是源码中提供的服务,可以通过服务来更改雷达的各项参数,调节雷达使其满足自己的使用需求,例如我要更改检测的最大距离,可以这么做:
$rosservice call /set_max_distance 200 #将最大检测距离更改到200米
这里很关键,后面我们进行二次开发,需要对雷达点云进行滤波等需要与雷达通信的功能,都需要进行基于service进行更改,service提供给我们一个非常方便与雷达进行人机交互的接口,我们可以添加滤波服务,对静态物体进行滤除或者对一定距离的物体进行滤除。
关键类与继承关系
源码中的数据获取等都是基于类的方法进行的,利用类的方法实现数据的更新,雷达参数的订阅、获取及人工设置。
- 基本类:
二次开发流程展示:TODO
下一步工作
下一步工作主要是测试自己添加的滤波的代码。