Parser::MessageType NovatelParser::GetMessage(MessagePtr* message_ptr) {//获取消息 放入栈中 调用PrepareMessage解析数据 yuphe2019040211if (data_ == nullptr) {return MessageType::NONE;}while (data_ < data_end_) {if (buffer_.empty()) {  // Looking for SYNC0if (*data_ == novatel::SYNC_0) {buffer_.push_back(*data_);}++data_;} else if (buffer_.size() == 1) {  // Looking for SYNC1if (*data_ == novatel::SYNC_1) {buffer_.push_back(*data_++);} else {buffer_.clear();}} else if (buffer_.size() == 2) {  // Looking for SYNC2switch (*data_) {case novatel::SYNC_2_LONG_HEADER:buffer_.push_back(*data_++);header_length_ = sizeof(novatel::LongHeader);break;case novatel::SYNC_2_SHORT_HEADER:buffer_.push_back(*data_++);header_length_ = sizeof(novatel::ShortHeader);break;default:buffer_.clear();}} else if (header_length_ > 0) {  // Working on header.if (buffer_.size() < header_length_) {buffer_.push_back(*data_++);} else {if (header_length_ == sizeof(novatel::LongHeader)) {total_length_ = header_length_ + novatel::CRC_LENGTH +reinterpret_cast<novatel::LongHeader*>(buffer_.data())->message_length;} else if (header_length_ == sizeof(novatel::ShortHeader)) {total_length_ =header_length_ + novatel::CRC_LENGTH +reinterpret_cast<novatel::ShortHeader*>(buffer_.data())->message_length;} else {AERROR << "Incorrect header_length_. Should never reach here.";buffer_.clear();}header_length_ = 0;}} else if (total_length_ > 0) {if (buffer_.size() < total_length_) {  // Working on body.buffer_.push_back(*data_++);continue;}MessageType type = PrepareMessage(message_ptr);//调用 处理buffer_.clear();total_length_ = 0;if (type != MessageType::NONE) {return type;}}}return MessageType::NONE;
}

下面是解析函数,case 语句中:

