美文网首页
rs_driver v1.5.7 源代码解析(三)

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

作者: RonZheng2010 | 来源:发表于2022-09-29 15:54 被阅读0次

    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 源代码解析(三)

          本文链接:https://www.haomeiwen.com/subject/fclkartx.html