Block.h
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | Multiblock simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2024 Jose Luis Blanco Claraco |
5  | Copyright (C) 2017 Borys Tymchenko (Odessa Polytechnic University) |
6  | Distributed under 3-clause BSD License |
7  | See COPYING |
8  +-------------------------------------------------------------------------+ */
9 
10 #pragma once
11 
12 #include <box2d/b2_fixture.h>
14 #include <box2d/b2_polygon_shape.h>
15 #include <box2d/b2_world.h>
16 #include <mrpt/img/TColor.h>
17 #include <mrpt/math/TPolygon2D.h>
18 #include <mrpt/opengl/CSetOfLines.h>
19 #include <mrpt/opengl/CSetOfObjects.h>
20 #include <mrpt/poses/CPose2D.h>
21 #include <mrpt/typemeta/TEnumType.h>
22 #include <mvsim/ClassFactory.h>
24 #include <mvsim/Simulable.h>
26 #include <mvsim/VisualObject.h>
27 #include <mvsim/basic_types.h>
28 
29 #include <mutex>
30 
31 namespace mvsim
32 {
36 enum class GeometryType : int32_t
37 {
38  Invalid = -1,
39  // ----------------
40  Cylinder = 0,
41  Sphere,
42  Box,
43  Ramp,
45 };
46 
50 class Block : public VisualObject, public Simulable
51 {
52  public:
53  using Ptr = std::shared_ptr<Block>;
54 
57  static Ptr factory(World* parent, const rapidxml::xml_node<char>* xml_node);
59  static Ptr factory(World* parent, const std::string& xml_text);
60 
63  static void register_block_class(const World& parent, const rapidxml::xml_node<char>* xml_node);
64 
65  // ------- Interface with "World" ------
66  virtual void simul_pre_timestep(const TSimulContext& context) override;
67  virtual void simul_post_timestep(const TSimulContext& context) override;
68  virtual void apply_force(
69  const mrpt::math::TVector2D& force,
70  const mrpt::math::TPoint2D& applyPoint = mrpt::math::TPoint2D(0, 0)) override;
71 
74  virtual void create_multibody_system(b2World& world);
75 
78  virtual float getMaxBlockRadius() const { return maxRadius_; }
80  virtual double getMass() const { return mass_; }
81  b2Body* getBox2DBlockBody() { return b2dBody_; }
82  mrpt::math::TPoint2D getBlockCenterOfMass() const
83  {
84  return block_com_;
85  }
86 
89  const mrpt::math::TPolygon2D& blockShape() const { return block_poly_; }
90 
91  void blockShape(const mrpt::math::TPolygon2D& p)
92  {
93  block_poly_ = p;
95  gl_block_.reset(); // regenerate 3D view
96  }
97 
99  void setBlockIndex(size_t idx) { blockIndex_ = idx; }
101  size_t getBlockIndex() const { return blockIndex_; }
102 
103  Block(World* parent);
104 
105  double ground_friction() const { return groundFriction_; }
106  void ground_friction(double newValue) { groundFriction_ = newValue; }
107 
108  double mass() const { return mass_; }
109  void mass(double newValue) { mass_ = newValue; }
110 
111  bool isStatic() const;
112  void setIsStatic(bool b);
113 
114  const mrpt::img::TColor block_color() const { return block_color_; }
115  void block_color(const mrpt::img::TColor& c)
116  {
117  block_color_ = c;
118  gl_block_.reset(); // regenerate 3D view
119  }
120 
121  double block_z_min() const { return block_z_min_; }
122  double block_z_max() const { return block_z_max_; }
123  void block_z_min(double v)
124  {
125  block_z_min_ = v;
126  gl_block_.reset(); // regenerate 3D view
127  }
128  void block_z_max(double v)
129  {
130  block_z_max_ = v;
131  gl_block_.reset(); // regenerate 3D view
132  }
133 
136  bool default_block_z_min_max() const;
137 
138  VisualObject* meAsVisualObject() override { return this; }
139 
140  std::optional<float> getElevationAt(const mrpt::math::TPoint2D& worldXY) const override;
141 
142  protected:
143  virtual void internalGuiUpdate(
144  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
145  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical, bool childrenOnly) override;
146 
149  size_t blockIndex_ = 0;
150 
151  std::vector<b2FrictionJoint*> friction_joints_;
152 
153  // Block info:
154  double mass_ = 30.0;
155  bool isStatic_ = false;
156  mrpt::math::TPolygon2D block_poly_;
157 
160  double maxRadius_;
161 
162  double block_z_min_ = std::numeric_limits<double>::quiet_NaN(),
163  block_z_max_ = std::numeric_limits<double>::quiet_NaN();
164 
165  mrpt::img::TColor block_color_{0x00, 0x00, 0xff};
166  mrpt::math::TPoint2D block_com_{.0, .0};
167 
168  double lateral_friction_ = 0.5;
169  double groundFriction_ = 0.5;
170  double restitution_ = 0.01;
171 
174  bool intangible_ = false;
175 
177  {"mass", {"%lf", &mass_}},
178  {"zmin", {"%lf", &block_z_min_}},
179  {"zmax", {"%lf", &block_z_max_}},
180  {"ground_friction", {"%lf", &groundFriction_}},
181  {"lateral_friction", {"%lf", &lateral_friction_}},
182  {"restitution", {"%lf", &restitution_}},
183  {"color", {"%color", &block_color_}},
184  {"intangible", {"%bool", &intangible_}},
185  {"static", {"%bool", &isStatic_}}
186  //
187  };
188 
190 
191  // Box2D elements:
193 
194  private:
195  void internal_internalGuiUpdate_forces(mrpt::opengl::COpenGLScene& scene);
196 
197  void internal_parseGeometry(const rapidxml::xml_node<char>& xml_geom_node);
198 
201  {
202  GeometryParams() = default;
203 
204  std::string typeStr; // cylinder, sphere, etc.
206 
207  float radius = 0;
208  float length = 0, lx = 0, ly = 0, lz = 0;
209  int vertex_count = 0;
210 
212  {"type", {"%s", &typeStr}},
213  {"radius", {"%f", &radius}},
214  {"length", {"%f", &length}},
215  {"lx", {"%f", &lx}},
216  {"ly", {"%f", &ly}},
217  {"lz", {"%f", &lz}},
218  {"vertex_count", {"%i", &vertex_count}},
219  };
220  };
221 
223 
224  mrpt::opengl::CSetOfObjects::Ptr gl_block_;
225  mrpt::opengl::CSetOfLines::Ptr gl_forces_;
227  std::vector<mrpt::math::TSegment3D> force_segments_for_rendering_;
228 
229 }; // end Block
230 
236 {
237  public:
238  using Ptr = std::shared_ptr<DummyInvisibleBlock>;
239 
241 
244  static Ptr factory(World* parent, const rapidxml::xml_node<char>* xml_node);
246  static Ptr factory(World* parent, const std::string& xml_text);
247 
248  // ------- Interface with "World" ------
249  virtual void simul_pre_timestep(const TSimulContext& context) override
250  {
252  for (auto& s : sensors_) s->simul_pre_timestep(context);
253  }
254  virtual void simul_post_timestep(const TSimulContext& context) override
255  {
257  for (auto& s : sensors_) s->simul_post_timestep(context);
258  }
259 
260  virtual void apply_force(
261  [[maybe_unused]] const mrpt::math::TVector2D& force,
262  [[maybe_unused]] const mrpt::math::TPoint2D& applyPoint) override
263  {
264  }
265 
267 
268  virtual float getMaxBlockRadius() const { return 0; }
269 
271  virtual double getMass() const { return 0; }
272 
273  void add_sensor(const SensorBase::Ptr& sensor) { sensors_.push_back(sensor); }
274 
275  protected:
276  void internalGuiUpdate(
277  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
278  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
279  [[maybe_unused]] bool childrenOnly) override;
280 
281  void registerOnServer(mvsim::Client& c) override
282  {
283  // register myself, and my children objects:
285  for (auto& sensor : sensors_) sensor->registerOnServer(c);
286  }
287 
288  private:
290 
291 }; // end Block
292 
293 } // namespace mvsim
294 
295 // TTypeEnum macros:
296 MRPT_ENUM_TYPE_BEGIN_NAMESPACE(mvsim, mvsim::GeometryType)
297 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::Cylinder, "cylinder");
298 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::Sphere, "sphere");
299 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::Box, "box");
300 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::Ramp, "ramp");
301 MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::SemiCylinderBump, "semi_cylinder_bump");
302 MRPT_ENUM_TYPE_END()
mvsim::Block::block_color_
mrpt::img::TColor block_color_
Definition: Block.h:165
mvsim::Block::block_color
const mrpt::img::TColor block_color() const
Definition: Block.h:114
mvsim::VisualObject::parent
World * parent()
Definition: VisualObject.h:51
mvsim
Definition: Client.h:21
mvsim::Block::restitution_
double restitution_
Default: 0.01.
Definition: Block.h:170
mvsim::Block::blockIndex_
size_t blockIndex_
Definition: Block.h:149
mvsim::Block::gl_block_
mrpt::opengl::CSetOfObjects::Ptr gl_block_
Definition: Block.h:224
mvsim::Block::force_segments_for_rendering_cs_
std::mutex force_segments_for_rendering_cs_
Definition: Block.h:226
mvsim::Block::factory
static Ptr factory(World *parent, const rapidxml::xml_node< char > *xml_node)
Definition: Block.cpp:64
mvsim::Block::mass
void mass(double newValue)
Definition: Block.h:109
mvsim::Block::isStatic_
bool isStatic_
Definition: Block.h:155
mvsim::DummyInvisibleBlock::registerOnServer
void registerOnServer(mvsim::Client &c) override
Definition: Block.h:281
basic_types.h
mvsim::Block::mass
double mass() const
Definition: Block.h:108
mvsim::Block::Block
Block(World *parent)
Definition: Block.cpp:38
mvsim::Block::GeometryParams::vertex_count
int vertex_count
Definition: Block.h:209
mvsim::GeometryType::Ramp
@ Ramp
mvsim::Block::maxRadius_
double maxRadius_
Definition: Block.h:160
s
XmlRpcServer s
mvsim::GeometryType::Invalid
@ Invalid
mvsim::Block::internal_parseGeometry
void internal_parseGeometry(const rapidxml::xml_node< char > &xml_geom_node)
Definition: Block.cpp:443
mvsim::Block::meAsVisualObject
VisualObject * meAsVisualObject() override
Definition: Block.h:138
mvsim::Client
Definition: Client.h:48
mvsim::Block::mass_
double mass_
Definition: Block.h:154
b2_friction_joint.h
b2Body
A rigid body. These are created via b2World::CreateBody.
Definition: b2_body.h:128
mvsim::Block::gl_forces_
mrpt::opengl::CSetOfLines::Ptr gl_forces_
Definition: Block.h:225
mvsim::Block::friction_joints_
std::vector< b2FrictionJoint * > friction_joints_
Definition: Block.h:151
mvsim::Block::params_
const TParameterDefinitions params_
Definition: Block.h:176
mvsim::Block::create_multibody_system
virtual void create_multibody_system(b2World &world)
Definition: Block.cpp:316
TParameterDefinitions.h
mvsim::Block::apply_force
virtual void apply_force(const mrpt::math::TVector2D &force, const mrpt::math::TPoint2D &applyPoint=mrpt::math::TPoint2D(0, 0)) override
Definition: Block.cpp:407
mvsim::DummyInvisibleBlock::getMass
virtual double getMass() const
Definition: Block.h:271
mvsim::Block::block_z_min
double block_z_min() const
Definition: Block.h:121
mvsim::DummyInvisibleBlock::simul_post_timestep
virtual void simul_post_timestep(const TSimulContext &context) override
Definition: Block.h:254
mvsim::Block::block_color
void block_color(const mrpt::img::TColor &c)
Definition: Block.h:115
mvsim::DummyInvisibleBlock::Ptr
std::shared_ptr< DummyInvisibleBlock > Ptr
Definition: Block.h:238
mvsim::DummyInvisibleBlock::factory
static Ptr factory(World *parent, const rapidxml::xml_node< char > *xml_node)
mvsim::Block::blockShape
const mrpt::math::TPolygon2D & blockShape() const
Definition: Block.h:89
mvsim::Block::internal_internalGuiUpdate_forces
void internal_internalGuiUpdate_forces(mrpt::opengl::COpenGLScene &scene)
Definition: Block.cpp:287
length
GLenum GLuint GLenum GLsizei length
Definition: gl.h:1033
Simulable.h
mvsim::Block::geomParams_
GeometryParams geomParams_
Definition: Block.h:222
mvsim::Block::ground_friction
void ground_friction(double newValue)
Definition: Block.h:106
mvsim::DummyInvisibleBlock::internalGuiUpdate
void internalGuiUpdate(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical, [[maybe_unused]] bool childrenOnly) override
Definition: Block.cpp:433
mvsim::TSimulContext
Definition: basic_types.h:58
mvsim::Block::default_block_z_min_max
bool default_block_z_min_max() const
Definition: Block.cpp:591
mvsim::Block::block_z_min_
double block_z_min_
Definition: Block.h:162
mvsim::TParameterDefinitions
std::map< std::string, TParamEntry > TParameterDefinitions
Definition: TParameterDefinitions.h:64
b2Fixture
Definition: b2_fixture.h:116
mvsim::Block::block_poly_
mrpt::math::TPolygon2D block_poly_
Definition: Block.h:156
mvsim::Block::block_z_max
void block_z_max(double v)
Definition: Block.h:128
mvsim::Block::block_z_min
void block_z_min(double v)
Definition: Block.h:123
mvsim::Simulable::simul_post_timestep
virtual void simul_post_timestep(const TSimulContext &context)
Definition: Simulable.cpp:64
mvsim::Block::register_block_class
static void register_block_class(const World &parent, const rapidxml::xml_node< char > *xml_node)
Definition: Block.cpp:50
mvsim::Block::block_z_max
double block_z_max() const
Definition: Block.h:122
mvsim::Block::GeometryParams::ly
float ly
Definition: Block.h:208
b2_world.h
mvsim::Block
Definition: Block.h:50
mvsim::SensorBase::Ptr
std::shared_ptr< SensorBase > Ptr
Definition: SensorBase.h:37
mvsim::GeometryType::Cylinder
@ Cylinder
b2_fixture.h
mvsim::Block::simul_pre_timestep
virtual void simul_pre_timestep(const TSimulContext &context) override
Definition: Block.cpp:220
mvsim::Block::updateMaxRadiusFromPoly
void updateMaxRadiusFromPoly()
Definition: Block.cpp:303
mvsim::DummyInvisibleBlock::sensors_
TListSensors sensors_
Sensors aboard.
Definition: Block.h:289
mvsim::GeometryType::SemiCylinderBump
@ SemiCylinderBump
mvsim::Block::groundFriction_
double groundFriction_
Default: 0.5.
Definition: Block.h:169
mvsim::GeometryType
GeometryType
Definition: Block.h:36
mvsim::Simulable::registerOnServer
virtual void registerOnServer(mvsim::Client &c)
Definition: Simulable.cpp:458
mvsim::DummyInvisibleBlock::apply_force
virtual void apply_force([[maybe_unused]] const mrpt::math::TVector2D &force, [[maybe_unused]] const mrpt::math::TPoint2D &applyPoint) override
Definition: Block.h:260
mvsim::Block::block_z_max_
double block_z_max_
Definition: Block.h:163
mvsim::DummyInvisibleBlock::simul_pre_timestep
virtual void simul_pre_timestep(const TSimulContext &context) override
Definition: Block.h:249
mvsim::Block::isStatic
bool isStatic() const
Definition: Block.cpp:416
mvsim::Block::setIsStatic
void setIsStatic(bool b)
Definition: Block.cpp:423
mvsim::World
Definition: World.h:82
mvsim::Block::GeometryParams::typeStr
std::string typeStr
Definition: Block.h:204
rapidxml::xml_node< char >
mvsim::DummyInvisibleBlock::create_multibody_system
virtual void create_multibody_system(b2World &)
Definition: Block.h:266
mvsim::Block::getBlockIndex
size_t getBlockIndex() const
Definition: Block.h:101
mvsim::Block::GeometryParams::GeometryParams
GeometryParams()=default
mvsim::Block::getMass
virtual double getMass() const
Definition: Block.h:80
mvsim::Simulable
Definition: Simulable.h:39
mvsim::Block::getElevationAt
std::optional< float > getElevationAt(const mrpt::math::TPoint2D &worldXY) const override
Definition: Block.cpp:597
mvsim::DummyInvisibleBlock::getMaxBlockRadius
virtual float getMaxBlockRadius() const
Definition: Block.h:268
mvsim::Block::GeometryParams::lx
float lx
Definition: Block.h:208
mvsim::GeometryType::Sphere
@ Sphere
mvsim::Block::GeometryParams::radius
float radius
Definition: Block.h:207
mvsim::Block::Ptr
std::shared_ptr< Block > Ptr
Definition: Block.h:53
mvsim::Block::getBox2DBlockBody
b2Body * getBox2DBlockBody()
Definition: Block.h:81
mvsim::Block::intangible_
bool intangible_
Definition: Block.h:174
mvsim::Block::getMaxBlockRadius
virtual float getMaxBlockRadius() const
Definition: Block.h:78
mvsim::Block::force_segments_for_rendering_
std::vector< mrpt::math::TSegment3D > force_segments_for_rendering_
Definition: Block.h:227
mvsim::Simulable::simul_pre_timestep
virtual void simul_pre_timestep(const TSimulContext &context)
Definition: Simulable.cpp:35
mvsim::Block::GeometryParams
Params for the <geometry> XML tag:
Definition: Block.h:200
mvsim::Block::ground_friction
double ground_friction() const
Definition: Block.h:105
mvsim::Block::simul_post_timestep
virtual void simul_post_timestep(const TSimulContext &context) override
Definition: Block.cpp:227
mvsim::Block::fixture_block_
b2Fixture * fixture_block_
Definition: Block.h:192
type
GLenum type
Definition: gl.h:1033
b2World
Definition: b2_world.h:46
mvsim::Block::lateral_friction_
double lateral_friction_
Default: 0.5.
Definition: Block.h:168
mvsim::DummyInvisibleBlock
Definition: Block.h:235
mvsim::Block::setBlockIndex
void setBlockIndex(size_t idx)
Definition: Block.h:99
mvsim::Block::block_com_
mrpt::math::TPoint2D block_com_
In local coordinates.
Definition: Block.h:166
VisualObject.h
mvsim::Block::GeometryParams::params
const TParameterDefinitions params
Definition: Block.h:211
b2_polygon_shape.h
mvsim::DummyInvisibleBlock::add_sensor
void add_sensor(const SensorBase::Ptr &sensor)
Definition: Block.h:273
mvsim::GeometryType::Box
@ Box
mvsim::VisualObject
Definition: VisualObject.h:35
SensorBase.h
mvsim::DummyInvisibleBlock::DummyInvisibleBlock
DummyInvisibleBlock(World *parent)
Definition: Block.cpp:431
ClassFactory.h
mvsim::TListSensors
std::vector< SensorBase::Ptr > TListSensors
Definition: SensorBase.h:113
mvsim::Block::blockShape
void blockShape(const mrpt::math::TPolygon2D &p)
Definition: Block.h:91
mvsim::Block::internalGuiUpdate
virtual void internalGuiUpdate(const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &viz, const mrpt::optional_ref< mrpt::opengl::COpenGLScene > &physical, bool childrenOnly) override
Definition: Block.cpp:232
mvsim::Block::GeometryParams::lz
float lz
Definition: Block.h:208
MRPT_FILL_ENUM_CUSTOM_NAME
MRPT_FILL_ENUM_CUSTOM_NAME(GeometryType::Cylinder, "cylinder")


mvsim
Author(s):
autogenerated on Wed May 28 2025 02:13:07