1. 程式人生 > >Ethzasl MSF原始碼閱讀(2):百川匯海

Ethzasl MSF原始碼閱讀(2):百川匯海

這裡有個感覺,就是百川匯海。即IMU資料和相機的訊息資料都彙集到msf_core進行處理。接上一篇,

1. 檢視IMUHandler_ROS::IMUCallback和IMUHandler_ROS::StateCallback回撥函式。

 MUHandler_ROS::IMUCallback,傳入的訊息sensor_msgs::ImuConstPtr。

 1 void IMUCallback(const sensor_msgs::ImuConstPtr & msg) 
 2 {
 3     static int lastseq = constants::INVALID_SEQUENCE;
4 if (static_cast<int>(msg->header.seq) != lastseq + 1 5 && lastseq != constants::INVALID_SEQUENCE) { 6 MSF_WARN_STREAM( 7 "msf_core: imu message drop curr seq:" << msg->header.seq 8 << " expected: " << lastseq + 1
); 9 } 10 lastseq = msg->header.seq; 11 12 msf_core::Vector3 linacc; 13 linacc << msg->linear_acceleration.x, msg->linear_acceleration.y, msg 14 ->linear_acceleration.z; 15 16 msf_core::Vector3 angvel; 17 angvel << msg->angular_velocity.x, msg->angular_velocity.y, msg
18 ->angular_velocity.z; 19 20 this->ProcessIMU(linacc, angvel, msg->header.stamp.toSec(), 21 msg->header.seq); 22 }

IMUHandler_ROS::StateCallback,傳入的引數sensor_fusion_comm::ExtEkfConstPtr,這個需要理解一下。

 1 void StateCallback(const sensor_fusion_comm::ExtEkfConstPtr & msg) 
 2 {
 3     static_cast<MSF_SensorManagerROS<EKFState_T>&>(this->manager_)
 4         .SetHLControllerStateBuffer(*msg);
 5 
 6     // Get the imu values.
 7     msf_core::Vector3 linacc;
 8     linacc << msg->linear_acceleration.x, msg->linear_acceleration.y, msg
 9         ->linear_acceleration.z;
10 
11     msf_core::Vector3 angvel;
12     angvel << msg->angular_velocity.x, msg->angular_velocity.y, msg
13         ->angular_velocity.z;
14 
15     int32_t flag = msg->flag;
16     // Make sure we tell the HL to ignore if data playback is on.
17     if (this->manager_.GetDataPlaybackStatus())
18       flag = sensor_fusion_comm::ExtEkf::ignore_state;
19 
20     bool isnumeric = true;
21     if (flag == sensor_fusion_comm::ExtEkf::current_state) {
22       isnumeric = CheckForNumeric(
23           Eigen::Map<const Eigen::Matrix<float, 10, 1> >(msg->state.data()),
24           "before prediction p,v,q");
25     }
26 
27     // Get the propagated states.
28     msf_core::Vector3 p, v;
29     msf_core::Quaternion q;
30 
31     p = Eigen::Matrix<double, 3, 1>(msg->state[0], msg->state[1],
32                                     msg->state[2]);
33     v = Eigen::Matrix<double, 3, 1>(msg->state[3], msg->state[4],
34                                     msg->state[5]);
35     q = Eigen::Quaternion<double>(msg->state[6], msg->state[7], msg->state[8],
36                                   msg->state[9]);
37     q.normalize();
38 
39     bool is_already_propagated = false;
40     if (flag == sensor_fusion_comm::ExtEkf::current_state && isnumeric) {
41       is_already_propagated = true;
42     }
43 
44     this->ProcessState(linacc, angvel, p, v, q, is_already_propagated,
45                         msg->header.stamp.toSec(), msg->header.seq);
46   }

