maplab系列4:数据流

  • RovioliNode的构造函数中实例化datasource_flow_,
    • datasource_flow_类型DataSourceFlow
    • 需要相机和imu的配置信息
      • aslam::NCamera
      • vi_map::Imu
  • DataSourceFlow的构造函数中实例化datasource_ 
    • datasource_类型DataSource
    • 使用createAndConfigureDataSourcefromGFlags实例化
      • 这里面决定使用bag和是实时topic数据
        • DataSourceRosbag
        • DataSourceRostopic
        • 使用外部参数FLAGS_datasource_type决定
  • 调用datasource_flow_的attachToMessageFlow
    • 注册datasource_中的IMU和IMG回调函数
      • 使用flow->registerPublisher得到imu和img分别的回调函数
        • message_flow_topics::IMAGE_MEASUREMENTS
        • message_flow_topics::IMU_MEASUREMENTS
      • 使用registerXXXCallback注册这个回调函数到DataSource中
        • 这是DECLARE_SENSOR_CALLBACK制造的函数
  • main函数中调用rovio_localization_node.start()开始接收数据
    • 把传感器的rostopic和对应回调函数连接起来
    • 对应回调函数中再调用之前DECLARE_SENSOR_CALLBACK函数里生成的回调函数
    • 这个生成的回调函数再调用之前registerXXXCallback传入的message_flow_topics回调函数
    • 也就是现在imu和img的rostopic和imu和img的message_flow_topics连接上了
      • 接受到某个传感器的rostopic就能调用对应的message_flow_topics回调函数
  • RovioFlow接收传感器的message_flow_topics消息
    • 收到后调用rovio::RovioInterface处理传感器数据的函数
      • processImuUpdate
      • processImageUpdate
  • ImuCameraSynchronizerFlow(synchronizer_flow_)接收传感器的message_flow_topics消息
    • synchronizer_flow_是RovioliNode的成员
    • 收到后把消息加入到ImuCameraSynchronizer(synchronizing_pipeline_)中
      • synchronizing_pipeline_是ImuCameraSynchronizerFlow的成员
      • addCameraImage
      • addImuMeasurements
  • FeatureTrackingFlow只有在需要生成定位地图的时候才需要
    • rovio本身不使用任何描述符,但起结果作为定位地图时,需要额外提取描述符
  • ImuCameraSynchronizer不断发布message_flow_topics::SYNCED_NFRAMES_AND_IMU
    • 有一些frame会被丢弃,不被用于后面的处理
    • 不断检查imubuf里面的内容
    • 消息类型vio::SynchronizedNFrameImu
    • FeatureTrackingFlow接收消息并使用FeatureTracking处理消息
    • 处理消息后发出message_flow_topics::TRACKED_NFRAMES_AND_IMU消息
      • 消息类型vio::SynchronizedNFrameImu
    • SyncedNFrameThrottlerFlow接收message_flow_topics::TRACKED_NFRAMES_AND_IMU
      • 使用SyncedNFrameThrottler的shouldPublishNFrame判断这个消息是否可以继续传下去
        • 时间间隔小于FLAGS_vio_throttler_max_output_frequency_hz就不用于定位了
      • 发出消息message_flow_topics::THROTTLED_TRACKED_NFRAMES_AND_IMU
        • 消息类型vio::SynchronizedNFrameImu
    • MapBuilderFlow接收message_flow_topics::TRACKED_NFRAMES_AND_IMU
    • LocalizerFlow接收message_flow_topics::THROTTLED_TRACKED_NFRAMES_AND_IMU
      • 调用Localizer的localizeNFrame开始定位
      • 定位结果用message_flow_topics::LOCALIZATION_RESULT发出
        • 消息类型vio::LocalizationResult
    • RovioFlow接收message_flow_topics::LOCALIZATION_RESULT
      • 调用rovio::RovioInterface的processGroundTruthUpdate更新滤波器状态
    • MapBuilderFlow接收message_flow_topics::LOCALIZATION_RESULT
    • DataPublisherFlow接收message_flow_topics::LOCALIZATION_RESULT
    • 每一个ImuCameraSynchronizer发出的frame都会被提取描述符
    • 只有通过SyncedNFrameThrottlerFlow的frame才被用于定位
  • rovio::RovioInterface的registerStateUpdateCallback注册RovioFlow::processRovioUpdate
    • 在RovioFlow的attachToMessageFlow完成
    • processRovioUpdate接收到rovio::RovioState数据
    • 处理和转换后把数据发送到message_flow_topics::ROVIO_ESTIMATES
      • 消息类型RovioEstimate
    • MapBuilderFlow接收message_flow_topics::ROVIO_ESTIMATES
    • DataPublisherFlow接收message_flow_topics::ROVIO_ESTIMATES
    • FeatureTrackingFlow接收message_flow_topics::ROVIO_ESTIMATES
      • 数据传给FeatureTrackingFlow的FeatureTracking

猜你喜欢

转载自blog.csdn.net/ziliwangmoe/article/details/83271372