Block.h
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | Multiblock simulator (libmvsim) |
3  | |
4  | Copyright (C) 2014-2023 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 <mvsim/ClassFactory.h>
23 #include <mvsim/Simulable.h>
25 #include <mvsim/VisualObject.h>
26 #include <mvsim/basic_types.h>
27 
28 #include <mutex>
29 
30 namespace mvsim
31 {
34 class Block : public VisualObject, public Simulable
35 {
36  public:
37  using Ptr = std::shared_ptr<Block>;
38 
41  static Ptr factory(World* parent, const rapidxml::xml_node<char>* xml_node);
43  static Ptr factory(World* parent, const std::string& xml_text);
44 
47  static void register_block_class(const rapidxml::xml_node<char>* xml_node);
48 
49  // ------- Interface with "World" ------
50  virtual void simul_pre_timestep(const TSimulContext& context) override;
51  virtual void simul_post_timestep(const TSimulContext& context) override;
52  virtual void apply_force(
53  const mrpt::math::TVector2D& force,
54  const mrpt::math::TPoint2D& applyPoint =
55  mrpt::math::TPoint2D(0, 0)) override;
56 
59  virtual void create_multibody_system(b2World& world);
60 
63  virtual float getMaxBlockRadius() const { return maxRadius_; }
65  virtual double getMass() const { return mass_; }
66  b2Body* getBox2DBlockBody() { return b2dBody_; }
67  mrpt::math::TPoint2D getBlockCenterOfMass() const
68  {
69  return block_com_;
70  }
71 
74  const mrpt::math::TPolygon2D& blockShape() const { return block_poly_; }
75 
76  void blockShape(const mrpt::math::TPolygon2D& p)
77  {
78  block_poly_ = p;
80  gl_block_.reset(); // regenerate 3D view
81  }
82 
84  void setBlockIndex(size_t idx) { blockIndex_ = idx; }
86  size_t getBlockIndex() const { return blockIndex_; }
87 
88  Block(World* parent);
89 
90  double ground_friction() const { return groundFriction_; }
91  void ground_friction(double newValue) { groundFriction_ = newValue; }
92 
93  double mass() const { return mass_; }
94  void mass(double newValue) { mass_ = newValue; }
95 
96  bool isStatic() const;
97  void setIsStatic(bool b);
98 
99  const mrpt::img::TColor block_color() const { return block_color_; }
100  void block_color(const mrpt::img::TColor& c)
101  {
102  block_color_ = c;
103  gl_block_.reset(); // regenerate 3D view
104  }
105 
106  double block_z_min() const { return block_z_min_; }
107  double block_z_max() const { return block_z_max_; }
108  void block_z_min(double v)
109  {
110  block_z_min_ = v;
111  gl_block_.reset(); // regenerate 3D view
112  }
113  void block_z_max(double v)
114  {
115  block_z_max_ = v;
116  gl_block_.reset(); // regenerate 3D view
117  }
118 
121  bool default_block_z_min_max() const;
122 
123  VisualObject* meAsVisualObject() override { return this; }
124 
125  protected:
126  virtual void internalGuiUpdate(
127  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
128  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
129  bool childrenOnly) override;
130 
133  size_t blockIndex_ = 0;
134 
135  std::vector<b2FrictionJoint*> friction_joints_;
136 
137  // Block info:
138  double mass_ = 30.0;
139  bool isStatic_ = false;
140  mrpt::math::TPolygon2D block_poly_;
141 
144  double maxRadius_;
145 
146  double block_z_min_ = std::numeric_limits<double>::quiet_NaN(),
147  block_z_max_ = std::numeric_limits<double>::quiet_NaN();
148 
149  mrpt::img::TColor block_color_{0x00, 0x00, 0xff};
150  mrpt::math::TPoint2D block_com_{.0, .0};
151 
152  double lateral_friction_ = 0.5;
153  double groundFriction_ = 0.5;
154  double restitution_ = 0.01;
155 
158  bool intangible_ = false;
159 
161  {"mass", {"%lf", &mass_}},
162  {"zmin", {"%lf", &block_z_min_}},
163  {"zmax", {"%lf", &block_z_max_}},
164  {"ground_friction", {"%lf", &groundFriction_}},
165  {"lateral_friction", {"%lf", &lateral_friction_}},
166  {"restitution", {"%lf", &restitution_}},
167  {"color", {"%color", &block_color_}},
168  {"intangible", {"%bool", &intangible_}},
169  {"static", {"%bool", &isStatic_}}
170  //
171  };
172 
174 
175  // Box2D elements:
177 
178  private:
179  void internal_internalGuiUpdate_forces(mrpt::opengl::COpenGLScene& scene);
180 
181  void internal_parseGeometry(const rapidxml::xml_node<char>& xml_geom_node);
182 
183  mrpt::opengl::CSetOfObjects::Ptr gl_block_;
184  mrpt::opengl::CSetOfLines::Ptr gl_forces_;
186  std::vector<mrpt::math::TSegment3D> force_segments_for_rendering_;
187 
188 }; // end Block
189 
192 {
193  public:
194  using Ptr = std::shared_ptr<DummyInvisibleBlock>;
195 
197 
200  static Ptr factory(World* parent, const rapidxml::xml_node<char>* xml_node);
202  static Ptr factory(World* parent, const std::string& xml_text);
203 
204  // ------- Interface with "World" ------
205  virtual void simul_pre_timestep(const TSimulContext& context) override
206  {
208  for (auto& s : sensors_) s->simul_pre_timestep(context);
209  }
210  virtual void simul_post_timestep(const TSimulContext& context) override
211  {
213  for (auto& s : sensors_) s->simul_post_timestep(context);
214  }
215 
216  virtual void apply_force(
217  [[maybe_unused]] const mrpt::math::TVector2D& force,
218  [[maybe_unused]] const mrpt::math::TPoint2D& applyPoint) override
219  {
220  }
221 
223 
224  virtual float getMaxBlockRadius() const { return 0; }
225 
227  virtual double getMass() const { return 0; }
228 
229  void add_sensor(const SensorBase::Ptr& sensor)
230  {
231  sensors_.push_back(sensor);
232  }
233 
234  protected:
235  void internalGuiUpdate(
236  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& viz,
237  const mrpt::optional_ref<mrpt::opengl::COpenGLScene>& physical,
238  [[maybe_unused]] bool childrenOnly) override;
239 
240  void registerOnServer(mvsim::Client& c) override
241  {
242  // register myself, and my children objects:
244  for (auto& sensor : sensors_) sensor->registerOnServer(c);
245  }
246 
247  private:
249 
250 }; // end Block
251 
252 } // namespace mvsim
void blockShape(const mrpt::math::TPolygon2D &p)
Definition: Block.h:76
virtual void create_multibody_system(b2World &)
Definition: Block.h:222
double block_z_max() const
Definition: Block.h:107
mrpt::math::TPoint2D block_com_
In local coordinates.
Definition: Block.h:150
std::vector< b2FrictionJoint * > friction_joints_
Definition: Block.h:135
mrpt::opengl::CSetOfLines::Ptr gl_forces_
Definition: Block.h:184
bool intangible_
Definition: Block.h:158
b2Fixture * fixture_block_
Definition: Block.h:176
size_t blockIndex_
Definition: Block.h:133
mrpt::opengl::CSetOfObjects::Ptr gl_block_
Definition: Block.h:183
std::vector< SensorBase::Ptr > TListSensors
Definition: SensorBase.h:110
std::map< std::string, TParamEntry > TParameterDefinitions
void updateMaxRadiusFromPoly()
Definition: Block.cpp:319
bool default_block_z_min_max() const
Definition: Block.cpp:541
mrpt::img::TColor block_color_
Definition: Block.h:149
double mass_
Definition: Block.h:138
XmlRpcServer s
double restitution_
Default: 0.01.
Definition: Block.h:154
virtual float getMaxBlockRadius() const
Definition: Block.h:224
std::vector< mrpt::math::TSegment3D > force_segments_for_rendering_
Definition: Block.h:186
void block_z_min(double v)
Definition: Block.h:108
virtual void apply_force(const mrpt::math::TVector2D &force, const mrpt::math::TPoint2D &applyPoint=mrpt::math::TPoint2D(0, 0)) override
Definition: Block.cpp:426
static Ptr factory(World *parent, const rapidxml::xml_node< char > *xml_node)
Definition: Block.cpp:72
static void register_block_class(const rapidxml::xml_node< char > *xml_node)
Definition: Block.cpp:52
bool isStatic_
Definition: Block.h:139
void setIsStatic(bool b)
Definition: Block.cpp:444
double lateral_friction_
Default: 0.5.
Definition: Block.h:152
double mass() const
Definition: Block.h:93
double ground_friction() const
Definition: Block.h:90
size_t getBlockIndex() const
Definition: Block.h:86
void mass(double newValue)
Definition: Block.h:94
b2Body * getBox2DBlockBody()
Definition: Block.h:66
const TParameterDefinitions params_
Definition: Block.h:160
std::shared_ptr< Block > Ptr
Definition: Block.h:37
virtual void simul_pre_timestep(const TSimulContext &context) override
Definition: Block.h:205
A rigid body. These are created via b2World::CreateBody.
Definition: b2_body.h:128
mrpt::math::TPolygon2D block_poly_
Definition: Block.h:140
const mrpt::math::TPolygon2D & blockShape() const
Definition: Block.h:74
VisualObject * meAsVisualObject() override
Definition: Block.h:123
double block_z_max_
Definition: Block.h:147
std::shared_ptr< SensorBase > Ptr
Definition: SensorBase.h:29
virtual void create_multibody_system(b2World &world)
Definition: Block.cpp:332
TListSensors sensors_
Sensors aboard.
Definition: Block.h:248
virtual double getMass() const
Definition: Block.h:227
virtual void apply_force([[maybe_unused]] const mrpt::math::TVector2D &force, [[maybe_unused]] const mrpt::math::TPoint2D &applyPoint) override
Definition: Block.h:216
void internal_parseGeometry(const rapidxml::xml_node< char > &xml_geom_node)
Definition: Block.cpp:467
std::shared_ptr< DummyInvisibleBlock > Ptr
Definition: Block.h:194
virtual void registerOnServer(mvsim::Client &c)
Definition: Simulable.cpp:406
void block_color(const mrpt::img::TColor &c)
Definition: Block.h:100
virtual void simul_post_timestep(const TSimulContext &context)
Definition: Simulable.cpp:59
double block_z_min() const
Definition: Block.h:106
bool isStatic() const
Definition: Block.cpp:437
virtual void simul_pre_timestep(const TSimulContext &context) override
Definition: Block.cpp:237
void registerOnServer(mvsim::Client &c) override
Definition: Block.h:240
virtual void simul_pre_timestep(const TSimulContext &context)
Definition: Simulable.cpp:30
void block_z_max(double v)
Definition: Block.h:113
virtual float getMaxBlockRadius() const
Definition: Block.h:63
void internal_internalGuiUpdate_forces(mrpt::opengl::COpenGLScene &scene)
Definition: Block.cpp:303
void setBlockIndex(size_t idx)
Definition: Block.h:84
double maxRadius_
Definition: Block.h:144
double groundFriction_
Default: 0.5.
Definition: Block.h:153
virtual void simul_post_timestep(const TSimulContext &context) override
Definition: Block.cpp:244
double block_z_min_
Definition: Block.h:146
void add_sensor(const SensorBase::Ptr &sensor)
Definition: Block.h:229
virtual double getMass() const
Definition: Block.h:65
Block(World *parent)
Definition: Block.cpp:40
mrpt::math::TPoint2D getBlockCenterOfMass() const
In local coordinates.
Definition: Block.h:67
virtual void simul_post_timestep(const TSimulContext &context) override
Definition: Block.h:210
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:249
const mrpt::img::TColor block_color() const
Definition: Block.h:99
std::mutex force_segments_for_rendering_cs_
Definition: Block.h:185
void ground_friction(double newValue)
Definition: Block.h:91


mvsim
Author(s):
autogenerated on Tue Jul 4 2023 03:08:19