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