/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * ArmarX is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * @package RobotAPI * @author Christoph Pohl ( christoph dot pohl at kit dot edu ) * @date 17.02.23 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt * GNU General Public License */ #include "CollisionModelHelper.h" #include <VirtualRobot/ManipulationObject.h> #include <VirtualRobot/SceneObjectSet.h> #include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h> #include <ArmarXCore/core/exceptions/local/ExpressionException.h> namespace armarx::obstacle_avoidance { VirtualRobot::ManipulationObjectPtr CollisionModelHelper::asManipulationObject(const objpose::ObjectPose& objectPose) { const ObjectFinder finder; const VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet); if (auto obstacle = finder.loadManipulationObject(objectPose)) { obstacle->setGlobalPose(objectPose.objectPoseGlobal); return obstacle; } ARMARX_WARNING << "Failed to load scene object `" << objectPose.objectID << "`"; return nullptr; } VirtualRobot::SceneObjectSetPtr CollisionModelHelper::asSceneObjects(const objpose::ObjectPoseSeq& objectPoses) { const ObjectFinder finder; VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet); for (const auto& objectPose : objectPoses) { if (auto obstacle = finder.loadManipulationObject(objectPose)) { obstacle->setGlobalPose(objectPose.objectPoseGlobal); sceneObjects->addSceneObject(obstacle); } } return sceneObjects; } VirtualRobot::SceneObjectSetPtr CollisionModelHelper::asSceneObjects(const OccupancyGrid& occupancyGrid, const OccupancyGridHelper::Params& params) { const OccupancyGridHelper ocHelper(occupancyGrid, params); const auto obstacles = ocHelper.obstacles(); const float boxSize = occupancyGrid.resolution; const float resolution = occupancyGrid.resolution; VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet); ARMARX_CHECK_EQUAL(occupancyGrid.frame, GlobalFrame) << "Only occupancy grid in global frame supported."; VirtualRobot::CoinVisualizationFactory factory; const auto& world_T_map = occupancyGrid.pose; for (int x = 0; x < obstacles.rows(); x++) { for (int y = 0; y < obstacles.cols(); y++) { if (obstacles(x, y)) { const Eigen::Vector3f pos{ static_cast<float>(x) * resolution, static_cast<float>(y) * resolution, 0}; // FIXME: change to Isometry3f Eigen::Affine3f map_T_obj = Eigen::Affine3f::Identity(); map_T_obj.translation() = pos; Eigen::Affine3f world_T_obj = world_T_map * map_T_obj; // ARMARX_INFO << world_T_obj.translation(); auto cube = factory.createBox(boxSize, boxSize, boxSize); const VirtualRobot::CollisionModelPtr collisionModel( new VirtualRobot::CollisionModel(cube)); const VirtualRobot::SceneObjectPtr sceneObject(new VirtualRobot::SceneObject( "box_" + std::to_string(sceneObjects->getSize()), cube, collisionModel)); sceneObject->setGlobalPose(world_T_obj.matrix()); sceneObjects->addSceneObject(sceneObject); } } } return sceneObjects; } CollisionModelHelper::CollisionModelHelper(const objpose::ObjectPoseClient& client) : objectPoseClient_(client) { } VirtualRobot::SceneObjectSetPtr CollisionModelHelper::fetchSceneObjects() { const objpose::ObjectPoseSeq objectPoses = objectPoseClient_.fetchObjectPoses(); return asSceneObjects(objectPoses); } CollisionModelHelper::ManipulationObjectSetPtr CollisionModelHelper::fetchManipulationObjects() { const objpose::ObjectPoseSeq objectPoses = objectPoseClient_.fetchObjectPoses(); return asManipulationObjects(objectPoses); } CollisionModelHelper::ManipulationObjectSetPtr CollisionModelHelper::asManipulationObjects(const objpose::ObjectPoseSeq& objectPoses) { ManipulationObjectSet set; for (const auto& pose : objectPoses) { set.emplace_back(*asManipulationObject(pose)); } return std::make_shared<ManipulationObjectSet>(set); } } // namespace armarx::obstacle_avoidance