檢視IMUHandler_ROS類的父類IMUHandler的ProcessIMU和ProcessState方法,如下:

 void ProcessIMU(const msf_core::Vector3& linear_acceleration,
                   const msf_core::Vector3& angular_velocity,
                   const double& msg_stamp, size_t msg_seq) {
    core_->ProcessIMU(linear_acceleration, angular_velocity, msg_stamp,
                       msg_seq);
  }
  void ProcessState(const msf_core::Vector3& linear_acceleration,
                     const msf_core::Vector3& angular_velocity,
                     const msf_core::Vector3& p, const msf_core::Vector3& v,
                     const msf_core::Quaternion& q, bool is_already_propagated,
                     const double& msg_stamp, size_t msg_seq) {
    core_->ProcessExternallyPropagatedState(linear_acceleration,
                                            angular_velocity, p, v, q,
                                            is_already_propagated,
                                            msg_stamp, msg_seq);
  }

可以發現對應了msf_core_的ProcessIMU和ProcessExternallyPropagatedState方法。

2. 檢視PoseSensorHandler::MeasurementCallback回撥函式。注意,在建構函式中掛載了三個不同的MeasurementCallback函式。

geometry_msgs::PoseWithCovarianceStamped,geometry_msgs::TransformStamped,geometry_msgs::PoseStamped三種訊息型別。

 1 template<typename MEASUREMENT_TYPE, typename MANAGER_TYPE>
 2 void PoseSensorHandler<MEASUREMENT_TYPE, MANAGER_TYPE>::MeasurementCallback(
 3     const geometry_msgs::PoseWithCovarianceStampedConstPtr & msg) 
 4 {
 5   this->SequenceWatchDog(msg->header.seq,
 6                          subPoseWithCovarianceStamped_.getTopic());
 7   MSF_INFO_STREAM_ONCE(
 8       "*** pose sensor got first measurement from topic "
 9           << this->topic_namespace_ << "/"
10           << subPoseWithCovarianceStamped_.getTopic() << " ***");
11   ProcessPoseMeasurement(msg);//注意
12 }

檢視 ProcessPoseMeasurement(msg)函式:

 1 template<typename MEASUREMENT_TYPE, typename MANAGER_TYPE>
 2 void PoseSensorHandler<MEASUREMENT_TYPE, MANAGER_TYPE>::ProcessPoseMeasurement(const geometry_msgs::PoseWithCovarianceStampedConstPtr & msg) 
 3 {
 4   received_first_measurement_ = true;
 5 
 6   // Get the fixed states.
 7   int fixedstates = 0;
 8   static_assert(msf_updates::EKFState::nStateVarsAtCompileTime < 32, "Your state "
 9       "has more than 32 variables. The code needs to be changed here to have a "
10       "larger variable to mark the fixed_states");
11   // Do not exceed the 32 bits of int.
12 
13   // Get all the fixed states and set flag bits.
14   MANAGER_TYPE* mngr = dynamic_cast<MANAGER_TYPE*>(&manager_);
15 
16   // TODO(acmarkus): if we have multiple sensor handlers, they all share the same dynparams,
17   // which me maybe don't want. E.g. if we have this for multiple AR Markers, we
18   // may want to keep one fix --> move this to fixed parameters? Could be handled
19   // with parameter namespace then.
20   if (mngr) {
21     if (mngr->Getcfg().pose_fixed_scale) {
22       fixedstates |= 1 << MEASUREMENT_TYPE::AuxState::L;
23     }
24     if (mngr->Getcfg().pose_fixed_p_ic) {
25       fixedstates |= 1 << MEASUREMENT_TYPE::AuxState::p_ic;
26     }
27     if (mngr->Getcfg().pose_fixed_q_ic) {
28       fixedstates |= 1 << MEASUREMENT_TYPE::AuxState::q_ic;
29     }
30     if (mngr->Getcfg().pose_fixed_p_wv) {
31       fixedstates |= 1 << MEASUREMENT_TYPE::AuxState::p_wv;
32     }
33     if (mngr->Getcfg().pose_fixed_q_wv) {
34       fixedstates |= 1 << MEASUREMENT_TYPE::AuxState::q_wv;
35     }
36   }
37 
38   shared_ptr<MEASUREMENT_TYPE> meas(new MEASUREMENT_TYPE(
39       n_zp_, n_zq_, measurement_world_sensor_, use_fixed_covariance_,
40       provides_absolute_measurements_, this->sensorID,
41       enable_mah_outlier_rejection_, mah_threshold_, fixedstates, distorter_));
42 
43   meas->MakeFromSensorReading(msg, msg->header.stamp.toSec() - delay_);
44 
45   z_p_ = meas->z_p_;  //store this for the init procedure
46   z_q_ = meas->z_q_;
47 
48   this->manager_.msf_core_->AddMeasurement(meas);
49 }

