1. 程式人生 > >【Apollo】【driver】【gnss】模組除錯與分析

【Apollo】【driver】【gnss】模組除錯與分析

環境:apollo 2.5 + ubuntu16.04 + docker

編譯

gnss module 程式碼所在路徑/apollo/modules/drivers/gnss
編譯方式:[email protected]_dev_docker:/apollo$ ./apollo.sh build_gnss
注意事項

  • 編譯指令碼apollo.sh裡面的build選項並不是編譯所有的元件,只是用bazel編譯所有bazel的targe
    編譯出的庫檔案所在目錄也不是在/apollo/bazel-out下面,而是在/home/tmp/ros裡面,即gnss module編譯沒有使用bazel,還是用catkin_make編譯的。
  • 修改proto檔案下面的檔案,給apollo新增一款gps裝置(司南),新增了
message ComNavSerial {}
{
    optional bytes device = 1;  // Something like "/dev/ttyXXX".
    optional int32 baud_rate = 2 [default = 9600];
    // In general, we assumes no parity, 8 data bits, 1 stop bit, no
    // handshaking, break detection enabled. If not, add more fields here.
  }

就發現在raw_stream.cpp中找不到config::Stream::kComNavSerial 經過多方嘗試,最後將名字改成Comnav 後就可以了.應該是protoBuf的語法問題.

執行

執行gnss driver可以通過dreamview裡面的modules control ->modules ->gps,如下圖
這裡寫圖片描述

執行時遇到的問題

  • apollo.drivers.gnss.config.Config: 13:15: Expected integer, got: x 錯誤
[libprotobuf ERROR google/protobuf/text_format.cc:287
] Error parsing text-format apollo.drivers.gnss.config.Config: 13:15: Expected integer, got: x [ERROR] [1527064646.633720142]: Init stream nodelet failed. [ERROR] [1527064646.633736056]: Init stream nodelet failed. [libprotobuf ERROR google/protobuf/text_format.cc:287] Error parsing text-format apollo.drivers.gnss.config.Config: 13:15: Expected integer, got: x [FATAL] [1527064646.976518327]: Failed to load config file: /home/tmp/ros/share/gnss_driver/conf/gnss_conf_mkz.txt [ERROR] [1527064646.976596669]: Init parser nodelet failed. [ERROR] [1527064646.976669424]: Init parser nodelet failed.

執行./apollo.sh build 命令會將原始的gnss_conf_mkz.txt拷貝到/home/tmp/ros/share/gnss_driver/conf/ 目錄下.這時執行./apollo.sh build_gnss 也不會將/modules/drivers/gnss/conf/gnss_conf_mkz.txt 替換掉原始的配置檔案的拷貝版,因為新拷貝檔案的修改時間最新,需要手動修改下/modules/drivers/gnss/conf/gnss_conf_mkz.txt 加個空格什麼的,讓這個檔案的日期大於新拷貝檔案.再執行./apollo.sh build_gnss 就替換掉了.

  • stream nodelete無法退出
    在dreamview頁面無法關閉GPS,然後檢視rosnode list 發現stream程序無法退出,就用sudo kill -9 手動給幹掉了.

  • 不論輸入的gps是什麼,總是顯示美國的地點
    參考docs/howto/how_to_use_apollo_2.5_navigation_mode_cn.md 裡面的4.3,在
    /modules/common/data/global_flagfile.txt 新增上--local_utm_zone_id=50 (北京).修改完後不需要重新編譯,因為在輸出目錄中的txt檔案都是軟連結原始檔案
    然後參考docs/quickstart/apollo_software_installation_guide_cn.md 裡面的步驟3 修改zone. 修改完後需要重新編譯

分析

gnss driver有4個nodelete,stream_nodelet,parser_nodelet,rtcm_parser_nodelet,tf_broadcaster_nodelet。

  • stream_nodelet
    用於計算機與gps裝置的通訊,其中的通訊方式有:Ntrip,Serial,Tcp,Udp。將獲取到的資料通過topic傳送出來,topic如下:
