CartographerAdapter.cpp
Go to the documentation of this file.
1 #include "CartographerAdapter.h"
2 
3 // STL
4 #include <algorithm>
5 #include <cmath>
6 #include <cstdlib>
7 #include <ctime>
8 #include <filesystem>
9 #include <functional>
10 #include <iterator>
11 #include <memory>
12 #include <mutex>
13 #include <optional>
14 #include <stdexcept>
15 #include <string>
16 
17 // Eigen
18 #include <Eigen/Core>
19 #include <Eigen/Geometry>
20 
21 // Ice
22 #include <IceUtil/Time.h>
23 
24 // PCL
25 #include <pcl/common/transforms.h>
26 #include <pcl/io/pcd_io.h>
27 #include <pcl/point_cloud.h>
28 #include <pcl/point_types.h>
29 
30 // OpenCV
31 #include <opencv2/core/mat.hpp>
32 #include <opencv2/imgcodecs.hpp>
33 
34 // Simox
35 #include <SimoxUtility/json/json.hpp>
36 #include <SimoxUtility/math.h>
37 
38 // ArmarX
43 
44 // RobotComponents
46 
47 // cartographer (this has to come last!)
48 #include <cartographer/common/configuration_file_resolver.h>
49 #include <cartographer/common/time.h>
50 #include <cartographer/io/file_writer.h>
51 #include <cartographer/io/points_processor_pipeline_builder.h>
52 #include <cartographer/io/proto_stream.h>
53 #include <cartographer/mapping/2d/grid_2d.h>
54 #include <cartographer/mapping/2d/probability_grid.h>
55 #include <cartographer/mapping/2d/submap_2d.h>
56 #include <cartographer/mapping/internal/2d/tsdf_2d.h>
57 #include <cartographer/mapping/map_builder.h>
58 #include <cartographer/mapping/map_builder_interface.h>
59 #include <cartographer/mapping/submaps.h>
60 #include <cartographer/mapping/trajectory_builder_interface.h>
61 #include <cartographer/mapping/trajectory_node.h>
62 #include <cartographer/sensor/point_cloud.h>
63 #include <cartographer/sensor/rangefinder_point.h>
64 #include <cartographer/transform/rigid_transform.h>
65 #include <cartographer/transform/transform.h>
66 
67 // this library
68 #include "ApproximateTimeQueue.h"
69 #include "ArVizDrawer.h"
70 #include "types.h"
71 #include "grid_conversion.h"
72 
73 #include "util/eigen_conversions.h"
74 #include "util/pcl_conversions.h"
76 #include "util/laser_scanner_conversion.h"
77 
78 namespace carto = ::cartographer;
79 
80 constexpr int SCALE_M_TO_MM = 1000;
81 
82 namespace fs = ::std::filesystem;
83 
84 
85 std::string timestamp()
86 {
87  // http://www.cplusplus.com/reference/ctime/strftime/
88 
89  time_t rawtime{};
90  struct tm* timeinfo {};
91  std::array < char, 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 > buffer;
92 
93  time(&rawtime);
94  timeinfo = localtime(&rawtime);
95 
96  strftime(buffer.data(), buffer.size(), "%Y-%m-%d-%H-%M", timeinfo);
97 
98  std::string timestamp(buffer.data());
99  return timestamp;
100 }
101 
102 
103 
104 
105 namespace armarx::cartographer
106 {
107 
109  {
110  ARMARX_TRACE;
111 
112  ARMARX_INFO << "Finishing cartographer";
113  mapBuilder->FinishTrajectory(trajectoryId);
114 
115  ARMARX_INFO << "Releasing cartographer";
116  mapBuilder.reset();
117 
118  ARMARX_INFO << "Done";
119  }
120 
122  const std::filesystem::path& mapPath,
123  const std::filesystem::path& configPath,
124  SlamDataCallable& slamDataCallable,
125  const Config& config,
126  const std::optional<std::filesystem::path>& mapToLoad,
127  const std::optional<Eigen::Affine3f>& map_T_robot_prior)
128  : config(config), mapPath(mapPath), slamDataCallable(slamDataCallable)
129  {
130  const std::string mapBuilderLuaCode = R"text(
131  include "map_builder.lua"
132  return MAP_BUILDER)text";
133 
134  const std::string trajectoryBuilderLuaCode = R"text(
135  include "trajectory_builder.lua"
136  return TRAJECTORY_BUILDER)text";
137 
138  const auto mapBuilderParameters = cartographer::resolveLuaParameters(mapBuilderLuaCode, configPath);
139  const auto mapBuilderOptions =
140  carto::mapping::CreateMapBuilderOptions(mapBuilderParameters.get());
141 
142  const auto trajectoryBuilderParameters =
143  cartographer::resolveLuaParameters(trajectoryBuilderLuaCode, configPath);
144  trajectoryBuilderOptions =
145  carto::mapping::CreateTrajectoryBuilderOptions(trajectoryBuilderParameters.get());
146 
147  // create map builder
148  mapBuilder = carto::mapping::CreateMapBuilder(mapBuilderOptions);
149 
150  if (config.useLaserScanner)
151  {
152  sensorSet.insert(sensorIdLaser);
153  }
154 
155  if (config.useOdometry)
156  {
157  sensorSet.insert(sensorIdOdom);
158  }
159 
160  if (config.useImu)
161  {
162  sensorSet.insert(sensorIdIMU);
163  }
164 
165  std::vector<std::string> sensorSetNames;
166  std::transform(sensorSet.begin(),
167  sensorSet.end(),
168  std::back_inserter(sensorSetNames),
169  [](const auto & sensorId)
170  {
171  return sensorId.id;
172  });
173 
174  ARMARX_IMPORTANT << "Sensor set '" << sensorSetNames << "' will be used";
175  ARMARX_IMPORTANT << "This includes the following laser scanners: "
176  << std::vector<std::string>(config.laserScanners.begin(),
177  config.laserScanners.end());
178 
179  std::for_each(config.laserScanners.begin(),
180  config.laserScanners.end(),
181  [&](const auto & laserScannerName)
182  {
183  const SensorId sensorId{.type = SensorId::SensorType::RANGE,
184  .id = laserScannerName};
185  laserSensorMap.insert(
186  {
187  laserScannerName,
188  LaserScannerSensor(sensorId, Eigen::Affine3f::Identity())});
189  });
190 
191  if (mapToLoad)
192  {
193  ARMARX_DEBUG << "Loading map";
194  carto::io::ProtoStreamReader reader(mapToLoad->string());
195  mapBuilder->LoadState(&reader, true /* load_frozen_state */);
196  mapBuilder->pose_graph()->RunFinalOptimization();
197 
198 
199  if (map_T_robot_prior)
200  {
201  ARMARX_INFO << "Using pose prior " << std::endl << map_T_robot_prior->matrix();
202 
203  ::cartographer::mapping::proto::InitialTrajectoryPose* initial_trajectory_pose = new ::cartographer::mapping::proto::InitialTrajectoryPose;
204 
205  initial_trajectory_pose->set_allocated_relative_pose(new ::cartographer::transform::proto::Rigid3d(::cartographer::transform::ToProto(fromEigen(*map_T_robot_prior))));
206 
207  trajectoryBuilderOptions.set_allocated_initial_trajectory_pose(std::move(initial_trajectory_pose)); // owner -> trajectoryBuilderOptions
208  }
209 
210  }
211 
212 
213  trajectoryId = mapBuilder->AddTrajectoryBuilder(
214  sensorSet, trajectoryBuilderOptions, [ = ](auto&& ...args)
215  {
216  return getLocalSlamResultCallback(std::forward<decltype(args)>(args)...);
217  });
218 
219  // TODO(fabian.reister): variable sensor set
220  const auto dt = static_cast<int64_t>(1'000'000 / config.frequency);
221  const float dtHistoryLength = 1'000'000;
222 
223  ARMARX_IMPORTANT << "Frequency: " << config.frequency << ", dt: " << dt;
224 
225  approxTimeQueue = std::make_unique<ApproximateTimeQueue>(dt, dtHistoryLength, config.laserScanners, *this);
226  }
227 
228  void CartographerAdapter::onTimedDataAvailable(const TimedData& data)
229  {
230  pushInOdomData(data.odomPose);
231  pushInLaserData(data.laserData);
232  }
233 
234  void CartographerAdapter::pushInOdomData(const armarx::cartographer::PoseStamped& odomPose)
235  {
236 
237 
238  const auto& timestamp = odomPose.timestamp;
239  ARMARX_DEBUG << "New odom pose received " << timestamp;
240 
241  auto isOdomSensor = [](const SensorId & sensorId)
242  {
243  return sensorId.type == SensorId::SensorType::ODOMETRY;
244  };
245 
246  if (not std::any_of(sensorSet.begin(), sensorSet.end(), isOdomSensor))
247  {
248  ARMARX_DEBUG << deactivateSpam(2.) << "Odometry will not be used";
249  return;
250  }
251 
252  ARMARX_DEBUG << "Processing odom pose";
253 
254  const Eigen::Quaternionf q(odomPose.pose.linear());
255  const Eigen::Vector3f p = odomPose.pose.translation();
256 
257  carto::sensor::OdometryData odomData;
258  odomData.pose = carto::transform::Rigid3d::FromArrays(
259  std::array<double, 4> {q.w(), q.x(), q.y(), q.z()},
260  std::array<double, 3> {p.x(), p.y(), p.z()});
261  odomData.time = cartographer::toCarto(timestamp);
262 
263  ARMARX_DEBUG << "Will now insert odom data";
264 
265  {
266  std::lock_guard guard{cartoInsertMtx};
267  mapBuilder->GetTrajectoryBuilder(trajectoryId)
268  ->AddSensorData(sensorIdOdom.id, odomData);
269  }
270 
271  ARMARX_DEBUG << "Inserted odom data";
272  }
273 
274  void CartographerAdapter::pushInLaserData(const LaserMessages& laserMessages)
275  {
276 
277  carto::sensor::TimedPointCloudData timedPointCloudData;
278  timedPointCloudData.origin = Eigen::Vector3f::Zero();
279 
280  for (const auto& message : laserMessages)
281  {
282  const auto& data = message.data;
283 
284  // assumption: all points from single sensor
285  const LaserScannerSensor& sensor = lookupSensor(data.frame);
286 
287  ARMARX_DEBUG << "Sensor " << data.frame << " position is "
288  << sensor.pose.translation();
289 
290  const Eigen::Affine3f robot_T_sensor = sensor.pose; // [m]
291 
292  timedPointCloudData.time = cartographer::toCarto(data.timestamp); // universal is in 100ns
293  timedPointCloudData.ranges.reserve(timedPointCloudData.ranges.size() +
294  data.scan.size());
295 
296  ARMARX_DEBUG << "Laser range data: " << data.scan.size() << " points";
297 
298  std::transform(data.scan.begin(),
299  data.scan.end(),
300  std::back_inserter(timedPointCloudData.ranges),
301  [&](const auto & scanStep)
302  -> carto::sensor::TimedRangefinderPoint
303  {
304  auto rangePoint = toCartesian<Eigen::Vector3f>(scanStep); // [mm]
305  rangePoint /= 1000; // [m]
306 
307  carto::sensor::TimedRangefinderPoint point;
308  // point.position = robot_time_correction_T_sensor* rangePoint;
309  point.position = robot_T_sensor* rangePoint;
310  point.time = .0; // relative measurement time (not known)
311  return point;
312  });
313  }
314 
315  auto cloud = toPCL(timedPointCloudData.ranges);
316  slamDataCallable.onLaserSensorData({cartographer::fromCarto(timedPointCloudData.time), cloud});
317 
318  {
319  std::lock_guard guard{cartoInsertMtx};
320 
321  auto trajBuilder = mapBuilder->GetTrajectoryBuilder(trajectoryId);
322  if(not trajBuilder)
323  {
324  ARMARX_WARNING << "no traj builder";
325  return;
326  }
327 
328  trajBuilder->AddSensorData(sensorIdLaser.id, timedPointCloudData);
329  }
330 
331  ARMARX_DEBUG << "Inserted laser data";
332  }
333 
334  void CartographerAdapter::processOdometryPose(OdomData odom)
335  {
337 
338  odomPose.timestamp = odom.timestamp;
339  odomPose.pose.setIdentity();
340  odomPose.pose.translation() = odom.position;
341  odomPose.pose.linear() = odom.orientation.toRotationMatrix();
342 
343  approxTimeQueue->insertOdomData(std::move(odomPose));
344  }
345 
346  void CartographerAdapter::processSensorValues(LaserScannerMessage data)
347  {
348  ARMARX_DEBUG << "processing sensor values (intro)";
349 
350 
351 
352  auto isSensorRegistered = [&](const std::string & sensorId)
353  {
354  return std::any_of(
355  sensorSet.begin(), sensorSet.end(), [&sensorId](const SensorId & id) -> bool
356  {
357  return id.id == sensorId;
358  });
359  };
360 
361  if (false and not isSensorRegistered(data.frame))
362  {
363  ARMARX_WARNING << deactivateSpam(1.0) << "Sensor " << data.frame
364  << " not registered";
365  return;
366  }
367 
368  approxTimeQueue->insertLaserData(std::move(data));
369  }
370 
371 
372 
373 
374  void CartographerAdapter::getLocalSlamResultCallback(
375  const int trajectoryId,
377  const ::cartographer::transform::Rigid3d localPose,
378  ::cartographer::sensor::RangeData rangeDataInLocal,
379  const std::unique_ptr <
380  const ::cartographer::mapping::TrajectoryBuilderInterface::InsertionResult >
381  insertion_result)
382  {
383  // std::lock_guard g{cartoInsertMtx};
384 
385  ARMARX_DEBUG << "Callback (getLocalSlamResultCallback)";
386 
387 
388 // std::lock_guard g{cartoInsertMtx};
389 
390  // const auto constraints = mapBuilder->pose_graph()->constraints();
391  // ARMARX_DEBUG << "number of contraints: " << constraints.size();
392 
393  // const size_t nConstraintsInter = std::count_if(
394  // constraints.begin(),
395  // constraints.end(),
396  // [](const ::cartographer::mapping::PoseGraphInterface::Constraint & constraint)
397  // {
398  // return constraint.tag ==
399  // ::cartographer::mapping::PoseGraphInterface::Constraint::INTER_SUBMAP;
400  // });
401 
402  // ARMARX_DEBUG << "Inter submap constraints: " << nConstraintsInter;
403 
404  LocalSlamData localSlamData;
405 
406  const auto timestampInMicroSeconds = fromCarto(time);
407 
408  ARMARX_DEBUG << "local slam data timestamp: "
409  << IceUtil::Time::microSeconds(timestampInMicroSeconds);
410 
411  localSlamData.local_points = toPCL(rangeDataInLocal.returns.points());
412  localSlamData.misses = toPCL(rangeDataInLocal.misses.points());
413  localSlamData.local_pose = toEigen(localPose);
414  localSlamData.timestamp = timestampInMicroSeconds;
415  localSlamData.trajectory_pose =
416  toEigen(mapBuilder->pose_graph()->GetLocalToGlobalTransform(trajectoryId));
417 
418  ARMARX_DEBUG << "Callbacks will be triggered (getLocalSlamResultCallback)";
419 
420  slamDataCallable.onLocalSlamData(localSlamData);
421  // triggerCallbacks();
422 
423  ARMARX_DEBUG << "Callback done (getLocalSlamResultCallback)";
424  }
425 
426  // void CartographerAdapter::triggerCallbacks() const
427  // {
428  // // slamDataCallable.onGraphOptimized(optimizedGraphData());
429  // // slamDataCallable.onGridMap(submapData(trajectoryId));
430  // }
431 
432  bool CartographerAdapter::hasReceivedSensorData() const noexcept
433  {
434  std::lock_guard g{cartoInsertMtx};
435 
436  const auto trajectoryNodes = mapBuilder->pose_graph()->GetTrajectoryNodes();
437 
438  auto matchesTrajectoryId = [&](const auto & node) -> bool
439  {
440  return node.id.trajectory_id == trajectoryId;
441  };
442 
443  // checks if nodes wrt. trajectory_id exist
444  return std::any_of(trajectoryNodes.begin(), trajectoryNodes.end(), matchesTrajectoryId);
445  }
446 
447  bool storeDefaultRegistrationFile(const fs::path& jsonFile)
448  {
449  std::ofstream ofs(jsonFile, std::ios::out);
450 
451  ARMARX_CHECK(ofs.is_open());
452  ARMARX_CHECK(not ofs.fail());
453 
454  nlohmann::json data;
455  data["x"] = 0.F;
456  data["y"] = 0.F;
457  data["yaw"] = 0.F;
458 
459  ARMARX_INFO << "Creating dummy registration file `" << jsonFile << "`";
460  ofs << data;
461 
462  return true;
463  }
464 
465  bool CartographerAdapter::createMap()
466  {
467  const std::string filenameNoExtension = timestamp();
468 
469  const fs::path mapFilename = mapPath / (filenameNoExtension + ".carto");
470  ARMARX_DEBUG << "The concrete map file is " << mapFilename.string();
471  assert(!fs::exists(map_filename));
472 
473  // Create a new trajectory such that new data will not interfer with the map
474  // that we are optimizing. Therefore, keep track of the trajectory that we
475  // optimize.
476  const int trajectoryIdToBeOptimized = trajectoryId;
477 
478  std::lock_guard g{cartoInsertMtx};
479 
480  trajectoryId = mapBuilder->AddTrajectoryBuilder(
481  sensorSet, trajectoryBuilderOptions, [&](auto... args)
482  {
483  return getLocalSlamResultCallback(std::forward<decltype(args)>(args)...);
484  });
485 
486  ARMARX_IMPORTANT << "Optimizing map ...";
487  mapBuilder->FinishTrajectory(trajectoryIdToBeOptimized);
488  mapBuilder->pose_graph()->RunFinalOptimization();
489  ARMARX_IMPORTANT << "... done.";
490 
491  carto::io::ProtoStreamWriter writer(mapFilename);
492  mapBuilder->SerializeState(true, &writer);
493  writer.Close();
494 
495  ARMARX_IMPORTANT << "Saved map to '" << mapFilename << "'";
496 
497  const fs::path registrationFilename = mapPath / (filenameNoExtension + ".json");
498  ARMARX_INFO << "The default registration data will be stored in " << registrationFilename;
499  storeDefaultRegistrationFile(registrationFilename);
500 
501  // slamDataCallable.onGraphOptimized(optimizedGraphData());
502  // slamDataCallable.onGridMap(submapData(trajectoryIdToBeOptimized));
503 
504  return true;
505  }
506 
508  CartographerAdapter::lookupSensor(const std::string& device) const
509  {
510  return laserSensorMap.at(device);
511  }
512 
513  void CartographerAdapter::setSensorPose(const std::string& sensorId,
514  const Eigen::Affine3f& pose)
515  {
516  laserSensorMap.at(sensorId).pose = pose;
517  }
518 
519  std::vector<std::string> CartographerAdapter::laserSensorIds() const
520  {
521  return armarx::getMapKeys(laserSensorMap);
522  }
523 
524 } // namespace armarx::cartographer
armarx::cartographer::CartographerAdapter::Config::useLaserScanner
bool useLaserScanner
Definition: CartographerAdapter.h:67
ArVizDrawer.h
armarx::cartographer::LaserScannerSensorBase::pose
Eigen::Affine3f pose
Definition: types.h:142
interfaces.h
algorithm.h
cartographer_utils.h
armarx::cartographer::LaserScannerMessage
Definition: types.h:157
armarx::cartographer::LocalSlamData::timestamp
int64_t timestamp
Definition: types.h:47
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:183
SCALE_M_TO_MM
constexpr int SCALE_M_TO_MM
Definition: CartographerAdapter.cpp:80
armarx::cartographer::LocalSlamData::trajectory_pose
Eigen::Affine3f trajectory_pose
Definition: types.h:51
armarx::cartographer::LocalSlamData::misses
pcl::PointCloud< pcl::PointXYZ > misses
Definition: types.h:43
armarx::cartographer::CartographerAdapter::OdomData::orientation
Eigen::Quaternionf orientation
Definition: CartographerAdapter.h:95
trace.h
armarx::cartographer::TimedData::laserData
LaserMessages laserData
Definition: ApproximateTimeQueue.h:50
armarx::cartographer::LocalSlamData::local_pose
Eigen::Affine3f local_pose
Definition: types.h:46
armarx::cartographer::CartographerAdapter::LaserScannerSensor
Definition: CartographerAdapter.h:107
armarx::cartographer::CartographerAdapter::SensorId
::cartographer::mapping::TrajectoryBuilderInterface::SensorId SensorId
Definition: CartographerAdapter.h:104
armarx::cartographer::toCarto
::cartographer::common::Time toCarto(const int64_t &time)
Convert unix time in [µs] to cartographer time.
Definition: cartographer_utils.cpp:34
armarx::cartographer::TimedData
Definition: ApproximateTimeQueue.h:44
armarx::cartographer::CartographerAdapter::OdomData
Definition: CartographerAdapter.h:91
armarx::cartographer::CartographerAdapter::Config::useOdometry
bool useOdometry
Definition: CartographerAdapter.h:66
eigen_conversions.h
armarx::cartographer::LocalSlamData
Definition: types.h:40
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:80
armarx::cartographer
Definition: CartographerMappingAndLocalization.cpp:88
ApproximateTimeQueue.h
armarx::cartographer::PoseStamped::timestamp
int64_t timestamp
Definition: InterpolatingTimeQueue.h:47
armarx::cartographer::CartographerAdapter::OdomData::position
EIGEN_MAKE_ALIGNED_OPERATOR_NEW Eigen::Vector3f position
Definition: CartographerAdapter.h:94
deactivateSpam
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition: Logging.cpp:72
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:69
armarx::cartographer::storeDefaultRegistrationFile
bool storeDefaultRegistrationFile(const fs::path &jsonFile)
Definition: CartographerAdapter.cpp:447
message
message(STATUS "Boost-Library-Dir: " "${Boost_LIBRARY_DIRS}") message(STATUS "Boost-LIBRARIES
Definition: CMakeLists.txt:8
CartographerAdapter.h
armarx::toEigen
Eigen::Vector3f toEigen(const pcl::PointXYZ &pt)
Definition: PointToModelICP.h:66
armarx::cartographer::CartographerAdapter::Config::useImu
bool useImu
Definition: CartographerAdapter.h:68
armarx::cartographer::CartographerAdapter::Config
Definition: CartographerAdapter.h:64
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
armarx::cartographer::toPCL
pcl::PointXYZ toPCL(const Eigen::Vector3f &v)
Definition: MapRegistration.cpp:235
armarx::cartographer::TimedData::odomPose
armarx::cartographer::PoseStamped odomPose
Definition: ApproximateTimeQueue.h:48
timestamp
std::string timestamp()
Definition: CartographerAdapter.cpp:85
armarx::cartographer::CartographerAdapter::Config::laserScanners
std::set< std::string > laserScanners
Definition: CartographerAdapter.h:72
types.h
armarx::cartographer::fromEigen
::cartographer::transform::Rigid3d fromEigen(const Eigen::Affine3f &pose)
Definition: eigen_conversions.cpp:20
armarx::cartographer::LocalSlamData::local_points
pcl::PointCloud< pcl::PointXYZ > local_points
Definition: types.h:42
q
#define q
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
ExpressionException.h
grid_conversion.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:174
armarx::cartographer::SlamDataCallable
Definition: interfaces.h:29
armarx::Quaternion< float, 0 >
armarx::transform
auto transform(const Container< InputT, Alloc > &in, OutputT(*func)(InputT const &)) -> Container< OutputT, typename std::allocator_traits< Alloc >::template rebind_alloc< OutputT > >
Convenience function (with less typing) to transform a container of type InputT into the same contain...
Definition: algorithm.h:315
armarx::cartographer::CartographerAdapter::CartographerAdapter
CartographerAdapter(const std::filesystem::path &mapPath, const std::filesystem::path &configPath, SlamDataCallable &slamDataCallable, const Config &config, const std::optional< std::filesystem::path > &mapToLoad=std::nullopt, const std::optional< Eigen::Affine3f > &map_T_robot_prior=std::nullopt)
Definition: CartographerAdapter.cpp:121
armarx::cartographer::LaserMessages
std::vector< LaserMessage > LaserMessages
Definition: ApproximateTimeQueue.h:42
armarx::cartographer::CartographerAdapter::~CartographerAdapter
virtual ~CartographerAdapter()
Definition: CartographerAdapter.cpp:108
armarx::cartographer::PoseStamped::pose
Eigen::Affine3f pose
Definition: InterpolatingTimeQueue.h:46
Logging.h
armarx::cartographer::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
pcl_conversions.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
cartographer
Definition: CartographerMappingAndLocalization.h:56
armarx::cartographer::LaserScannerMessage::frame
std::string frame
Definition: types.h:159
armarx::cartographer::CartographerAdapter::OdomData::timestamp
int64_t timestamp
timestamp in [ms]
Definition: CartographerAdapter.h:98
armarx::cartographer::fromCarto
int64_t fromCarto(::cartographer::common::Time time)
Convert cartographer time to unix time in [µs].
Definition: cartographer_utils.cpp:22
armarx::getMapKeys
void getMapKeys(const MapType &map, OutputIteratorType it)
Definition: algorithm.h:157
dt
constexpr T dt
Definition: UnscentedKalmanFilterTest.cpp:42
armarx::cartographer::PoseStamped
Definition: InterpolatingTimeQueue.h:44