CollisionModelHelper.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 * @package RobotAPI
17 * @author Christoph Pohl ( christoph dot pohl at kit dot edu )
18 * @date 17.02.23
19 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20 * GNU General Public License
21 */
22
24
25#include <VirtualRobot/CollisionDetection/CollisionModel.h>
26#include <VirtualRobot/ManipulationObject.h>
27#include <VirtualRobot/SceneObjectSet.h>
28#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h>
29#include <VirtualRobot/Visualization/TriMeshModel.h>
30
32
34
36{
37
38 VirtualRobot::ManipulationObjectPtr
40 {
41 const ObjectFinder finder;
42
43 const VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet);
44 if (auto obstacle = finder.loadManipulationObject(objectPose))
45 {
46 obstacle->setGlobalPose(objectPose.objectPoseGlobal);
47 return obstacle;
48 }
49
50 ARMARX_WARNING << "Failed to load scene object `" << objectPose.objectID << "`";
51 return nullptr;
52 }
53
54 VirtualRobot::SceneObjectSetPtr
56 {
57 const ObjectFinder finder;
58
59 VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet);
60 for (const auto& objectPose : objectPoses)
61 {
62 if (auto obstacle = finder.loadManipulationObject(objectPose))
63 {
64 obstacle->setGlobalPose(objectPose.objectPoseGlobal);
65 obstacle->setName(objectPose.objectID.str());
66 sceneObjects->addSceneObject(obstacle);
67 }
68 }
69
70 return sceneObjects;
71 }
72
73 VirtualRobot::SceneObjectSetPtr
75 const OccupancyGridHelper::Params& params)
76 {
77 const OccupancyGridHelper ocHelper(occupancyGrid, params);
78 const auto obstacles = ocHelper.obstacles();
79
80 const float boxSize = occupancyGrid.resolution;
81 const float resolution = occupancyGrid.resolution;
82
83 VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet);
84
86 << "Only occupancy grid in global frame supported.";
87
88 VirtualRobot::CoinVisualizationFactory factory;
89
90 const auto& world_T_map = occupancyGrid.pose;
91
92 for (int x = 0; x < obstacles.rows(); x++)
93 {
94 for (int y = 0; y < obstacles.cols(); y++)
95 {
96 if (obstacles(x, y))
97 {
98 const Eigen::Vector3f pos{
99 static_cast<float>(x) * resolution, static_cast<float>(y) * resolution, 0};
100
101 // FIXME: change to Isometry3f
102 Eigen::Affine3f map_T_obj = Eigen::Affine3f::Identity();
103 map_T_obj.translation() = pos;
104
105 Eigen::Affine3f world_T_obj = world_T_map * map_T_obj;
106
107
108 auto cube = factory.createBox(boxSize, boxSize, boxSize);
109
110 const VirtualRobot::CollisionModelPtr collisionModel(
111 new VirtualRobot::CollisionModel(cube));
112
113 const VirtualRobot::SceneObjectPtr sceneObject(new VirtualRobot::SceneObject(
114 "box_" + std::to_string(sceneObjects->getSize()), cube, collisionModel));
115 sceneObject->setGlobalPose(world_T_obj.matrix());
116
117 sceneObjects->addSceneObject(sceneObject);
118 }
119 }
120 }
121
122 return sceneObjects;
123 }
124
126 objectPoseClient_(client)
127 {
128 }
129
130 VirtualRobot::SceneObjectSetPtr
132 {
133 const objpose::ObjectPoseSeq objectPoses = objectPoseClient_.fetchObjectPoses();
134 return asSceneObjects(objectPoses);
135 }
136
139 {
140 const objpose::ObjectPoseSeq objectPoses = objectPoseClient_.fetchObjectPoses();
141 return asManipulationObjects(objectPoses);
142 }
143
146 {
148
149 for (const auto& pose : objectPoses)
150 {
151 set.emplace_back(*asManipulationObject(pose));
152 }
153
154 return std::make_shared<ManipulationObjectSet>(set);
155 }
156
157 void
158 CollisionModelHelper::visualizeCollisionModel(const VirtualRobot::CollisionModelPtr& model,
159 viz::Client& arviz)
160 {
161 armarx::viz::Mesh mesh(model->getName());
162 auto faces = model->getTriMeshModel()->faces;
163 std::vector<armarx::viz::data::Face> viz_faces;
164 std::transform(
165 faces.begin(),
166 faces.end(),
167 std::back_inserter(viz_faces),
168 [](const auto& face)
169 {
170 return armarx::viz::data::Face(
171 face.id1, face.id2, face.id3, face.idColor1, face.idColor2, face.idColor3);
172 });
173 mesh.vertices(model->getTriMeshModel()->vertices)
174 .faces(viz_faces)
175 .pose(model->getGlobalPose());
176 arviz.commitLayerContaining("CollisionModel", mesh);
177 }
178
179} // namespace armarx::obstacle_avoidance
Used to find objects in the ArmarX objects repository [1] (formerly [2]).
static VirtualRobot::ManipulationObjectPtr loadManipulationObject(const std::optional< ObjectInfo > &ts, VirtualRobot::ObjectIO::ObjectDescription loadMode=VirtualRobot::ObjectIO::ObjectDescription::eFull)
detail::OccupancyGridHelperParams Params
Provides access to the armarx::objpose::ObjectPoseStorageInterface (aka the object memory).
static VirtualRobot::ManipulationObjectPtr asManipulationObject(const objpose::ObjectPose &objectPose)
static ManipulationObjectSetPtr asManipulationObjects(const objpose::ObjectPoseSeq &objectPoses)
std::vector< VirtualRobot::ManipulationObject > ManipulationObjectSet
std::shared_ptr< ManipulationObjectSet > ManipulationObjectSetPtr
static VirtualRobot::SceneObjectSetPtr asSceneObjects(const objpose::ObjectPoseSeq &objectPoses)
CollisionModelHelper(const objpose::ObjectPoseClient &client)
static void visualizeCollisionModel(const VirtualRobot::CollisionModelPtr &model, viz::Client &arviz)
void commitLayerContaining(std::string const &name)
Definition Client.h:166
DerivedT & pose(Eigen::Matrix4f const &pose)
Definition ElementOps.h:176
Mesh & vertices(const Eigen::Vector3f *vs, std::size_t size)
Definition Mesh.h:34
Mesh & faces(const data::Face *fs, std::size_t size)
Definition Mesh.h:83
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
std::string const GlobalFrame
Variable of the global coordinate system.
Definition FramedPose.h:65
std::vector< ObjectPose > ObjectPoseSeq
This file offers overloads of toIce() and fromIce() functions for STL container types.
An object pose as stored by the ObjectPoseStorage.
Definition ObjectPose.h:34
armarx::ObjectID objectID
The object ID, i.e. dataset, class name and instance name.
Definition ObjectPose.h:56
Eigen::Matrix4f objectPoseGlobal
The object pose in the global frame.
Definition ObjectPose.h:71