CostmapBuilder.cpp
Go to the documentation of this file.
1 /**
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @author Fabian Reister ( fabian dot reister at kit dot edu )
17  * @date 2022
18  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
19  * GNU General Public License
20  */
21 
22 #include "CostmapBuilder.h"
23 
24 #include <cstddef>
25 
26 #include <VirtualRobot/CollisionDetection/CollisionChecker.h>
27 #include <VirtualRobot/Robot.h>
28 #include <VirtualRobot/SceneObjectSet.h>
29 
33 
38 
40 {
41 
42 
44  const VirtualRobot::SceneObjectSetPtr& obstacles,
45  const Costmap::Parameters& parameters,
46  const std::string& robotCollisonModelName) :
47  robot(robot),
48  obstacles(obstacles),
49  parameters(parameters),
50  robotCollisionModelName(robotCollisonModelName)
51  {
52  ARMARX_CHECK_NOT_NULL(robot) << "Robot must be set";
53  ARMARX_CHECK_NOT_NULL(obstacles);
54  ARMARX_CHECK(robot->hasRobotNode(robotCollisionModelName));
55  }
56 
57  Costmap
59  {
60 
61  const auto sceneBounds = computeSceneBounds(obstacles, init);
62  const auto grid = createUniformGrid(sceneBounds, parameters);
63 
64  ARMARX_VERBOSE << "Creating grid";
65  Costmap costmap(grid, parameters, sceneBounds);
66 
67  ARMARX_VERBOSE << "Filling grid with size (" << costmap.getGrid().rows() << "/"
68  << costmap.getGrid().cols() << ")";
69  fillGridCosts(costmap);
70  ARMARX_VERBOSE << "Filled grid";
71 
72  initializeMask(costmap);
73  ARMARX_VERBOSE << "Initialized mask";
74 
75  return costmap;
76  }
77 
78  void
79  CostmapBuilder::initializeMask(Costmap& costmap)
80  {
81  costmap.mask = costmap.grid.array() > 0.F;
82 
83  ARMARX_VERBOSE << "Initializing mask: Fraction of valid elements: "
84  << costmap.mask->cast<float>().sum() / costmap.mask->size();
85  }
86 
87  Eigen::MatrixXf
89  const Costmap::Parameters& parameters)
90  {
92 
93  ARMARX_VERBOSE << "Scene bounds are " << sceneBounds.min << " and " << sceneBounds.max;
94 
95  //+1 for explicit rounding up
96  size_t c_x = (sceneBounds.max.x() - sceneBounds.min.x()) / parameters.cellSize + 1;
97  size_t c_y = (sceneBounds.max.y() - sceneBounds.min.y()) / parameters.cellSize + 1;
98 
99  ARMARX_VERBOSE << "Grid size: " << c_x << ", " << c_y;
100 
101  ARMARX_VERBOSE << "Resetting grid";
102  Eigen::MatrixXf grid(c_x, c_y);
103  grid.setZero();
104 
105  return grid;
106  }
107 
108 
109  float
110  CostmapBuilder::computeCost(const Costmap::Position& position,
111  VirtualRobot::RobotPtr& collisionRobot,
112  const VirtualRobot::CollisionModelPtr& robotCollisionModel)
113  {
114  ARMARX_TRACE;
115  ARMARX_CHECK_NOT_NULL(collisionRobot);
116  ARMARX_CHECK_NOT_NULL(robotCollisionModel);
117  ARMARX_CHECK_NOT_NULL(VirtualRobot::CollisionChecker::getGlobalCollisionChecker());
118  ARMARX_CHECK_NOT_NULL(obstacles);
119  ARMARX_CHECK_GREATER(obstacles->getSize(), 0);
120 
121  const core::Pose globalPose(Eigen::Translation3f(conv::to3D(position)));
122  collisionRobot->setGlobalPose(globalPose.matrix());
123 
124  const float distance =
125  VirtualRobot::CollisionChecker::getGlobalCollisionChecker()->calculateDistance(
126  robotCollisionModel, obstacles);
127 
128  return distance;
129 
130 
131  // Eigen::Vector3f P1;
132  // Eigen::Vector3f P2;
133  // int id1, id2;
134 
135  // float minDistance = std::numeric_limits<float>::max();
136 
137  // // TODO omp...
138  // for (size_t i = 0; i < obstacles->getSize(); i++)
139  // {
140  // // cheap collision check
141  // // VirtualRobot::BoundingBox obstacleBbox =
142  // // obstacles->getSceneObject(i)->getCollisionModel()->getBoundingBox(true);
143  // // if (not intersects(robotBbox, obstacleBbox))
144  // // {
145  // // continue;
146  // // }
147 
148  // // precise collision check
149  // const float dist =
150  // VirtualRobot::CollisionChecker::getGlobalCollisionChecker()->calculateDistance(
151  // robotCollisionModel,
152  // obstacles->getSceneObject(i)->getCollisionModel(),
153  // P1,
154  // P2,
155  // &id1,
156  // &id2);
157 
158  // // check if objects collide
159  // if ((dist <= parameters.cellSize / 2) or
160  // VirtualRobot::CollisionChecker::getGlobalCollisionChecker()->checkCollision(
161  // robotCollisionModel, obstacles->getSceneObject(i)->getCollisionModel()))
162  // {
163  // minDistance = 0;
164  // break;
165  // }
166 
167  // minDistance = std::min(minDistance, dist);
168  // }
169  // // return n->position.x() >= sceneBounds.min.x() && n->position.x() <= sceneBounds.max.x() &&
170  // // n->position.y() >= sceneBounds.min.y() && n->position.y() <= sceneBounds.max.y();
171 
172  // return minDistance;
173  }
174 
175 
176  void
177  CostmapBuilder::fillGridCosts(Costmap& costmap)
178  {
179 
180  VirtualRobot::RobotPtr collisionRobot;
181  VirtualRobot::CollisionModelPtr robotCollisionModel;
182 
183  const std::size_t c_x = costmap.grid.rows();
184  const std::size_t c_y = costmap.grid.cols();
185 
186  robot->setUpdateVisualization(false);
187 
188 #pragma omp parallel for schedule(static) private(collisionRobot, \
189  robotCollisionModel) default(shared)
190  for (unsigned int x = 0; x < c_x; x++)
191  {
192  // initialize if needed
193  if (collisionRobot == nullptr)
194  {
195 #pragma omp critical
196  {
197  ARMARX_DEBUG << "Copying robot";
198  ARMARX_CHECK_NOT_NULL(robot);
199  collisionRobot =
200  robot->clone("collision_robot_" + std::to_string(omp_get_thread_num()));
201 
202  // replace the standard collision model by our custom one
203  collisionRobot->setPrimitiveApproximationModel({"navigation"},false);
204 
205  collisionRobot->setUpdateVisualization(false);
206  ARMARX_DEBUG << "Copying done";
207  }
208 
209  ARMARX_CHECK_NOT_NULL(collisionRobot);
210  ARMARX_CHECK(collisionRobot->hasRobotNode(robotCollisionModelName));
211 
212  ARMARX_CHECK(collisionRobot);
213  const auto collisionRobotNode =
214  collisionRobot->getRobotNode(robotCollisionModelName);
215  ARMARX_CHECK_NOT_NULL(collisionRobotNode);
216 
217  robotCollisionModel = collisionRobotNode->getCollisionModel();
218  ARMARX_CHECK(robotCollisionModel) << "Collision model not available. "
219  "Make sure that you load the robot correctly!";
220  }
221 
222  ARMARX_CHECK_NOT_NULL(collisionRobot);
223  ARMARX_CHECK_NOT_NULL(robotCollisionModel);
224 
225  for (unsigned int y = 0; y < c_y; y++)
226  {
227  const Costmap::Index index{x, y};
228  const Costmap::Position position = costmap.toPositionGlobal(index);
229 
230  costmap.grid(x, y) = computeCost(position, collisionRobot, robotCollisionModel);
231  }
232  }
233  }
234 
235 
236 } // namespace armarx::navigation::algorithms
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:180
armarx::navigation::algorithms::Costmap::Index
Eigen::Array2i Index
Definition: Costmap.h:44
armarx::navigation::core::Pose
Eigen::Isometry3f Pose
Definition: basic_types.h:31
util.h
index
uint8_t index
Definition: EtherCATFrame.h:59
basic_types.h
CostmapBuilder.h
ARMARX_CHECK_NOT_NULL
#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...
Definition: ExpressionException.h:206
ARMARX_CHECK_GREATER
#define ARMARX_CHECK_GREATER(lhs, rhs)
This macro evaluates whether lhs is greater (>) than rhs and if it turns out to be false it will thro...
Definition: ExpressionException.h:116
trace.h
armarx::navigation::algorithms
This file is part of ArmarX.
Definition: aron_conversions.cpp:13
armarx::navigation::algorithms::CostmapBuilder::createUniformGrid
static Eigen::MatrixXf createUniformGrid(const SceneBounds &sceneBounds, const Costmap::Parameters &parameters)
Definition: CostmapBuilder.cpp:88
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:69
armarx::navigation::algorithms::CostmapBuilder::CostmapBuilder
CostmapBuilder(const VirtualRobot::RobotPtr &robot, const VirtualRobot::SceneObjectSetPtr &obstacles, const Costmap::Parameters &parameters, const std::string &robotCollisonModelName)
Definition: CostmapBuilder.cpp:43
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
armarx::navigation::algorithms::Costmap::getGrid
const Grid & getGrid() const
Definition: Costmap.cpp:236
armarx::navigation::algorithms::computeSceneBounds
SceneBounds computeSceneBounds(const VirtualRobot::SceneObjectSetPtr &obstacles, const SceneBounds &init)
Definition: util.cpp:54
armarx::navigation::algorithms::Costmap::Position
Eigen::Vector2f Position
Definition: Costmap.h:45
armarx::navigation::algorithms::SceneBounds
Definition: types.h:29
armarx::to_string
const std::string & to_string(const std::string &s)
Definition: StringHelpers.h:40
ExpressionException.h
armarx::navigation::algorithms::SceneBounds::min
Eigen::Vector2f min
Definition: types.h:31
armarx::navigation::algorithms::CostmapBuilder::create
Costmap create(const SceneBounds &init=SceneBounds())
Definition: CostmapBuilder.cpp:58
armarx::navigation::algorithms::Costmap::Parameters::cellSize
float cellSize
How big each cell is in the uniform grid.
Definition: Costmap.h:27
armarx::navigation::conv::to3D
std::vector< Eigen::Vector3f > to3D(const std::vector< Eigen::Vector2f > &v)
Definition: eigen.cpp:11
armarx::navigation::algorithms::Costmap::Parameters
Definition: Costmap.h:21
distance
double distance(const Point &a, const Point &b)
Definition: point.hpp:88
eigen.h
Logging.h
types.h
armarx::navigation::algorithms::SceneBounds::max
Eigen::Vector2f max
Definition: types.h:32
armarx::navigation::algorithms::Costmap
Definition: Costmap.h:13
VirtualRobot::RobotPtr
std::shared_ptr< class Robot > RobotPtr
Definition: Bus.h:18