[cartographer] 9. proto配置文件读取

2023-05-16

目录

1. proto文件

2. .lua配置文件

3. 代码

1)读取lua文件

2)赋值给proto options

   获取proto参数值有两种方式:1)lua文件 2)通过service,例如如下代码中 InitialTrajectoryPose 的赋值

3)  如何使用 proto options

纯定位模式入口

我们需要掌握的是什么?要知道在哪里改变参数,从而更深入的理解算法。

TODO:

1. sensor topic 在哪里设置?

2. 自定义的一堆service 如何使用,效果如何?


系统的配置文件框架主要有三部分构成:

1. proto文件

   - 根据自己的需要,自定义proto文件。比如:我们希望 参数 A 通过配置文件来设定具体数值,则 参数A 在proto文件中被定义。

   - 一系列的proto文件 位于 cartographer/mapping/proto

   - 如何自定义proto文件呢?例如:

//如下代码取自 cartographer/mapping/proto/trajectory_builder_options.proto 

import "cartographer/mapping/proto/2d/local_trajectory_builder_options_2d.proto";
import "cartographer/mapping/proto/3d/local_trajectory_builder_options_3d.proto";

// 一组参数的集合称为options,用 message name{} 的形式定义
// options内部可以包含对个其他的options,必须import其所在的proto 如上面两行
// 也可以在内部定义新的 options 如 PureLocalizationTrimmerOptions
message TrajectoryBuilderOptions {
  LocalTrajectoryBuilderOptions2D trajectory_builder_2d_options = 1;
  LocalTrajectoryBuilderOptions3D trajectory_builder_3d_options = 2;
  InitialTrajectoryPose initial_trajectory_pose = 4;

  reserved 5;

  bool pure_localization = 3 [deprecated = true];
  message PureLocalizationTrimmerOptions {
    int32 max_submaps_to_keep = 1;
  }
  PureLocalizationTrimmerOptions pure_localization_trimmer = 6;

  bool collate_fixed_frame = 7;
  bool collate_landmarks = 8;
}

2. .lua配置文件

对应的lua配置文件:

// 代码取自 cartographer2019-05-25/configuration_files/trajectory_builder.lua

// 对应的,也要 include options 相应的lua文件
include "trajectory_builder_2d.lua"
include "trajectory_builder_3d.lua"

// 这些options的名字必须是大写,但是不必和proto中保持一致
// 但是成员变量的名字必须和proto中保持一致

TRAJECTORY_BUILDER = {
  trajectory_builder_2d = TRAJECTORY_BUILDER_2D,
  trajectory_builder_3d = TRAJECTORY_BUILDER_3D,
--  pure_localization_trimmer = {   -- 这个是定位模式
--    max_submaps_to_keep = 3,
--  },
  collate_fixed_frame = true,
  collate_landmarks = false,
}

3. 代码

主要分为如下三个步骤:

1)读取lua文件

     - 这部分不细看了

2)赋值给proto options

     其赋值主要有两种方式:
    - 1. options.set_变量名(参数值)
    - 2. options.mutable_变量名 = 参数值

   获取proto参数值有两种方式:1)lua文件 2)通过service,例如如下代码中 InitialTrajectoryPose 的赋值

// 如下代码位于: cartographer_ros/node.cc
// cartographer_ros_msgs::StartTrajectory 是自定义的service,位于cartographer_ros_msgs/srv/StartTrajectory.srv

bool Node::HandleStartTrajectory(
    ::cartographer_ros_msgs::StartTrajectory::Request& request, 
    ::cartographer_ros_msgs::StartTrajectory::Response& response) {

// 这个是在cartographer_ros/trajectory_options.h 中 自定义的类,与proto中的不同。
// 该类型包含了
// cartographer::mapping::proto::TrajectoryBuilderOptions 变量 
// 和 一些其他的topic,频率等变量(这些变量会根据数据集的不同可能会变化,因此在最外层)。
// 对应 cartographer_ros/configuration_files/backpack_2d.lua 等文件
// 这些lua文件全部       include "map_builder.lua"
//                     include "trajectory_builder.lua"
// 所以,核心的lua还是 map_builder.lua; trajectory_builder.lua
// 而 map_builder.lua; trajectory_builder.lua 又分别包含其他的很多lua 就这样一层一层的。

  TrajectoryOptions trajectory_options;

  // 将lua转换为 proto options
  // tie 可以将tuple解包,赋值给相应的参数。std::ignore 表示忽略第一个参数
  std::tie(std::ignore, trajectory_options) = LoadOptions(
      request.configuration_directory, request.configuration_basename);


  // 省略中间部分
  
  // 可以注意到:cartographer/configuration_files/trajectory_builder.lua中,
  // 并没有给InitialTrajectoryPose 这个变量赋值,虽然 proto中包含这个变量
  // 而是留到service中进行赋值

  if (request.use_initial_pose) {

  // InitialTrajectoryPose 是在 cartographer/mapping/proto/trajectory_builder_options.proto 
// 中定义的一个 options , 其赋值主要有两种方式:
// 1. options.set_变量名(参数值)
// 2. options.mutable_变量名 = 参数值
// 注意:options 也是一个成员变量,其赋值也是使用上述两种方式之一

      ::cartographer::mapping::proto::InitialTrajectoryPose
        initial_trajectory_pose;
    initial_trajectory_pose.set_to_trajectory_id(
        request.relative_to_trajectory_id);
    *initial_trajectory_pose.mutable_relative_pose() =
        cartographer::transform::ToProto(pose);
    initial_trajectory_pose.set_timestamp(cartographer::common::ToUniversal(
        ::cartographer_ros::FromRos(ros::Time(0))));
    *trajectory_options.trajectory_builder_options
         .mutable_initial_trajectory_pose() = initial_trajectory_pose;

}

}

         

