91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++?Cartographer怎么加載配置文件

發布時間:2023-03-17 09:46:51 來源:億速云 閱讀:181 作者:iii 欄目:開發技術

這篇文章主要介紹了C++ Cartographer怎么加載配置文件的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++ Cartographer怎么加載配置文件文章都會有所收獲,下面我們一起來看看吧。

在node_main.cc文件中,有如下代碼

  std::tie(node_options, trajectory_options) =
      LoadOptions(FLAGS_configuration_directory, FLAGS_configuration_basename);

std::tie作用是同時對多個變量賦值,但是只能個從元組tuple賦值,在node_options.cc中有如下定義:

std::tuple<NodeOptions, TrajectoryOptions> LoadOptions(
    const std::string& configuration_directory,
    const std::string& configuration_basename) {
  // 獲取配置文件所在的目錄
  auto file_resolver =
      absl::make_unique<cartographer::common::ConfigurationFileResolver>(std::vector<std::string>{configuration_directory});
  // 讀取配置文件內容到code中
  const std::string code =
      file_resolver->GetFileContentOrDie(configuration_basename);
  // 根據給定的字符串, 生成一個lua字典
  cartographer::common::LuaParameterDictionary lua_parameter_dictionary(
      code, std::move(file_resolver));
  // 創建元組tuple,元組定義了一個有固定數目元素的容器, 其中的每個元素類型都可以不相同
  // 將配置文件的內容填充進NodeOptions與TrajectoryOptions, 并返回
  return std::make_tuple(CreateNodeOptions(&lua_parameter_dictionary),
                         CreateTrajectoryOptions(&lua_parameter_dictionary));
}

這返回值為元組tuple.

ps:vector初始化:

要注意“()”和“{}”這樣的初始化情況,比如:

std::vector<int> nVec(10,1);    // 包含10個元素,且值為1

std::vector<int> nVec{10,1};    // 包含2個元素,值分別為10,1

CreateNodeOptions,是定義在node_options.h文件里的一個結構體,同理CreateTrajectoryOptions,里面的參數是由lua文件傳入的.

trajectoryoptions只在開始軌跡的時候用了,見node_main.cc

在trajectory_options.cc中有如下定義

void CheckTrajectoryOptions(const TrajectoryOptions& options) {
  CHECK_GE(options.num_subdivisions_per_laser_scan, 1);
  CHECK_GE(options.num_laser_scans + options.num_multi_echo_laser_scans +
               options.num_point_clouds,
           1)
      << "Configuration error: 'num_laser_scans', "
         "'num_multi_echo_laser_scans' and 'num_point_clouds' are "
         "all zero, but at least one is required.";
}

這個說明是要至少一個激光,或者激光+超聲雷達+點云的個數要>1才能運行程序

NodeOptions CreateNodeOptions(
    ::cartographer::common::LuaParameterDictionary* const
        lua_parameter_dictionary) {
  NodeOptions options;
  options.map_builder_options =
      ::cartographer::mapping::CreateMapBuilderOptions(
          lua_parameter_dictionary->GetDictionary("map_builder").get());
  options.map_frame = lua_parameter_dictionary->GetString("map_frame");
  options.lookup_transform_timeout_sec =
      lua_parameter_dictionary->GetDouble("lookup_transform_timeout_sec");
  options.submap_publish_period_sec =
      lua_parameter_dictionary->GetDouble("submap_publish_period_sec");
  options.pose_publish_period_sec =
      lua_parameter_dictionary->GetDouble("pose_publish_period_sec");
  options.trajectory_publish_period_sec =
      lua_parameter_dictionary->GetDouble("trajectory_publish_period_sec");
  if (lua_parameter_dictionary->HasKey("publish_to_tf")) {
    options.publish_to_tf =
        lua_parameter_dictionary->GetBool("publish_to_tf");
  }
  if (lua_parameter_dictionary->HasKey("publish_tracked_pose")) {
    options.publish_tracked_pose =
        lua_parameter_dictionary->GetBool("publish_tracked_pose");
  }
  if (lua_parameter_dictionary->HasKey("use_pose_extrapolator")) {
    options.use_pose_extrapolator =
        lua_parameter_dictionary->GetBool("use_pose_extrapolator");
  }
  return options;
}

