rs_driver v1.5.7 源代码解析(三)

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.png

5.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_raw

InputRaw回放MOSP/DIFOP Packet。

  • 使用者从某种数据源(比如rosbag文件)中解析MSOP/DIFOP Packet,调用InputRaw的成员函数feedPacket(),将Packet喂给它。
    • 在feedPacket()中,InputRaw简单地调用成员cb_put_pkt_,将Packet推送给调用者。这样,它的后端处理就与InputSock/InputPcap一样了。

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在电脑主机侧产生的。
  • 输出的点云使用这个时间戳。

你可能感兴趣的:(rs_driver v1.5.7 源代码解析(三))