這裡呼叫了this->manager_.msf_core_->AddMeasurement(meas),檢視AddMeasurement方法。

3.以上,最終對應於MSF_Core類的三個函式,即

ProcessIMU、ProcessExternallyPropagatedState、AddMeasurement。

4.MSF_Core類,MSF_core類負責彙集IMU訊息和位姿觀測值,同時實現了狀態預測,而msf_updates::pose_measurement::PoseMeasurement<>實現了狀態的更新。

這個在分析MSF_Core三個方法的時候再說明。

相關推薦

Ethzasl MSF原始碼閱讀(2)

這裡有個感覺,就是百川匯海。即IMU資料和相機的訊息資料都彙集到msf_core進行處理。接上一篇, 1. 檢視IMUHandler_ROS::IMUCallback和IMUHandler_ROS::StateCallback回撥函式。  MUHandler_ROS::IMUCallback,傳入的訊息s

Ethzasl MSF原始碼閱讀(1)程式入口和主題訂閱

Ethz的Stephen Weiss的工作,是一個IMU鬆耦合的方法。 1.程式入口:ethzasl_msf\msf_updates\src\pose_msf\main.cpp 1 #include "pose_sensormanager.h" 2 3 int main(int argc,

Ethzasl MSF原始碼閱讀(3)MSF_Core和PoseMeasurement

1.MSF_Core的三個函式:ProcessIMU、ProcessExternallyPropagatedState和AddMeasurement MSF_Core維護了狀態佇列和觀測值佇列,這裡需要結合論文思考這個狀態佇列的作用。 ProcessIMU方法: 1 template<

Cartographer原始碼閱讀(2)Node和MapBuilder物件

  上文提到特別注意map_builder_bridge_.AddTrajectory(x,x),檢視其中的程式碼。兩點:   首先是map_builder_.AddTrajectoryBuilder(...),呼叫了map_builder_物件的方法。其次是sensor_bridges_鍵值對的賦值。

Cartographer原始碼閱讀(4)Node和MapBuilder物件2

  MapBuilder的成員變數sensor::Collator sensor_collator_;   再次閱讀MapBuilder::AddTrajectoryBuilder方法。首先構造了mapping::GlobalTrajectoryBuilder例項,接著作為引數構造了CollatedTraj

springmvc原始碼閱讀2--dispatcherServlet及談如何找原始碼入口