3)  如何使用 proto options

   - 1. 如果想使用 options 成员变量,则先通过 has_name()来判断lua中是否给这个变量赋值了

   - 2. 直接 name()即可获得该变量的值

// 位于 map_builder.cc
int MapBuilder::AddTrajectoryBuilder(
    const std::set<SensorId>& expected_sensor_ids,
    const proto::TrajectoryBuilderOptions& trajectory_options,
    LocalSlamResultCallback local_slam_result_callback)
{
    std::unique_ptr<LocalTrajectoryBuilder2D> local_trajectory_builder;
    // 1. 如果想使用 options 成员变量,则先通过 has_name()来判断lua中是否给这个变量赋值了
    if (trajectory_options.has_trajectory_builder_2d_options()) {
      local_trajectory_builder = absl::make_unique<LocalTrajectoryBuilder2D>(
          2. 直接 name()即可获得该变量的值
          trajectory_options.trajectory_builder_2d_options(),
          SelectRangeSensorIds(expected_sensor_ids));
    }
    

    // 下面这部分同理
  if (trajectory_options.has_initial_trajectory_pose()) {
    const auto& initial_trajectory_pose =
        trajectory_options.initial_trajectory_pose();
    pose_graph_->SetInitialTrajectoryPose(
        trajectory_id, initial_trajectory_pose.to_trajectory_id(),
        transform::ToRigid3(initial_trajectory_pose.relative_pose()),
        common::FromUniversal(initial_trajectory_pose.timestamp()));
  }
 }

纯定位模式入口

// 位于文件 map_builder.cc 
void MaybeAddPureLocalizationTrimmer(
    const int trajectory_id,
    const proto::TrajectoryBuilderOptions& trajectory_options,
    PoseGraph* pose_graph) {
  if (trajectory_options.pure_localization()) {
    // 已经被弃用了,现在是改为使用pure_localization_trimmer
    LOG(WARNING)
        << "'TrajectoryBuilderOptions::pure_localization' field is deprecated. "
           "Use 'TrajectoryBuilderOptions::pure_localization_trimmer' instead.";
    pose_graph->AddTrimmer(absl::make_unique<PureLocalizationTrimmer>(
        trajectory_id, 3 /* max_submaps_to_keep */));
    return;
  }
  if (trajectory_options.has_pure_localization_trimmer()) {
    pose_graph->AddTrimmer(absl::make_unique<PureLocalizationTrimmer>(
        trajectory_id,
        trajectory_options.pure_localization_trimmer().max_submaps_to_keep()));
  }
}

// 对应的 proto : cartographer/mapping/proto/trajectory_builder_options.proto 
message TrajectoryBuilderOptions {
  LocalTrajectoryBuilderOptions2D trajectory_builder_2d_options = 1;
  LocalTrajectoryBuilderOptions3D trajectory_builder_3d_options = 2;
  InitialTrajectoryPose initial_trajectory_pose = 4;

  reserved 5;

  bool pure_localization = 3 [deprecated = true];// deprecated 被弃用
  message PureLocalizationTrimmerOptions {
    int32 max_submaps_to_keep = 1;
  }
  PureLocalizationTrimmerOptions pure_localization_trimmer = 6;

  bool collate_fixed_frame = 7;
  bool collate_landmarks = 8;
}

我们需要掌握的是什么?要知道在哪里改变参数,从而更深入的理解算法。

1. proto文件全部位于:cartographer/mapping/proto

2. lua文件:

     1)外层文件全部位于:cartographer_ros/configuration_files。 例如 backpack_2d.lua。

     2)算法相关的文件全部位于:cartographer/configuration_files

TODO:

1. sensor topic 在哪里设置?

2. 自定义的一堆service 如何使用,效果如何?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[cartographer] 9. proto配置文件读取 的相关文章