Parser::MessageType NovatelParser::PrepareMessage(MessagePtr* message_ptr) {//这一段是处理的函数if (!check_crc()) {AERROR << "CRC check failed.";return MessageType::NONE;}uint8_t* message = nullptr;novatel::MessageId message_id;uint16_t message_length;uint16_t gps_week;uint32_t gps_millisecs;if (buffer_[2] == novatel::SYNC_2_LONG_HEADER) {auto header = reinterpret_cast<const novatel::LongHeader*>(buffer_.data());message = buffer_.data() + sizeof(novatel::LongHeader);gps_week = header->gps_week;gps_millisecs = header->gps_millisecs;message_id = header->message_id;message_length = header->message_length;} else {auto header = reinterpret_cast<const novatel::ShortHeader*>(buffer_.data());message = buffer_.data() + sizeof(novatel::ShortHeader);gps_week = header->gps_week;gps_millisecs = header->gps_millisecs;message_id = header->message_id;message_length = header->message_length;}switch (message_id) {//消息类型case novatel::BESTGNSSPOS:if (message_length != sizeof(novatel::BestPos)) {AERROR << "Incorrect message_length";break;}if (HandleGnssBestpos(reinterpret_cast<novatel::BestPos*>(message),gps_week, gps_millisecs)) {*message_ptr = &bestpos_;return MessageType::BEST_GNSS_POS;}break;case novatel::BESTPOS:case novatel::PSRPOS:if (message_length != sizeof(novatel::BestPos)) {AERROR << "Incorrect message_length";break;}if (HandleBestPos(reinterpret_cast<novatel::BestPos*>(message), gps_week,gps_millisecs)) {*message_ptr = &gnss_;return MessageType::GNSS;}break;case novatel::BESTGNSSVEL:case novatel::BESTVEL:case novatel::PSRVEL:if (message_length != sizeof(novatel::BestVel)) {AERROR << "Incorrect message_length";break;}if (HandleBestVel(reinterpret_cast<novatel::BestVel*>(message), gps_week,gps_millisecs)) {*message_ptr = &gnss_;return MessageType::GNSS;}break;case novatel::CORRIMUDATA:case novatel::CORRIMUDATAS:if (message_length != sizeof(novatel::CorrImuData)) {AERROR << "Incorrect message_length";break;}if (HandleCorrImuData(reinterpret_cast<novatel::CorrImuData*>(message))) {*message_ptr = &ins_;return MessageType::INS;}break;case novatel::INSCOV:case novatel::INSCOVS:if (message_length != sizeof(novatel::InsCov)) {AERROR << "Incorrect message_length";break;}if (HandleInsCov(reinterpret_cast<novatel::InsCov*>(message))) {*message_ptr = &ins_;return MessageType::INS;}break;case novatel::INSPVA:case novatel::INSPVAS:if (message_length != sizeof(novatel::InsPva)) {AERROR << "Incorrect message_length";break;}if (HandleInsPva(reinterpret_cast<novatel::InsPva*>(message))) {*message_ptr = &ins_;return MessageType::INS;}break;case novatel::RAWIMUX:case novatel::RAWIMUSX:if (message_length != sizeof(novatel::RawImuX)) {AERROR << "Incorrect message_length";break;}if (HandleRawImuX(reinterpret_cast<novatel::RawImuX*>(message))) {*message_ptr = &imu_;return MessageType::IMU;}break;case novatel::RAWIMU:case novatel::RAWIMUS:if (message_length != sizeof(novatel::RawImu)) {AERROR << "Incorrect message_length";break;}if (HandleRawImu(reinterpret_cast<novatel::RawImu*>(message))) {*message_ptr = &imu_;return MessageType::IMU;}break;case novatel::INSPVAX:if (message_length != sizeof(novatel::InsPvaX)) {AERROR << "Incorrect message_length";break;}if (HandleInsPvax(reinterpret_cast<novatel::InsPvaX*>(message), gps_week,gps_millisecs)) {*message_ptr = &ins_stat_;return MessageType::INS_STAT;}break;case novatel::BDSEPHEMERIS:if (message_length != sizeof(novatel::BDS_Ephemeris)) {AERROR << "Incorrect BDSEPHEMERIS message_length";break;}if (HandleBdsEph(reinterpret_cast<novatel::BDS_Ephemeris*>(message))) {*message_ptr = &gnss_ephemeris_;return MessageType::BDSEPHEMERIDES;}break;case novatel::GPSEPHEMERIS:if (message_length != sizeof(novatel::GPS_Ephemeris)) {AERROR << "Incorrect GPSEPHEMERIS message_length";break;}if (HandleGpsEph(reinterpret_cast<novatel::GPS_Ephemeris*>(message))) {*message_ptr = &gnss_ephemeris_;return MessageType::GPSEPHEMERIDES;}break;case novatel::GLOEPHEMERIS:if (message_length != sizeof(novatel::GLO_Ephemeris)) {AERROR << "Incorrect GLOEPHEMERIS message length";break;}if (HandleGloEph(reinterpret_cast<novatel::GLO_Ephemeris*>(message))) {*message_ptr = &gnss_ephemeris_;return MessageType::GLOEPHEMERIDES;}break;case novatel::RANGE:if (DecodeGnssObservation(buffer_.data(),buffer_.data() + buffer_.size())) {*message_ptr = &gnss_observation_;return MessageType::OBSERVATION;}break;case novatel::HEADING:if (message_length != sizeof(novatel::Heading)) {AERROR << "Incorrect message_length";break;}if (HandleHeading(reinterpret_cast<novatel::Heading*>(message), gps_week,gps_millisecs)) {*message_ptr = &heading_;return MessageType::HEADING;}break;default:break;}return MessageType::NONE;
}

