cartographer_utils.cpp
Go to the documentation of this file.
1 #include "cartographer_utils.h"
2 
3 #include <cartographer/common/configuration_file_resolver.h>
4 #include <cartographer/io/proto_stream.h>
5 #include <cartographer/mapping/map_builder.h>
6 
8 {
9 
10  std::unique_ptr<::cartographer::common::LuaParameterDictionary>
11  resolveLuaParameters(const std::string& luaCode, const std::filesystem::path& configPath)
12  {
13  assert(fs::is_directory(configPath));
14 
15  auto fileResolver = std::make_unique<::cartographer::common::ConfigurationFileResolver>(
16  std::vector<std::string>{configPath.string()});
17  return std::make_unique<::cartographer::common::LuaParameterDictionary>(
18  luaCode, std::move(fileResolver));
19  }
20 
21  int64_t
23  {
24  const int64_t utsTimestamp = ::cartographer::common::ToUniversal(time);
25 
26  int64_t usSinceUnixEpoch =
27  (utsTimestamp -
28  ::cartographer::common::kUtsEpochOffsetFromUnixEpochInSeconds * 10'000'000ll) /
29  10;
30 
31  return usSinceUnixEpoch; // [µs]
32  }
33 
35  toCarto(const int64_t& time)
36  {
37  // The epoch of the ICU Universal Time Scale is "0001-01-01 00:00:00.0 +0000",
38  // exactly 719162 days before the Unix epoch.
39  return ::cartographer::common::FromUniversal(
40  ::cartographer::common::kUtsEpochOffsetFromUnixEpochInSeconds * 10'000'000ll +
41  time * 10);
42  }
43 
44  std::unique_ptr<::cartographer::mapping::MapBuilderInterface>
45  loadMap(const std::filesystem::path& mapPath, const std::filesystem::path& configPath)
46  {
47  // namespace fs = std::filesystem;
48 
49  // ARMARX_CHECK(fs::is_regular_file(mapPath));
50  // ARMARX_CHECK(fs::is_directory(configPath));
51 
52  const std::string mapBuilderLuaCode = R"text(
53  include "map_builder.lua"
54  return MAP_BUILDER)text";
55 
56  const auto mapBuilderParameters = resolveLuaParameters(mapBuilderLuaCode, configPath);
57  const auto mapBuilderOptions =
58  ::cartographer::mapping::CreateMapBuilderOptions(mapBuilderParameters.get());
59 
60  std::unique_ptr<::cartographer::mapping::MapBuilderInterface> mapBuilder =
61  ::cartographer::mapping::CreateMapBuilder(mapBuilderOptions);
62 
63  ::cartographer::io::ProtoStreamReader reader(mapPath.string());
64  mapBuilder->LoadState(&reader, true);
65  mapBuilder->pose_graph()->RunFinalOptimization();
66 
67  return mapBuilder;
68  }
69 
70 
71 } // namespace armarx::localization_and_mapping::cartographer_adapter::util
armarx::localization_and_mapping::cartographer_adapter::util::fromCarto
int64_t fromCarto(::cartographer::common::Time time)
Convert cartographer time to unix time in [µs].
Definition: cartographer_utils.cpp:22
cartographer_utils.h
armarx::localization_and_mapping::cartographer_adapter::util::loadMap
std::unique_ptr<::cartographer::mapping::MapBuilderInterface > loadMap(const std::filesystem::path &mapPath, const std::filesystem::path &configPath)
Creates a map builder object from a stored map.
Definition: cartographer_utils.cpp:45
armarx::localization_and_mapping::cartographer_adapter::util::resolveLuaParameters
std::unique_ptr<::cartographer::common::LuaParameterDictionary > resolveLuaParameters(const std::string &luaCode, const std::filesystem::path &configPath)
Helper function to create Lua parameter object from string.
Definition: cartographer_utils.cpp:11
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
armarx::localization_and_mapping::cartographer_adapter::util
Definition: cartographer_utils.cpp:7
armarx::localization_and_mapping::cartographer_adapter::util::toCarto
::cartographer::common::Time toCarto(const int64_t &time)
Convert unix time in [µs] to cartographer time.
Definition: cartographer_utils.cpp:35