/apollo/sensor/gnss/raw_data //data stream data
/apollo/sensor/gnss/rtcm_data //rtk_from stream data
/apollo/sensor/gnss/stream_status
  • parser_nodelet
    用來解析資料,可解析的資料協議為NOVATEL。訂閱/apollo/sensor/gnss/raw_data傳送出來的資料並進行解析。
    發出的topic如下:
/apollo/sensor/gnss/best_pose
/apollo/sensor/gnss/corrected_imu
/apollo/sensor/gnss/gnss_status
/apollo/sensor/gnss/imu
/apollo/sensor/gnss/ins_stat
/apollo/sensor/gnss/ins_status
/apollo/sensor/gnss/odometry
/apollo/sensor/gnss/rtk_eph
/apollo/sensor/gnss/rtk_obs

此nodelet解析協議可擴充套件,擴充套件方式:
1. 在gnss_conf_mkz.txt中修改data的format屬性
2. 在data_parser.cpp 中新增程式碼,例如RTCM_V3
3. 在CMakeLists.txt 中新增parser_nodelet target的原始檔
4. 其餘的就需要實現類似rtcm3_parser.cpp 檔案裡面的內容

Parser *create_parser(config::Stream::Format format, bool is_base_station = false) {
  switch (format) {
    case config::Stream::NOVATEL_BINARY:
      return Parser::create_novatel();
    case config::Stream::RTCM_V3:
      return Parser::create_rtcm_v3();
    default:
      return nullptr;
  }
}
  • rtcm_parser_nodelet
    用來解析資料,可解析的資料協議為RTCM3。訂閱/apollo/sensor/gnss/rtcm_data傳送出來的資料並進行解析。
    發出的topic如下:
/apollo/sensor/gnss/rtk_eph
/apollo/sensor/gnss/rtk_obs
  • tf_broadcaster_nodelet
    訂閱/apollo/sensor/gnss/odometry 資料並將轉化成tf資料發出來。

配置檔案

gnss_conf_mkz.txt分成兩部分,一部分是資料來源,傳送;另一部分是需要下發的設定gps裝置命令。如下:

#/apollo/sensor/gnss/raw_data 資料來源
data {
    format: NOVATEL_BINARY
    serial {
        device: "/dev/ttyUSB0"
        baud_rate: 115200
    }
}

#/apollo/sensor/gnss/rtcm_data 資料來源
rtk_from {
    format: RTCM_V3
    ntrip {
        address: "x.x.x.x"
        port: x
        mount_point: "x"
        user: "x"
        password: "x"
        timeout_s: x
    }
}

#將rtk資料再次轉發
rtk_to {
    format: NOVATEL_BINARY
    serial {
        device: "/dev/ttyUSB1"
        baud_rate: 115200
    }
}

#需不需要將資料再次轉發,和rtk_to相關
rtk_solution_type: RTK_RECEIVER_SOLUTION

###下發gps裝置的控制命令
login_commands: "UNLOGALL THISPORT\r\n"
login_commands: "SETIMUTOANTOFFSET 0.00 1.10866 1.14165 0.05 0.05 0.08\r\n"
login_commands: "SETINSOFFSET 0 0 0\r\n"
login_commands: "LOG COM2 GPRMC ONTIME 1.0 0.25\r\n"
login_commands: "EVENTOUTCONTROL MARK2 ENABLE POSITIVE 999999990 10\r\n"
login_commands: "EVENTOUTCONTROL MARK1 ENABLE POSITIVE 500000000 500000000\r\n"
login_commands: "LOG NCOM1 GPGGA ONTIME 1.0\r\n"