一、先找到入口: 1、先說找發: 根據配置檔案找 這個是最常見的搞法,在原始階段大多數都會使用一些配置檔案來啟動這些框架,但是隨著springboot類似的搞法的流行,這個技巧有點不在那麼起作用,其實原理還是這個。 依據j2ee的規範來找: 首先我們要搞明白兩個規範(也

Caffe原始碼理解2SyncedMemory CPU和GPU間的資料同步

目錄 寫在前面 成員變數的含義及作用 構造與析構 記憶體同步管理 參考 部落格:blog.shinelee.me | 部落格園 | CSDN 寫在前面 在Caffe原始碼理解1中介紹了Blob類,其中的資料成員有 shared_ptr<SyncedMemory>

Caffe原始碼解析2SycedMem

看到SyncedMem就知道,這是在做記憶體同步的操作。這類個類的程式碼比較少,但是作用是非常明顯的。檔案對應著syncedmem.hpp,著syncedmem.cpp 首先是兩個全域性的行內函數。如果機器是支援GPU的並且安裝了cuda,通過cudaMallocHost分配的host memory將會被p

Spring4.3.12原始碼閱讀系列1-環境搭建

學習任務 近期想增加部分原始碼閱讀經驗,提高自己在造輪子方面的實力,增長些在設計模式應用方面的編碼能力,以及懷著向大佬們膜拜的心情,開始有計劃地閱讀Spring原始碼 前期準備 以下幾項準備事項,算是基本的日常開發環境,就算沒有,也是動動手很快安

Tensorflow object detection API 原始碼閱讀筆記RPN

Update: 建議先看從程式設計實現角度學習Faster R-CNN,比較直觀。這裡由於原始碼抽象程度較高,顯得比較混亂。 faster_rcnn_meta_arch.py中這兩個對應知乎文章中RPN包含的3*3和1*1卷積: rpn_box_pred

Python3.x學習筆記[2]度聯想詞獲取

學習內容來自百度貼吧的某培訓機構一個名叫黃哥的視訊,視訊內容講的是360搜尋,經測試國內其他搜尋引擎大都適用, 但在谷歌上試的時候發現不容易解析,問題出在URL格式中cp=後面代表的字串長度還好想,但是gs_id後面就會變了, 比如這麼個解析出來的json網址,https://www.google.com.h

原始碼閱讀系列為什麼要閱讀原始碼

一.為什麼要閱讀程式碼   養成閱讀高品質程式碼的習慣,可以提高編寫程式碼的能力。   電腦科學是一門實踐性很強的學科,很多內容在書本上根本學不到。就拿專案的組織來說,沒有什麼書籍專門論述應該如何組織與管理專案的目錄結構,因為這本身就是一種見仁見智的活動,要

spring framework 4 原始碼閱讀(2)---從ClassPathXmlApplicationContext開始

Application初始化日誌 15:23:12.790 [main] DEBUG o.s.core.env.StandardEnvironment - Adding [systemProperties] PropertySource with lowest searc

Tensorflow object detection API 原始碼閱讀筆記架構

在之前的博文中介紹過用tf提供的預訓練模型進行inference,非常簡單。這裡我們深入原始碼,瞭解檢測API的程式碼架構,每個部分的深入閱讀留待後續。 '''構建自己模型的介面是虛基類DetectionModel,具體有5個抽象函式需要實現。 ''' o

Tensorflow object detection API 原始碼閱讀筆記RFCN

有了前面Faster R-CNN的基礎,RFCN就比較容易了。 """object_detection/meta_architectures/rfcn_meta_arch.py The R-FCN

Gluster原始碼閱讀2--啟動分析service glusterd start

修改/usr/lib/systemd/system/glusterd.service 裡的log級別到TRACE Environment="LOG_LEVEL=TRACE" 可以檢視更多log 當安裝好gluster後,在/usr/sbin下面會有4個檔案與之相關 這4個

Android 5.0 Camera系統原始碼分析(2)Camera開啟流程

1. 前言 本文將分析android系統原始碼,從frameworks層到hal層,暫不涉及app層和kernel層。由於某些函式比較複雜,在貼出程式碼時會適當對其進行簡化。本文屬於自己對原始碼的總結,僅僅是貫穿程式碼流程,不會深入分析各個細節。歡迎聯絡討論,QQ:1026

LAV Filter 原始碼分析 2 LAV Splitter

LAV Filter 中最著名的就是 LAV Splitter,支援Matroska /WebM,MPEG-TS/PS,MP4/MOV,FLV,OGM / OGG,AVI等其他格式,廣泛存在於各種視訊播放器(暴風影音這類的)之中。本文分析一下它的原始碼。在分析之前,先看看它是

Cartographer原始碼閱讀(8)imu_tracker

1 /* 2 * Copyright 2016 The Cartographer Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use

Cartographer原始碼閱讀(1)程式入口

1 [email protected]:~$ sudo apt-get install kdevelop 2 [sudo] password for yhexie: 3 Reading package lists... Done 4 Building dependency