rs_driver 是RoboSense雷达的基本驱动程序。本文是rs_driver的源代码解析文档,原文地址在:
https://github.com/RoboSense-LiDAR/rs_driver/blob/v1.5.7/doc/src_intro/rs_driver_intro_CN.md
5 Packet的录制与回放
使用者调试自己的程序时,点云的录制与回放是有用的,只是点云占的空间比较大。MSOP/DIFOP Packet占的空间较小,所以Packet的录制与回放是更好的选择。
与MSOP/DIFP Packet的录制与回放相关的逻辑,散布在rs_driver的各个模块中,所以这里单独分一个章节说明。
packet_record_replay.png5.1 录制
5.1.1 LidarDriverImpl::regPacketCallback()
通过regPacketCallback(),rs_driver的使用者注册一个回调函数,得到原始的MSOP/DIFOP Packet。
- 回调函数保存在成员
cb_put_pkt_
。
5.1.2 LidarDriverImpl::processMsopPkt()
在processMsopPkt()中,
- 调用Decoder::processMsopPkt(),
- 调用
cb_put_pkt_
,将MSOP Packet传给调用者。- 设置Packet的时间戳。这个时间戳调用Decoder::prevPktTs()得到。
- 设置这个Packet是否触发分帧。这个标志是Decoder::processMsopPkt()的返回值。
5.1.3 LidarDriverImpl::processDifopPkt()
在processDifopPkt()中,
- 调用Decoder::processDifopPkt(),
- 调用
cb_put_pkt_
,将MSOP Packet传给调用者。DIFOP Packet的时间戳不重要。
5.2 回放
5.2.1 InputRaw
class_input_rawInputRaw回放MOSP/DIFOP Packet。
- 使用者从某种数据源(比如rosbag文件)中解析MSOP/DIFOP Packet,调用InputRaw的成员函数feedPacket(),将Packet喂给它。
- 在feedPacket()中,InputRaw简单地调用成员
cb_put_pkt_
,将Packet推送给调用者。这样,它的后端处理就与InputSock/InputPcap一样了。
- 在feedPacket()中,InputRaw简单地调用成员
5.2.2 LidarDriverImpl
- InputRaw::feedBack()在InputFactory::createInput()中被打包,最后保存在LidarDriverImpl类的成员
cb_feed_pkt_
中。 - 使用者调用LidarDriverImpl的成员函数decodePacket(),可以将Packet喂给它。decodePacket()简单地调用成员
cb_feed_pkt_
。
5.3 时间戳处理
点云的时间戳来自于MSOP Packet的时间戳。MSOP Packet的时间戳可以有两种产生方式。
- 用户配置参数
RSDecoderParam::use_lidar_clock
决定使用哪种方式。 -
use_lidar_clock
=true
时, 使用雷达产生的时间戳,这个时间戳在Packet中保存。这种情况下,一般已经使用时间同步协议对雷达做时间同步。 -
use_lidar_clock
=false
时, 忽略Packet中的时间戳,在电脑主机侧由rs_driver重新产生一个。
5.3.1 使用雷达时间戳
录制时,设置use_lidar_clock
= true
- 解析MSOP Packet的时间戳。这个时间戳是雷达产生的。
- 输出的点云使用这个时间戳
- 如果输出Packet,也是这个时间戳
回放时,设置use_lidar_clock
= true
- MSOP Packet内保存的仍然是雷达产生的时间戳。
- 输出点云仍然使用这个时间戳。
5.3.2 使用主机时间戳
录制时,设置use_lidar_clock
= false
- rs_driver在电脑主机侧重新产生时间戳。这个时间戳覆盖Packet文件中原有的时间戳;如果这时有点云输出,使用rs_driver产生的时间戳
- 在DecoderRSBP::internDecodeMsopPacket()中,rs_driver调用getTimeHost()产生时间戳,然后调用createTimeYMD(),用这个新时间戳替换Packet中原有的时间戳。
- 这时输出的Packet的时间戳是rs_driver产生的时间戳
回放时,设置use_lidar_clock
= true
- 解析MSOP Packet的时间戳。这个时间戳是录制时rs_driver在电脑主机侧产生的。
- 输出的点云使用这个时间戳。
网友评论