login_commands: "log bestgnssposb ontime 0.5\r\n"
login_commands: "log bestgnssvelb ontime 0.5\r\n"
login_commands: "log bestposb ontime 0.5\r\n"
login_commands: "log INSPVAXB ontime 0.5\r\n"
login_commands: "log INSPVASB ontime 0.01\r\n"
login_commands: "log CORRIMUDATASB ontime 0.01\r\n"
login_commands: "log INSCOVSB ontime 1\r\n"
login_commands: "log mark1pvab onnew\r\n"

login_commands: "log imutoantoffsetsb once\r\n"
login_commands: "log vehiclebodyrotationb onchanged\r\n"

logout_commands: "EVENTOUTCONTROL MARK2 DISABLE\r\n"
logout_commands: "EVENTOUTCONTROL MARK1 DISABLE\r\n"

詳細內容可以參考檔案:
docs/quickstart/apollo_software_installation_guide_cn.md
modules/drivers/gnss/proto/config.proto
非常好理解

proto

以下三個msg都只在MSF Localization演算法中使用

msg 位置 格式 topic 提供
GnssBestPose gnss_best_pose.proto GPS中的BESTPOSA /apollo/sensor/gnss/best_pose 司南 novetal
EpochObservation gnss_raw_observation.proto 未知 /apollo/sensor/gnss/rtk_obs novetal
GnssEphemeris gnss_raw_observation.proto 未知 /apollo/sensor/gnss/rtk_eph novetal

相關推薦

Apollodrivergnss模組除錯分析

環境:apollo 2.5 + ubuntu16.04 + docker 編譯 gnss module 程式碼所在路徑/apollo/modules/drivers/gnss 編譯方式:[email protected]_dev_docker

JSP Tomcat8.0運行連接池時發生異常AbstractMethodError oracle.jdbc.driver.T4CConnection.isValid(I)Z

jdk1.7 oracle read 2.0 ati conn pan span valid 原創 2015年12月28日 11:38:01 2004 一、Tomcat8.0運行連接池時發生異常: AbstractMethodError or

GNSS科研利器,技巧

乾貨,你要的科研利器,都幫你整理好啦! 原創: 科研利器 iNature 10月17日 做科研那麼賣力的你,怎麼能少了以下這些科研利器?趕快收入囊中吧,歡迎分享給你的小夥伴們,一起提高科研效率哦!   ① 不到 500K 的文獻全文秒下神器

GNSSGDOP,PDOP,HDOP,VDOP,TDOP

                   PDOP:位置精度因子(Position Dilution of Precision),直譯為“精度強弱度”,通常翻譯為“相對誤差”。具體含