百度apollo novatel_parser.cc部分解算代码相关推荐

  1. 「Apollo」百度Apollo感知模块(perception)红绿灯检测代码完整+详细解析

    1 背景 最近在读apollo感知模块下的红绿灯检测,apollo框架思路清晰,风格规范,值得多读.直接上代码文件:trafficlights_perception_component.cc traf ...

  2. 百度apollo planning代码学习-Apollo\modules\planning\math\piecewise_jerk\PiecewiseJerkPathProblem类代码详解

    概述 PiecewiseJerkPathProblem类是apollo planning模块下modules\planning\math\piecewise_jerk\piecewise_jerk_p ...

  3. 百度apollo自动驾驶planning代码学习-Apollo\modules\planning\common\Obstacle类代码详解

    概述 Obstacle类是apollo planning模块下modules\planning\common\obstacle.cc/.h实现 从类名来看,应该是障碍物类,将一个障碍物的所有相关信息封 ...

  4. 百度Apollo(一):代码模块

    百度Apollo:https://github.com/ApolloAuto/apollo/tree/master/modules 一级目录结构重要文件夹内容: docker:docker有关的文件, ...

  5. 百度 Apollo 轨迹规划技术分享笔记

    老师简介 张雅嘉,百度高级架构师,百度 Apollo 平台规划方向技术负责人.印第安纳大学计算机科学博士,从事机器人运动规划方向.有多年机器人运动规划方向的研发经验,曾带领团队参加 DARPA 机器人 ...

  6. 百度Apollo 3.5是如何设计Cyber RT计算框架的?

    自百度Apollo自动驾驶平台开源以来,已快速迭代至 3.5 版本,代码行数超过 39 万行,合作伙伴超过 130 家,吸引了来自 97 个国家的超 15000 名开发者.无疑,Apollo 是目前世 ...

  7. ECCV2020 | Gen-LaneNet:百度Apollo提出两阶段的3D车道线检测算法,已开源

    点击上方"3D视觉工坊",选择"星标 干货第一时间送达 这篇文章收录于ECCV2020,是百度Apollo团队发表的关于3D车道线检测的文章,针对3D-LaneNet做了 ...

  8. 一个动作让全球震惊!百度Apollo就这样改写了全球智能驾驶格局

    https://www.toutiao.com/a6644515151858893316/ 2019-01-09 23:12:19 文| 暮四先生 车图腾出品,未经许可,谢绝转载 ● ● ● 五十年前 ...

  9. 百度Apollo飘了!在京开启全无人RoboTaxi体验,车型还能选,原因竟是嫌40万人次体验不够...

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 如果闭眼体验无人车,会得到一个怎样的体验? 百度给出的答案是:闭着眼乘坐的体验. 而且还有惊喜:前排没有人--主驾.副驾,都没有人了. 这 ...

最新文章

  1. jdk12‘javac‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  2. for循环10000次花多长时间_java循环经典案例学会它入行java
  3. React.js 小书 Lesson14 - 实战分析:评论功能(一)
  4. python中loop函数运用_使用涉及函数的Python在for循环中填充DataFrame
  5. 图解Windows下使用SSH Secure Shell Client远程连接Linux
  6. OO实现ALV TABLE 三:ALV的功能设计
  7. 实验十——一维数组的定义及引用
  8. Mybatis配置文件注释
  9. java常用的缓存_java 常用缓存 - 只对肉有感觉的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. Array.Sort方法
  11. 数字测图原理与方法的实习日志_数字测图原理与方法实习与习题.doc
  12. pc端字体大小自适应几种方法
  13. 实用excel软件表格Excel2010/2007完全自学视频教程 vba函数教程
  14. 计算机教室的教师端,极域电子教室教师端使用.doc
  15. Mac上java开发工具
  16. python相关性系数显著性检验_Python气象数据处理与绘图(4):显著性检验
  17. ussd代码大全_USSD查询器app
  18. 大数据分析取得的成果有哪些
  19. 时寒冰说经济大棋局我们怎么办_女王的棋局:艺术才华是闯天下的最佳武器
  20. vue ssr之nuxt

热门文章

  1. 安卓桌面软件_银河麒麟桌面操作系统是易用性和兼容性良好兼容的国产桌面操作系统...
  2. Nginx 启动或重启失败原因总结及解决办法
  3. 英语计算机工程技术学院,加拿大本科热门专业:电子与计算机工程
  4. 基于ROS的手眼标定程序解决方案|支持眼在手外/上
  5. Windows Terminal 自定义快捷键绑定
  6. 快看这里,掌柜星又有新功能更新啦
  7. Python 控制220V 电源开关??? 老板,你没看错!
  8. RK3188的wifi无法切换4G上网问题
  9. 【炼数成金-机器学习笔记】
  10. 亚马逊fire充不上电_如何在Amazon Fire Tablet或Fire HD 8上安装Google Play商店