上面的程序是根據lua字典中的參數, 生成protobuf的序列化數據結構, 結構體NodeOptions定義在頭文件中,其中有個元素為::cartographer::mapping::proto::MapBuilderOptions map_builder_options;是proto類型,在上述程序中的第一個參數被賦值

在node_options.cc有個類ConfigurationFileResolver,定義在configuration_file_resolver.h中,公有繼承來自FileResolver

class ConfigurationFileResolver : public FileResolver{
 public:
  // c++11: explicit關鍵字 的作用就是防止類構造函數的隱式自動轉換
  explicit ConfigurationFileResolver(
      const std::vector<std::string>& configuration_files_directories);
  std::string GetFullPathOrDie(const std::string& basename) override;
  std::string GetFileContentOrDie(const std::string& basename) override;
 private:
  std::vector<std::string> configuration_files_directories_;
};

FileResolver定義在lua_parameter_dictionary.h中:

class FileResolver {
 public:
  virtual ~FileResolver() {}
  virtual std::string GetFullPathOrDie(const std::string& basename) = 0;
  virtual std::string GetFileContentOrDie(const std::string& basename) = 0;
};

這個都是虛函數,只是個接口

cartographer經常有對接口類的繼承

ConfigurationFileResolver的構造函數在configuration_file_resolver.cc里面

ConfigurationFileResolver::ConfigurationFileResolver(
    const std::vector<std::string>& configuration_files_directories)
    : configuration_files_directories_(configuration_files_directories) {
  configuration_files_directories_.push_back(kConfigurationFilesDirectory);
}

這個函數有個初始化列表,可以看到最終傳入的參數是kConfigurationFilesDirectory,這個參數定義在config.h.這個文件里,這個文件是config.h.cmake編譯生成的,如下內容

namespace cartographer {
namespace common {
constexpr char kConfigurationFilesDirectory[] =
    "@CARTOGRAPHER_CONFIGURATION_FILES_DIRECTORY@";
constexpr char kSourceDirectory[] = "@PROJECT_SOURCE_DIR@";
}  // namespace common
}  // namespace cartographer

一個是定義工程配置文件的文件夾,一個是工程地址的目錄,在config.h中會生成匹配自己電腦的字符串地址.那么上面的ConfigurationFileResolver的構造函數就是為了傳入自己電腦的某些目錄地址..

GetFullPathOrDie:遍歷整個文件夾文件名看看能不能找到相應文件,如不能就報錯

GetFileContentOrDie的作用是看傳入的地址變量是不是空的,然后通過GetFullPathOrDie暴力查找是否在當前目錄中存在,然后讀取配置文件轉為string格式然后返回.

再回到node_options.cc中

接下來是讀取配置文件到code中,然后從code和之前讀取的file_resolver生成一個lua字典

lua是個類似cpp的程序語言,定義在lua_parameter_dictionary.cc中,不細說了

如果想自己通過lua文件寫入一些配置和參數,步驟如下

在自己寫的lua配置文件中寫入自己的參數,如th=1.1,

在想一下這個th是屬于node_options還是trajectory_options,如在node_options中,則在node_options.h中定義好自己的數據類型和初始值,如double th = 1.1;

然后在node_options.cc中寫入

  if (lua_parameter_dictionary->HasKey("th")) {
    options.th =
        lua_parameter_dictionary->GetDouble("th");
  }

關于“C++ Cartographer怎么加載配置文件”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++ Cartographer怎么加載配置文件”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宿州市| 亚东县| 东光县| 屏南县| 宜章县| 驻马店市| 大悟县| 盘山县| 元江| 大庆市| 大新县| 达尔| 朝阳市| 泸西县| 景宁| 祁连县| 马关县| 饶河县| 凌源市| 德惠市| 白山市| 姚安县| 仁化县| 青浦区| 临湘市| 漳浦县| 江山市| 龙岩市| 甘南县| 法库县| 岑巩县| 凤城市| 阿荣旗| 江华| 公安县| 兰溪市| 博野县| 安仁县| 同心县| 林州市| 商南县|