GNSS衛星星下點軌跡Matlab模擬

      1.地球靜止軌道衛星,傾角分別為0,30,90度。 clc; clear; t = 0:1:6; we = 360/24; u = we*t; i = 30; fai = asind( sind(i)*sind(u)

GNSSMatlab XYZ_2_BLH BLH_2_XYZ

function [X,Y,Z]=BLH2xyz(B,L,H)    %transform the (B L H) into (X Y Z) under the WGS84 coordinate system   a=6378140.00;  %a=6378137.00;  

GNSSGFZRNX 常用的檔案編輯命令

          GFZRNX 是由德國波茲坦地學研究中心(GFZ)開發的一款用於 GNSS 資料預處理(適用於 RINEX 2 與 3 版本格式)的程式,支援對 RINEX 格式的觀測資料檔案(Obs)、廣播星曆檔案(Nav)和氣象

GNSS什麼是RAIM

RAIM是Receiver Autonomous Integrity Monitoring的縮寫,即接收機自體完好性監控。根據使用者接收機的多餘觀測值監測使用者定位結果的完好性,其目的是在導航過程中檢測出發生故障的衛星,並保障導航定位精度。 一般地說,要求可見衛星數5顆以上才可進行GPS完備

GNSSPPP with Smartphones: Are We There Yet?

  During Google’s I/O 2016 conference held in May 2016, Google announced that raw GNSS measurements from smartphones running the Android N op

GNSSRTK PPK

如果要聊無人機的空間定位技術,現在提到RTK(實時差分動態定位技術),相信大家都不陌生。從大疆創新公司去年推出的M600PRO到今年的M200系列都配置了RTK定位裝置。 正是因為RTK賦予了無人機實時獲取高精度空間位置資訊的能力,無人機在未來的行業應用中將更精準的完成更復雜的任務。這也是區

GNSSRTKDGNSS區別

差分GPS定位原理 它使用一臺 GPS基準接收機(基準站)和一臺使用者接收機(移動站),利用實時或事後處理技術,就可以使使用者測量時消去公共的誤差源 —衛星軌道誤差、衛星鐘差、大氣延時、多路徑效應。特別提出的是,當GPS工作衛星升空時,美國政府實行了SA政策。使衛星的軌道

GNSSGAMPRTKLIB 關於衛星PRN號,衛星number號的轉換使用

rinex.c /* read rinex obs data body */ 1.讀取觀測資料,readrnxobsb(FILE *fp,const char *opt,double ver,char tobs[][MAXOBSTYPE][4],int *flag,obs

GNSS數學阿倫方差的理解

      allan 方差(阿倫方差)是David AIlan於1966年提出的,最初該方法是用於分析振盪器的相位和頻率不穩定性,高穩定度振盪器的頻率穩定度的時域表徵目前均採用Allan方差。由於陀螺等慣性感測器本身也具有振盪器的特徵,因此該方法隨後被廣泛應用於各種慣性感測

11、自學——Linux的學習進度任務文件系統文件權限

file fin 沒有權限 finger office ref nbsp 其他 ont 文件系統文件權限 文件系統文件權限:       三類用戶:          屬主:owner, u          屬組:group, g          其它:other, o

重磅優惠套餐:CCNA零基礎實驗+CCNP路由模塊晁海江思科全部課程

ccnaCCNA零基礎實驗+CCNP路由模塊【晁海江思科全部課程】http://edu.51cto.com/pack/view/id-1071.html (等待官方審核)套餐介紹:CCNA+CCNP全新套餐,5折優惠! 鑒於很多學員詢問如何購買我的全部思科課程?是否可以享受比較大的優惠?故組建此優惠套餐

C語言天天練(二)statickeyword

修飾 weight () main函數 class code keyword spa tail 引言: statickeyword不僅能夠修飾變量。並且能夠修飾函數。了解它的使用方法,不僅對閱讀別人的代碼有幫助,也有助於自己寫出更加健壯的

原創 Hadoop&Spark 動手實踐 3Hadoop2.7.3 MapReduce理論動手實踐

pack license 讀取 rgs 理論 程序員開發 -s 接口 pri 開始聊MapReduce,MapReduce是Hadoop的計算框架,我學Hadoop是從Hive開始入手,再到hdfs,當我學習hdfs時候,就感覺到hdfs和mapreduce關系的緊密。這個

重新編譯Nginx指導手冊修復靜態編譯Openssl的Nginx漏洞 (轉)

snippets asset 替換 業務需求 tps eight nbsp 出了 sof 1. 概述 當前爆出了Openssl漏洞,會泄露隱私信息,涉及的機器較多,環境迥異,導致修復方案都有所不同。不少服務器使用的Nginx,是靜態編譯opensssl,直接將open

算法(第4版)筆記

bsp .com 二維 一個數 數組 png 初始 算法 nbsp 1、在 Java 程序中創建一個數組需要三步: 聲明數組的名字和類型; 創建數組; 初始化數組元素。 2、典型的數組處理代碼。 3、起別名。

原創 Hadoop&Spark 動手實踐 5Spark 基礎入門,集群搭建以及Spark Shell

min util man 操作 because tro txt library all Spark 基礎入門,集群搭建以及Spark Shell 主要借助Spark基礎的PPT,再加上實際的動手操作來加強概念的理解和實踐。