Simulable.h
Go to the documentation of this file.
1 /*+-------------------------------------------------------------------------+
2  | MultiVehicle 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_body.h>
13 #include <mrpt/math/TPoint2D.h>
14 #include <mrpt/math/TPose3D.h>
15 #include <mrpt/poses/CPose2D.h>
16 #include <mrpt/poses/CPose3DInterpolator.h>
17 #include <mvsim/basic_types.h>
18 
19 #include <shared_mutex>
20 
21 namespace mvsim
22 {
23 class Client;
24 class World;
25 class VisualObject;
26 
29 {
30  ParseSimulableParams() = default;
31 
32  bool init_pose_mandatory = true;
33 };
34 
39 class Simulable
40 {
41  public:
42  using Ptr = std::shared_ptr<Simulable>;
43 
44  Simulable(World* parent) : simulable_parent_(parent) {}
45 
48  virtual void simul_pre_timestep(const TSimulContext& context);
49 
55  virtual void simul_post_timestep(const TSimulContext& context);
56 
60  virtual void apply_force(
61  const mrpt::math::TVector2D& force,
62  const mrpt::math::TPoint2D& applyPoint = mrpt::math::TPoint2D(0, 0));
63 
64  virtual VisualObject* meAsVisualObject() { return nullptr; }
65 
67  mrpt::math::TTwist2D getVelocityLocal() const;
68 
71  mrpt::math::TPose3D getPose() const;
72 
77  virtual mrpt::math::TPose3D getRelativePose() const { return getPose(); }
78 
80  mrpt::math::TPose3D getPoseNoLock() const;
81 
82  mrpt::math::TTwist2D getTwist() const;
83 
88  mrpt::math::TVector3D getLinearAcceleration() const;
89 
92  void setPose(const mrpt::math::TPose3D& p, bool notifyChange = true) const;
93 
96  virtual void setRelativePose(const mrpt::math::TPose3D& p) { setPose(p); }
97 
98  void setTwist(const mrpt::math::TTwist2D& dq) const;
99 
101  mrpt::poses::CPose2D getCPose2D() const;
102 
104  mrpt::poses::CPose3D getCPose3D() const;
105 
107  const std::string& getName() const { return name_; }
108 
110  void setName(const std::string& s) { name_ = s; }
111 
113  bool isInCollision() const;
114 
118  bool hadCollision() const;
119 
121  void resetCollisionFlag();
122 
123  virtual void registerOnServer(mvsim::Client& c);
124 
125  const b2Body* b2d_body() const { return b2dBody_; }
126  b2Body* b2d_body() { return b2dBody_; }
127 
128  World* getSimulableWorldObject() { return simulable_parent_; }
129  const World* getSimulableWorldObject() const { return simulable_parent_; }
130 
131  virtual void freeOpenGLResources() {}
132 
137  virtual std::optional<float> getElevationAt(
138  [[maybe_unused]] const mrpt::math::TPoint2D& worldXY) const
139  {
140  return std::nullopt;
141  }
142 
143  protected:
145  std::string name_;
146 
152  b2Body* b2dBody_ = nullptr;
153 
154  bool parseSimulable(const JointXMLnode<>& node, const ParseSimulableParams& p = {});
155 
156  void internalHandlePublish(const TSimulContext& context);
157 
160  virtual void notifySimulableSetPose([[maybe_unused]] const mrpt::math::TPose3D& newPose)
161  {
162  // Default: do nothing
163  }
164 
165  private:
166  World* simulable_parent_ = nullptr;
167 
169  mutable std::shared_mutex q_mtx_;
170 
172  mrpt::math::TPose3D q_ = mrpt::math::TPose3D::Identity();
173 
175  mrpt::math::TTwist2D dq_{0, 0, 0};
176 
178  mrpt::math::TVector3D ddq_lin_{0, 0, 0};
179 
180  mrpt::math::TPose3D former_q_;
181 
182  // ============ ANIMATION VARIABLES ============
184  mrpt::math::TPose3D initial_q_ = mrpt::math::TPose3D::Identity();
185 
186  std::optional<mrpt::poses::CPose3DInterpolator> anim_keyframes_path_;
187 
188  // ============ END OF ANIMATION VARIABLES ============
189 
191  bool isInCollision_ = false;
192 
197  bool hadCollisionFlag_ = false;
198 
200  std::string publishPoseTopic_;
201 
202  std::string publishRelativePoseTopic_;
203  std::vector<std::string> publishRelativePoseOfOtherObjects_;
204 
205  double publishPosePeriod_ = 100e-3;
206  double publishPoseLastTime_ = 0;
207 };
208 } // namespace mvsim
mvsim
Definition: Client.h:21
mvsim::Simulable::getName
const std::string & getName() const
Definition: Simulable.h:107
mvsim::JointXMLnode
Definition: basic_types.h:53
mvsim::Simulable::getSimulableWorldObject
World * getSimulableWorldObject()
Definition: Simulable.h:128
mvsim::ParseSimulableParams::init_pose_mandatory
bool init_pose_mandatory
Definition: Simulable.h:32
mvsim::Simulable::Simulable
Simulable(World *parent)
Definition: Simulable.h:44
basic_types.h
mvsim::ParseSimulableParams::ParseSimulableParams
ParseSimulableParams()=default
s
XmlRpcServer s
mvsim::Simulable::getElevationAt
virtual std::optional< float > getElevationAt([[maybe_unused]] const mrpt::math::TPoint2D &worldXY) const
Definition: Simulable.h:137
mvsim::Simulable::getCPose3D
mrpt::poses::CPose3D getCPose3D() const
Alternative to getPose()
Definition: Simulable.cpp:157
mvsim::Client
Definition: Client.h:48
b2Body
A rigid body. These are created via b2World::CreateBody.
Definition: b2_body.h:128
mvsim::Simulable::getVelocityLocal
mrpt::math::TTwist2D getVelocityLocal() const
Definition: Simulable.cpp:141
mvsim::Simulable::hadCollision
bool hadCollision() const
Definition: Simulable.cpp:169
actionlib::SimpleActionClient
mvsim::Simulable::b2d_body
const b2Body * b2d_body() const
Definition: Simulable.h:125
mvsim::TSimulContext
Definition: basic_types.h:58
mvsim::Simulable::meAsVisualObject
virtual VisualObject * meAsVisualObject()
Definition: Simulable.h:64
mvsim::Simulable::setName
void setName(const std::string &s)
Definition: Simulable.h:110
mvsim::Simulable::simul_post_timestep
virtual void simul_post_timestep(const TSimulContext &context)
Definition: Simulable.cpp:64
mvsim::Simulable::setTwist
void setTwist(const mrpt::math::TTwist2D &dq) const
Definition: Simulable.cpp:510
mvsim::Simulable::name_
std::string name_
Definition: Simulable.h:145
mvsim::Simulable::Ptr
std::shared_ptr< Simulable > Ptr
Definition: Simulable.h:42
mvsim::Simulable::freeOpenGLResources
virtual void freeOpenGLResources()
Definition: Simulable.h:131
mvsim::Simulable::registerOnServer
virtual void registerOnServer(mvsim::Client &c)
Definition: Simulable.cpp:458
mvsim::Simulable::b2d_body
b2Body * b2d_body()
Definition: Simulable.h:126
mvsim::World
Definition: World.h:82
mvsim::Simulable::getLinearAcceleration
mrpt::math::TVector3D getLinearAcceleration() const
Definition: Simulable.cpp:504
mvsim::Simulable::setPose
void setPose(const mrpt::math::TPose3D &p, bool notifyChange=true) const
Definition: Simulable.cpp:474
mvsim::ParseSimulableParams
Definition: Simulable.h:28
mvsim::Simulable
Definition: Simulable.h:39
mvsim::Simulable::apply_force
virtual void apply_force(const mrpt::math::TVector2D &force, const mrpt::math::TPoint2D &applyPoint=mrpt::math::TPoint2D(0, 0))
Definition: Simulable.cpp:135
mvsim::Simulable::simul_pre_timestep
virtual void simul_pre_timestep(const TSimulContext &context)
Definition: Simulable.cpp:35
mvsim::Simulable::isInCollision
bool isInCollision() const
Definition: Simulable.cpp:163
mvsim::Simulable::resetCollisionFlag
void resetCollisionFlag()
Definition: Simulable.cpp:175
mvsim::Simulable::getPose
mrpt::math::TPose3D getPose() const
Definition: Simulable.cpp:490
mvsim::Simulable::getRelativePose
virtual mrpt::math::TPose3D getRelativePose() const
Definition: Simulable.h:77
mvsim::Simulable::getTwist
mrpt::math::TTwist2D getTwist() const
Definition: Simulable.cpp:498
mvsim::Simulable::getCPose2D
mrpt::poses::CPose2D getCPose2D() const
Alternative to getPose()
Definition: Simulable.cpp:150
mvsim::Simulable::setRelativePose
virtual void setRelativePose(const mrpt::math::TPose3D &p)
Definition: Simulable.h:96
mvsim::VisualObject
Definition: VisualObject.h:35
mvsim::Simulable::getPoseNoLock
mrpt::math::TPose3D getPoseNoLock() const
No thread-safe version. Used internally only.
Definition: Simulable.cpp:496
mvsim::Simulable::getSimulableWorldObject
const World * getSimulableWorldObject() const
Definition: Simulable.h:129
b2_body.h


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