aron_conversions.cpp
Go to the documentation of this file.
1#include "aron_conversions.h"
2
3#include <optional>
4
7
15
18#include <armarx/navigation/algorithms/aron/Costmap.aron.generated.h>
19#include <armarx/navigation/algorithms/aron/Costmap3D.aron.generated.h>
20#include <armarx/navigation/algorithms/aron/Room.aron.generated.h>
21#include <armarx/navigation/algorithms/aron/ShortestPathFasterAlgorithmParams.aron.generated.h>
27
29{
30
31 namespace
32 {
34 toAron(const Costmap::Grid& grid)
35 {
37 }
38
40 toAron(const std::optional<Costmap::Mask>& mask)
41 {
42 if (not mask.has_value())
43 {
44 return nullptr; // maybe other type?
45 }
46
48 }
49
50 inline Costmap::Mask
51 fronAron(const aron::data::NDArray& nav)
52 {
54 Costmap::Mask::value_type>(nav);
55 }
56
59 {
61 for (const auto& layer : bo)
62 {
63 list->addElement(toAron(layer));
64 }
65 return list;
66 }
67 } // namespace
68
70 toAron(const Costmap& bo)
71 {
72 arondto::Costmap dto;
73
74 dto.cellSize = bo.params().cellSize;
75 dto.robotRadius = bo.params().robotRadius;
76
77 dto.frame = armarx::GlobalFrame;
78
79 const Eigen::Isometry2f origin =
80 bo.origin() * Eigen::Translation2f{bo.getLocalSceneBounds().min};
81 dto.origin = navigation::conv::to3D(origin).matrix();
82
83 auto arn = dto.toAron();
84 arn->setElementCopy("mask", toAron(bo.getMask()));
85 arn->setElementCopy("grid", toAron(bo.getGrid()));
86
87 return arn;
88 }
89
90 Costmap
92 {
93 const auto aronDto = algorithms::arondto::Costmap::FromAron(dto);
94 ARMARX_DEBUG << dto->getAllKeys();
95
96 const Costmap::Parameters parameters{.binaryGrid = false,
97 .cellSize = aronDto.cellSize,
98 .robotRadius = aronDto.robotRadius};
99
100 ARMARX_DEBUG << "Converting grid";
101 const auto gridNavigator =
102 aron::data::NDArray::DynamicCast(dto->getElement("grid"));
103
104 ARMARX_CHECK_NOT_NULL(gridNavigator);
105
106 Costmap::Grid grid =
108 *gridNavigator);
109
110 ARMARX_DEBUG << "Converting mask";
111 std::optional<Costmap::Mask> mask;
112
113 if (const auto maskNavigator =
114 aron::data::NDArray::DynamicCast(dto->getElement("mask")))
115 {
117 Costmap::Mask::value_type>(*maskNavigator);
118 }
119
120 const SceneBounds sceneBounds{
121 .min = Eigen::Vector2f::Zero(),
122 .max = Eigen::Vector2f{grid.rows() * aronDto.cellSize, grid.cols() * aronDto.cellSize}};
123
124 const core::Pose2D origin = navigation::conv::to2D(Eigen::Isometry3f{aronDto.origin});
125
126 return {grid, parameters, sceneBounds, mask, origin};
127 }
128
129 Costmap
130 fromAron(const armem::wm::EntityInstance& entityInstance)
131 {
132 const auto aronDto = armem::tryCast<algorithms::arondto::Costmap>(entityInstance);
133 ARMARX_CHECK(aronDto) << "Failed casting to Costmap";
134 const auto& dto = *aronDto;
135
136 ARMARX_DEBUG << entityInstance.data()->getAllKeys();
137
138 const Costmap::Parameters parameters{.binaryGrid = false,
139 .cellSize = dto.cellSize,
140 .robotRadius = dto.robotRadius};
141
142 ARMARX_DEBUG << "Converting grid";
143 const auto gridNavigator =
144 aron::data::NDArray::DynamicCast(entityInstance.data()->getElement("grid"));
145
146 ARMARX_CHECK_NOT_NULL(gridNavigator);
147
148 Costmap::Grid grid =
150 *gridNavigator);
151
152 ARMARX_DEBUG << "Converting mask";
153 std::optional<Costmap::Mask> mask;
154
155 if (const auto maskNavigator =
156 aron::data::NDArray::DynamicCast(entityInstance.data()->getElement("mask")))
157 {
159 Costmap::Mask::value_type>(*maskNavigator);
160 }
161
162 const SceneBounds sceneBounds{
163 .min = Eigen::Vector2f::Zero(),
164 .max = Eigen::Vector2f{grid.rows() * dto.cellSize, grid.cols() * dto.cellSize}};
165
166 const core::Pose2D origin = navigation::conv::to2D(Eigen::Isometry3f{dto.origin});
167
168 return {grid, parameters, sceneBounds, mask, origin};
169 }
170
173 {
174 orientation_aware::arondto::Costmap3D dto;
175
176 dto.cellSize = bo.params().cellSize;
177 dto.orientations = bo.params().orientations;
178
179 dto.rootNode = bo.params().robotModel.rootNode;
180 dto.robotModelPackage = bo.params().robotModel.packageName;
181 dto.robotModelPath = bo.params().robotModel.relativePath;
182
183 dto.frame = armarx::GlobalFrame;
184
185 const Eigen::Isometry2f origin =
186 bo.origin() * Eigen::Translation2f{bo.getLocalSceneBounds().min};
187 dto.origin = navigation::conv::to3D(origin).matrix();
188
189 auto arn = dto.toAron();
190 arn->setElementCopy("mask", toAron(bo.getMask()));
191 arn->setElementCopy("grid", toAron(bo.getGrid()));
192
193 return arn;
194 }
195
196 orientation_aware::Costmap3D
198 {
199 const auto aronDto =
201 ARMARX_CHECK(aronDto) << "Failed casting to Costmap3D";
202 const auto& dto = *aronDto;
203
204 ARMARX_DEBUG << entityInstance.data()->getAllKeys();
205
207 .binaryGrid = false,
208 .cellSize = dto.cellSize,
209 .orientations = dto.orientations,
210 .robotModel = {.rootNode = dto.rootNode,
211 .packageName = dto.robotModelPackage,
212 .relativePath = dto.robotModelPath}};
213
214 ARMARX_DEBUG << "Converting grid";
216 const auto gridNavigator =
217 aron::data::List::DynamicCast(entityInstance.data()->getElement("grid"));
218 const auto layerNavigators = gridNavigator->getElements();
219 for (const auto& layerNavigator : layerNavigators)
220 {
221 const auto ndArrayNavigator = aron::data::NDArray::DynamicCast(layerNavigator);
222 ARMARX_CHECK_NOT_NULL(ndArrayNavigator);
223 grid.emplace_back(
225 orientation_aware::Costmap3D::Grid::value_type::value_type>(*ndArrayNavigator));
226 }
227
228 ARMARX_DEBUG << "Converting mask";
229 std::optional<Costmap::Mask> mask;
230
231 if (const auto maskNavigator =
232 aron::data::NDArray::DynamicCast(entityInstance.data()->getElement("mask")))
233 {
235 Costmap::Mask::value_type>(*maskNavigator);
236 }
237
238 const SceneBounds sceneBounds{
239 .min = Eigen::Vector2f::Zero(),
240 .max = Eigen::Vector2f{grid[0].rows() * dto.cellSize, grid[0].cols() * dto.cellSize}};
241
242 const core::Pose2D origin = navigation::conv::to2D(Eigen::Isometry3f{dto.origin});
243
244 return {grid, parameters, sceneBounds, mask, origin};
245 }
246
247 void
248 toAron(arondto::ShortestPathFasterAlgorithmParams& dto,
250 {
251 dto.obstacleDistanceCosts = bo.obstacleDistanceCosts;
252 dto.obstacleMaxDistance = bo.obstacleMaxDistance;
253 dto.obstacleDistanceWeight = bo.obstacleDistanceWeight;
254 dto.obstacleCostExponent = bo.obstacleCostExponent;
255 }
256
257 void
258 fromAron(const arondto::ShortestPathFasterAlgorithmParams& dto,
260 {
261 bo.obstacleDistanceCosts = dto.obstacleDistanceCosts;
262 bo.obstacleMaxDistance = dto.obstacleMaxDistance;
263 bo.obstacleDistanceWeight = dto.obstacleDistanceWeight;
264 bo.obstacleCostExponent = dto.obstacleCostExponent;
265 }
266
267 void
268 toAron(arondto::Room& dto, const Room& bo)
269 {
270 dto.height = bo.height;
271 dto.name = bo.name;
272 dto.zFloor = bo.zFloor;
273 dto.polygon = conv::to3D(bo.polygon);
274 }
275
276 void
277 fromAron(const arondto::Room& dto, Room& bo)
278 {
279 bo.height = dto.height;
280 bo.name = dto.name;
281 bo.zFloor = dto.zFloor;
282 bo.polygon = conv::to2D(dto.polygon);
283 }
284
285
286} // namespace armarx::navigation::algorithms
Client-side working entity instance.
static Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > ConvertToDynamicMatrix(const data::NDArray &nav)
static data::NDArrayPtr ConvertFromMatrix(const Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic > &mat)
const core::Pose2D & origin() const
Definition Costmap.h:171
const SceneBounds & getLocalSceneBounds() const noexcept
Definition Costmap.cpp:165
const Parameters & params() const noexcept
Definition Costmap.cpp:302
Eigen::Matrix< bool, Eigen::Dynamic, Eigen::Dynamic > Mask
Definition Costmap.h:60
const std::optional< Mask > & getMask() const noexcept
Definition Costmap.cpp:529
const SceneBounds & getLocalSceneBounds() const noexcept
const std::optional< Mask > & getMask() const noexcept
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
Definition Logging.h:184
std::string const GlobalFrame
Variable of the global coordinate system.
Definition FramedPose.h:65
std::optional< AronClass > tryCast(const wm::EntityInstance &item)
Tries to cast a armem::EntityInstance to AronClass.
Definition util.h:45
std::shared_ptr< Dict > DictPtr
Definition Dict.h:42
std::shared_ptr< List > ListPtr
Definition List.h:41
std::shared_ptr< NDArray > NDArrayPtr
Definition NDArray.h:46
This file is part of ArmarX.
armarx::aron::data::DictPtr toAron(const Costmap &bo)
Costmap costmapFromAron(const aron::data::DictPtr &dto)
Costmap fromAron(const armem::wm::EntityInstance &entityInstance)
orientation_aware::Costmap3D costmap3dFromAron(const armem::wm::EntityInstance &entityInstance)
std::vector< Eigen::Vector2f > to2D(const std::vector< Eigen::Vector3f > &v)
Definition eigen.cpp:29
std::vector< Eigen::Vector3f > to3D(const std::vector< Eigen::Vector2f > &v)
Definition eigen.cpp:14
Eigen::Isometry2f Pose2D
Definition basic_types.h:34
float cellSize
How big each cell is in the uniform grid.
Definition Costmap.h:31
std::vector< Eigen::Vector2f > polygon
Definition Room.h:37
int orientations
How many orientations of the robot each cell contains.
Definition Costmap3D.h:38
float cellSize
How big each cell is in the uniform grid.
Definition Costmap3D.h:35
struct armarx::navigation::algorithms::orientation_aware::Costmap3D::Parameters::RobotModel robotModel