cartographer_utils.cpp
Go to the documentation of this file.
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
22 fromCarto(::cartographer::common::Time time)
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
34 ::cartographer::common::Time
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
int64_t fromCarto(::cartographer::common::Time time)
Convert cartographer time to unix time in [µs].
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.
::cartographer::common::Time toCarto(const int64_t &time)
Convert unix time in [µs] to cartographer time.
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.