10 #include <mrpt/core/exceptions.h> 11 #include <mrpt/maps/CSimplePointsMap.h> 12 #include <mrpt/opengl/CAssimpModel.h> 13 #include <mrpt/system/filesystem.h> 22 using namespace mvsim;
28 double thickness = 0.10;
32 World* parent,
const mrpt::math::TPoint3D& rawEnd1,
34 mrpt::maps::CSimplePointsMap& allPts)
36 Block::Ptr b = std::make_shared<Block>(parent);
40 b->setName(mrpt::format(
"wall_%04i", ++cnt));
43 float pt1Dist = std::numeric_limits<float>::max(),
44 pt2Dist = std::numeric_limits<float>::max();
48 allPts.kdTreeClosestPoint2D(rawEnd1.x, rawEnd1.y, pt1Dist);
49 allPts.kdTreeClosestPoint2D(rawEnd2.x, rawEnd2.y, pt2Dist);
54 const bool end1move = pt1Dist < mrpt::square(1.01 * wp.
thickness);
55 const bool end2move = pt2Dist < mrpt::square(1.01 * wp.
thickness);
57 const auto vec12 = rawEnd2 - rawEnd1;
58 ASSERT_(vec12.norm() > 0);
59 const auto u12 = vec12.unitarize();
64 const auto end1 = end1move ? (rawEnd1 + u12 * (-t)) : rawEnd1;
65 const auto end2 = end2move ? (rawEnd2 + u12 * t) : rawEnd2;
67 const auto ptCenter = (end1 + end2) * 0.5;
68 const double wallLineAngle = std::atan2(vec12.y, vec12.x);
70 allPts.insertPoint(rawEnd1);
71 allPts.insertPoint(rawEnd2);
74 b->setPose({ptCenter.x, ptCenter.y, 0, wallLineAngle, 0, 0});
78 const double l_hf = 0.5 * (end2 - end1).norm();
83 auto bbmin = mrpt::math::TPoint3D(-l_hf, -t_hf, 0);
84 auto bbmax = mrpt::math::TPoint3D(+l_hf, +t_hf, 0);
86 mrpt::math::TPolygon2D p;
87 p.emplace_back(bbmin.x, bbmin.y);
88 p.emplace_back(bbmin.x, bbmax.y);
89 p.emplace_back(bbmax.x, bbmax.y);
90 p.emplace_back(bbmax.x, bbmin.y);
99 b->ground_friction(1e5);
106 b->setIsStatic(
true);
108 if (
auto bb = b->b2d_body(); bb !=
nullptr)
111 const auto q = b->getPose();
113 bb->SetTransform(
b2Vec2(q.x, q.y), q.yaw);
115 bb->SetLinearVelocity({0, 0});
116 bb->SetAngularVelocity(0);
127 ASSERT_(0 == strcmp(node.
name(),
"walls"));
129 std::string wallModelFileName;
130 std::string sTransformation;
132 mrpt::img::TColor wallColor{0x32, 0x32, 0x32, 0xff};
136 params[
"model_uri"] =
TParamEntry(
"%s", &wallModelFileName);
137 params[
"transformation"] =
TParamEntry(
"%s", &sTransformation);
141 params[
"color"] =
TParamEntry(
"%color", &wallColor);
147 auto HM = mrpt::math::CMatrixDouble44::Identity();
148 if (!sTransformation.empty())
150 std::stringstream ssError;
151 bool ok = HM.fromMatlabStringFormat(sTransformation, ssError);
154 "Error parsing 'transformation=\"%s\"' parameter of walls:\n%s",
155 sTransformation.c_str(), ssError.str().c_str());
156 MRPT_LOG_DEBUG_STREAM(
"Walls: using transformation: " << HM.asString());
158 const auto tf = mrpt::poses::CPose3D(HM);
161 const auto* xml_shape = node.
first_node(
"shape");
164 std::vector<mrpt::math::TPoint3Df> tfPts;
169 mrpt::math::TPolygon2D segments;
172 *xml_shape, segments,
"[World::process_load_walls]");
174 MRPT_LOG_DEBUG_STREAM(
175 "Walls loaded from <shape> tag, " << segments.size()
179 tfPts.reserve(segments.size());
180 for (
const auto& pt : segments) tfPts.emplace_back(tf.composePoint(pt));
185 ASSERT_(!wallModelFileName.empty());
186 const std::string localFileName =
187 xmlPathToActualPath(wallModelFileName);
188 ASSERT_FILE_EXISTS_(localFileName);
190 MRPT_LOG_DEBUG_STREAM(
191 "Loading walls definition model from: " << localFileName);
193 auto glModel = mrpt::opengl::CAssimpModel::Create();
194 glModel->loadScene(localFileName);
196 const auto& points = glModel->shaderWireframeVertexPointBuffer();
197 MRPT_LOG_DEBUG_STREAM(
198 "Walls loaded from model file, " << points.size() <<
" segments.");
201 tfPts.reserve(points.size());
202 for (
const auto& pt : points) tfPts.emplace_back(tf.composePoint(pt));
206 mrpt::maps::CSimplePointsMap ptsMap;
209 ASSERT_(tfPts.size() % 2 == 0);
210 for (
size_t i = 0; i < tfPts.size() / 2; i++)
212 const auto& pt1 = tfPts[i * 2 + 0];
213 const auto& pt2 = tfPts[i * 2 + 1];
215 block->block_color(wallColor);
This file contains rapidxml parser and DOM implementation.
std::map< std::string, TParamEntry > TParameterDefinitions
void parse_xmlnode_children_as_param(const rapidxml::xml_node< char > &xml_node, const TParameterDefinitions ¶ms, const std::map< std::string, std::string > &variableNamesValues={}, const char *functionNameContext="", mrpt::system::COutputLogger *logger=nullptr)
std::unique_ptr< b2World > & getBox2DWorld()
geometry_msgs::TransformStamped t
std::shared_ptr< Block > Ptr
xml_node< Ch > * first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
static Block::Ptr create_wall_segment(World *parent, const mrpt::math::TPoint3D &rawEnd1, const mrpt::math::TPoint3D &rawEnd2, const WallProperties &wp, mrpt::maps::CSimplePointsMap &allPts)
void parse_xmlnode_shape(const rapidxml::xml_node< char > &xml_node, mrpt::math::TPolygon2D &out_poly, const char *functionNameContext="")
This file contains rapidxml printer implementation.
void process_load_walls(const rapidxml::xml_node< char > &node)