随机推荐

  • 大端小端字节序,网络字节序,Intel字节序

    一 字节序 计算机硬件存储数据有两种方式 xff1a 大端字节序 xff08 big endian xff09 和小端字节序 xff08 little endian xff09 小端字节序 xff1a 即低地址存低位字节 xff0c 或者说
  • 基于C++的Qt(三)Qt类库概述

    Qt是一个用标准C 43 43 编写的跨平台开发类库 xff0c 它对标准C 43 43 进行了扩展 xff0c 引入了元对象系统 信号与槽 属性等特性 xff0c 使应用程序的开发变得更高效 Qt类库中大量的类以模块形式分类组织的 xff
  • 【ROS2】一、创建工作空间和功能包

    文章目录 前言一 创建工作空间二 创建功能包三 编译功能包总结 前言 ROS2通过命令创建工作空间和功能包 xff0c vscode对ROS2的支持比ROS1少 xff0c 不能直接在vscode中创建功能包 xff0c 因此 xff0c
  • debian 更换源 使用国内源 配置方法

    配置前请先参考 xff1a https wiki debian org SourcesList https www debian org mirror list https mirrors tuna tsinghua edu cn help
  • i.MX6ULL 开发板-Mqtt 移植

    转载 xff1a http e betheme net article show 149636 html action 61 onClick PS xff1a 订阅主题 xff0c 命令如下 xff1a mosquitto sub h lo
  • echo web框架教程

    转载 xff1a https www cnblogs com remixnameless p 14318145 html 一 介绍 echo web框架是go语言开发的一种高性能 xff0c 可扩展 xff0c 轻量级的web框架 echo
  • open cv中cmake编译出现Download: opencv_ffmpeg.dll、ippicv等失败的解决方法

    转载 xff1a https blog csdn net qq 43237769 article details 128010340 问题原因 xff1a CMake opencv时无法连接服务器 xff0c 导致下载 ffmpeg dll
  • 正态分布(Normal distribution)又名高斯分布(Gaussian distribution)

    正态分布 xff08 Normal distribution xff09 又名高斯分布 xff08 Gaussian distribution xff09 xff0c 是一个在数学 物理及工程等领域都非常重要的概率分布 xff0c 在统计学
  • OpenCV图像拼接和图像融合技术

    转自 xff1a https www cnblogs com skyfsm p 7411961 html 图像拼接在实际的应用场景很广 xff0c 比如无人机航拍 xff0c 遥感图像等等 xff0c 图像拼接是进一步做图像理解基础步骤 x
  • 如何将pandas.dataframe的数据写入到文件中

    导入实验常用的python包 如图2所示 import pandas as pd pandas用来做数据处理 import numpy as np numpy用来做高维度矩阵运算 import matplotlib pyplot as pl
  • 八度音阶和频率的关系

    转载 xff1a http www cnblogs com cute archive 2013 02 28 2937222 html 八度音阶和频率的关系 Frequency in hertz semitones above or belo
  • 解决MATLAB不能设置为.m文件默认打开方式

    转载 xff1a https blog csdn net yujiaerzong article details 77624167 1 将下面代码复制保存为 associateFiles m 文件 2 在MATLAB中运行 associat
  • python中的wx模块

    转载 xff1a http www cnblogs com fnng archive 2013 05 23 3094033 html wx包中的方法都是以大写字母开头的 xff0c 而这和Python的习惯是相反的 本节介绍如何创建pyth
  • Postman安装(汉化Postman)

    Postman安装 汉化Postman 一 下载Postman 下载地址 xff1a https www postman com downloads 二 下载汉化包 下载地址 xff1a https github com hlmd Post
  • linux下vscode调试C++

    linux下vscode调试C 43 43 1 在CMakelists中设置编译为Debug模式 xff0c 增加需要生成的可执行程序 set CMAKE BUILD TYPE DEBUG add executable hello main
  • char数组和指针问题

    这个问题是C 43 43 基础问题中相当折腾人的一个 xff0c 死记硬背解决不了根本问题 xff0c 记住还是要忘 xff0c 需要仔细研究其本质 这两种方式就是数组和指针的方式 xff1a span class hljs keyword
  • 找工作笔试面试那些事儿(13)---操作系统常考知识点总结

    上一节对数据库的知识做了一个小总结 xff0c 实际找工作过程中 xff0c 因为公司或单位侧重点不一样 xff0c 考察的知识也是不尽相同的 xff0c 但是作为计算机类的学生 xff0c 操作系统的知识也是必不可少的 xff0c 去年参
  • pnp算法

    pnp算法是解决什么问题的 xff1f PnP xff08 Perspective n Point xff09 是求解 3D 到 2D 点对运动的方法 它描述了当我们知道 n 个 3D 空间点以及它们的投影位置时 xff0c 如何估计相机所
  • Ubuntu 简单的视频剪辑方法

    视频剪辑主要分为两种 xff1a 1 纯粹的录屏 xff0c 不增加停顿 文字说明等 2 在关键位置停顿 xff0c 并配以文字说明 xff1b 针对第二种情况 xff0c 可以把要处理的视频保存成图片 xff0c 然后再利用opencv进
  • [cartographer] 9. proto配置文件读取

    目录 1 proto文件 2 lua配置文件 3 代码 1 xff09 读取lua文件 2 xff09 赋值给proto options 获取proto参数值有两种方式 xff1a 1 xff09 lua文件 2 xff09 通过servi