10 #include <mrpt/io/CFileGZInputStream.h> 11 #include <mrpt/maps/CSimplePointsMap.h> 12 #include <mrpt/opengl/COpenGLScene.h> 13 #include <mrpt/poses/CPose2D.h> 14 #include <mrpt/serialization/CArchive.h> 15 #include <mrpt/system/filesystem.h> 16 #include <mrpt/version.h> 25 using namespace mvsim;
28 OccupancyGridMap::OccupancyGridMap(
32 show_grid_collision_points_(true),
34 lateral_friction_(0.5)
47 if (!xml_file || !xml_file->
value())
48 throw std::runtime_error(
49 "Error: <file></file> XML entry not found inside gridmap node!");
52 const string sFileExt =
53 mrpt::system::extractFileExtension(sFile,
true );
56 if (sFileExt ==
"yaml")
58 #if MRPT_VERSION >= 0x250 59 bool ok =
grid_.loadFromROSMapServerYAML(sFile);
62 mrpt::format(
"Error loading ROS map file: '%s'", sFile.c_str()));
64 THROW_EXCEPTION(
"Loading ROS YAML map files requires MRPT>=2.5.0");
67 else if (sFileExt ==
"gridmap")
69 mrpt::io::CFileGZInputStream fi(sFile);
70 auto f = mrpt::serialization::archiveFrom(fi);
77 double xcenterpixel = -1, ycenterpixel = -1;
78 double resolution = 0.10;
80 other_params[
"resolution"] =
TParamEntry(
"%lf", &resolution);
81 other_params[
"centerpixel_x"] =
TParamEntry(
"%lf", &xcenterpixel);
82 other_params[
"centerpixel_y"] =
TParamEntry(
"%lf", &ycenterpixel);
87 if (!
grid_.loadFromBitmapFile(
88 sFile, resolution, {xcenterpixel, ycenterpixel}))
89 throw std::runtime_error(mrpt::format(
90 "[OccupancyGridMap] ERROR: File not found '%s'",
97 ps[
"show_collisions"] =
108 const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
109 const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
110 [[maybe_unused]]
bool childrenOnly)
117 gl_grid_ = mrpt::opengl::CSetOfObjects::Create();
118 gl_grid_->setName(
"OccupancyGridMap");
130 #if MRPT_VERSION >= 0x240 147 gl_objs = mrpt::opengl::CSetOfObjects::Create();
149 "OccupancyGridMap"s + this->
getName() +
".obstacles["s +
150 std::to_string(i) +
"]"s);
151 viz->get().insert(gl_objs);
176 const size_t nObjs = lstVehs.size() + lstBlocks.size();
180 for (World::VehicleList::const_iterator itVeh = lstVehs.begin();
181 itVeh != lstVehs.end(); ++itVeh, ++obj_idx)
185 itVeh->second->getMaxVehicleRadius() * 1.50f;
186 const mrpt::math::TPose3D& pose = itVeh->second->getPose();
187 ipv.
pose = mrpt::poses::CPose2D(
191 for (
const auto& block : lstBlocks)
195 block.second->getMaxBlockRadius() * 1.50f;
196 const mrpt::math::TPose3D& pose = block.second->getPose();
199 ipv.
pose = mrpt::poses::CPose2D(pose.x, pose.y, 0);
213 for (
size_t obj_idx = 0; obj_idx < nObjs; obj_idx++)
217 mrpt::obs::CObservation2DRangeScan::Ptr& scan = ipv.
scan;
219 if (!scan) scan = mrpt::obs::CObservation2DRangeScan::Create();
222 const float occup_threshold = 0.5f;
223 const size_t nRays = 50;
225 scan->aperture = 2.0 *
M_PI;
226 scan->maxRange = veh_max_obstacles_ranges;
228 grid_.laserScanSimulator(
229 *scan, ipv.
pose, occup_threshold, nRays, 0.0f );
233 const float range_enlarge = 0.25f *
grid_.getResolution();
234 for (
size_t k = 0; k < scan->getScanSize(); k++)
236 scan->setScanRange(k, scan->getScanRange(k) + range_enlarge);
255 mrpt::opengl::CPointCloud::Ptr& gl_pts =
259 gl_pts = mrpt::opengl::CPointCloud::Create();
260 gl_pts->setPointSize(4.0
f);
261 gl_pts->setColor(0, 0, 1);
264 gl_pts->setPose(mrpt::poses::CPose2D(ipv.
pose));
269 const float occCellSemiWidth =
grid_.getResolution() * 0.4f;
271 sqrPoly.
SetAsBox(occCellSemiWidth, occCellSemiWidth);
274 fixtureDef.
shape = &sqrPoly;
281 const mrpt::obs::CSinCosLookUpTableFor2DScans::TSinCosValues&
284 for (
size_t k = 0; k < nRays; k++)
290 if (!scan->getScanRangeValidity(k))
306 ASSERT_(poly !=
nullptr);
309 sincos_tab.ccos[k] * scan->getScanRange(k);
311 sincos_tab.csin[k] * scan->getScanRange(k);
313 const float ggx = ipv.
pose.x() + llx;
314 const float ggy = ipv.
pose.y() + lly;
316 const float gx =
grid_.idx2x(
grid_.x2idx(ggx));
317 const float gy =
grid_.idx2y(
grid_.y2idx(ggy));
319 const float lx = gx - ipv.
pose.x();
320 const float ly = gy - ipv.
pose.y();
323 occCellSemiWidth, occCellSemiWidth,
b2Vec2(lx, ly),
328 gl_pts->mrpt::opengl::CPointCloud::insertPoint(
This file contains rapidxml parser and DOM implementation.
b2Fixture * CreateFixture(const b2FixtureDef *def)
float density
The density, usually in kg/m^2.
mrpt::maps::COccupancyGridMap2D grid_
constexpr uintptr_t INVISIBLE_FIXTURE_USER_DATA
Used to signal a Box2D fixture as "invisible" to sensors.
std::map< std::string, TParamEntry > TParameterDefinitions
float max_obstacles_ranges
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)
mrpt::obs::CObservation2DRangeScan::Ptr scan
void SetTransform(const b2Vec2 &position, float angle)
double lateral_friction_
(Default: 0.5)
std::multimap< std::string, VehicleBase::Ptr > VehicleList
virtual ~OccupancyGridMap()
const VehicleList & getListOfVehicles() const
std::unique_ptr< b2World > & getBox2DWorld()
bool show_grid_collision_points_
std::vector< mrpt::opengl::CPointCloud::Ptr > gl_obs_clouds_buffer_
std::vector< TFixturePtr > collide_fixtures
xml_node< Ch > * first_node(const Ch *name=0, std::size_t name_size=0, bool case_sensitive=true) const
std::multimap< std::string, Block::Ptr > BlockList
void SetAsBox(float hx, float hy)
mrpt::obs::CSinCosLookUpTableFor2DScans sincos_lut_
virtual void internalGuiUpdate(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical, bool childrenOnly) override
std::vector< mrpt::opengl::CSetOfObjects::Ptr > gl_obs_clouds_
std::vector< TInfoPerCollidableobj > obstacles_for_each_obj_
const std::map< std::string, std::string > & user_defined_variables() const
std::mutex gl_obs_clouds_buffer_cs_
const std::string & getName() const
double restitution_
Elastic restitution coef (default: 0.01)
const BlockList & getListOfBlocks() const
void doLoadConfigFrom(const rapidxml::xml_node< char > *root)
std::string local_to_abs_path(const std::string &in_path) const
mrpt::poses::CPose2D pose
float restitution
The restitution (elasticity) usually in the range [0,1].
virtual void simul_pre_timestep(const TSimulContext &context) override
float friction
The friction coefficient, usually in the range [0,1].
mrpt::opengl::CSetOfObjects::Ptr gl_grid_
call of internalGuiUpdate()