CostmapBuilder.h
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#pragma once
23
24#include <functional>
25#include <optional>
26#include <string>
27#include <variant>
28#include <vector>
29
30#include <Eigen/Core>
31
32#include <SimoxUtility/meta/enum/EnumNames.hpp>
33#include <VirtualRobot/VirtualRobot.h>
34
38
39#if COSTMAP_BUILDER_SIMOX_CONTROL
40#include <simox/control/environment/CollisionRobot.h>
41#include <simox/control/robot/RobotInterface.h>
42
43#include <hpp/fcl/broadphase/broadphase_collision_manager.h>
44#endif
45
47{
48
50 {
51 public:
57 const static simox::meta::EnumNames<DistanceCalculator> DistanceCalculatorNames;
58
60 {
62 int numThreads = 0; // 0 to let OpenMP decide how many threads to use
63
64 bool restrictToRooms = false;
65 /*!
66 * Only applicable when restrictToRooms is true.
67 * The list of rooms for which the costmap should be generated, leave empty to
68 * include all rooms.
69 */
70 std::vector<std::string> roomEnableList;
71
72 /*!
73 * The maximum distance from the costmap to an obstacle to be included for costmap
74 * calculation. Every obstacles further away will be discarded.
75 */
76 float maxFilterDistance = 1000.F;
77
78 Eigen::Vector3f collisionModelScaleFactor = Eigen::Vector3f::Ones();
79
80 /// All poses that are further away to obstacles are set to this value
81 float maxDistance = 2000.F;
82
83 bool fakeModeForTesting = false;
84 };
85
87 const VirtualRobot::SceneObjectSetPtr& obstacles,
88 const std::vector<VirtualRobot::RobotPtr>& articulatedObjects,
89 const std::vector<Room>& rooms,
90 const Costmap::Parameters& parameters,
91 const std::string& robotCollisonModelName,
92 const CostmapBuilderParams& builderParameters);
93
94 Costmap create(const SceneBounds& init = SceneBounds());
96
97
98 static Eigen::MatrixXf createUniformGrid(const SceneBounds& sceneBounds,
99 const Costmap::Parameters& parameters);
100
101
102 static void updateMask(Costmap& costmap);
103
104 private:
105#if COSTMAP_BUILDER_SIMOX_CONTROL
106 struct CollisionSetupSC
107 {
108 std::unique_ptr<simox::control::robot::RobotInterface> robot;
109 std::unique_ptr<simox::control::environment::CollisionRobot<hpp::fcl::OBBRSS>>
110 collisionRobot;
111 std::vector<
112 std::unique_ptr<simox::control::environment::CollisionRobot<hpp::fcl::OBBRSS>>>
113 colObjects;
114 std::unique_ptr<hpp::fcl::BroadPhaseCollisionManager> obstacleCollisionManager;
115
116 // we must keep track of those intermediate robots to avoid them being destroyed
117 std::vector<std::unique_ptr<simox::control::robot::RobotInterface>> scObstacles;
118 };
119#else
120 struct CollisionSetupSC
121 {
122 // not supported without SimoxControl
123 };
124#endif
125 struct CollisionSetupSx
126 {
127 VirtualRobot::RobotPtr collisionRobot;
128 VirtualRobot::CollisionModelPtr robotCollisionModel;
129 VirtualRobot::SceneObjectSetPtr filteredObstacles;
130 };
131
132 using CollisionSetup = std::variant<std::monostate, CollisionSetupSC, CollisionSetupSx>;
133
134 float computeCost(const Costmap::Position& position,
135 const CollisionSetup& collisionSetupVariant);
136
137 void fillGridCosts(Costmap& costmap);
138 void extendGridCosts(Costmap& costmap);
139
140 // fn: collisionRobot, robotCollisionModel, mask, costs, index -> costs
141 // expects mask calculation based on costs after this function
142 void applyFnToCostmap(Costmap& costmap,
143 const std::function<float(const CollisionSetup& collisionSetup,
144 const std::optional<float>,
145 const float,
146 const Costmap::Index&)>& fn);
147
148 VirtualRobot::SceneObjectSetPtr filterObjectsForCostmap(const Costmap& costmap);
149
150 void initializeEmptyMask(Costmap& costmap);
151
152 const VirtualRobot::RobotPtr robot;
153 const VirtualRobot::SceneObjectSetPtr obstacles;
154 const std::vector<VirtualRobot::RobotPtr> articulatedObjects;
155 std::vector<Room> rooms;
156 const Costmap::Parameters parameters;
157 const std::string robotCollisionModelName;
158
159 const CostmapBuilderParams builderParameters;
160 };
161
162} // namespace armarx::navigation::algorithms
static const simox::meta::EnumNames< DistanceCalculator > DistanceCalculatorNames
static Eigen::MatrixXf createUniformGrid(const SceneBounds &sceneBounds, const Costmap::Parameters &parameters)
CostmapBuilder(const VirtualRobot::RobotPtr &robot, const VirtualRobot::SceneObjectSetPtr &obstacles, const std::vector< VirtualRobot::RobotPtr > &articulatedObjects, const std::vector< Room > &rooms, const Costmap::Parameters &parameters, const std::string &robotCollisonModelName, const CostmapBuilderParams &builderParameters)
Costmap create(const SceneBounds &init=SceneBounds())
Brief description of class rooms.
Definition rooms.h:39
std::shared_ptr< class Robot > RobotPtr
Definition Bus.h:19
This file is part of ArmarX.
float maxDistance
All poses that are further away to obstacles are set to this value.