mc_rtc  2.14.0
Robots.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-2022 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
7 #include <mc_rbdyn/Robot.h>
8 
9 #include <mc_rtc/SignalSlot.h>
10 #include <mc_rtc/iterators.h>
11 #include <mc_rtc/shared.h>
12 
13 namespace mc_rbdyn
14 {
15 
16 struct MC_RBDYN_DLLAPI Robots : public mc_rtc::shared<Robots>
17 {
18  friend struct Robot;
20 
21 public:
30  using reverse_iterator = std::reverse_iterator<iterator>;
31  using const_reverse_iterator = std::reverse_iterator<const_iterator>;
32  using size_type = std::vector<RobotPtr>::size_type;
36  const std::vector<mc_rbdyn::RobotModule> & robotModules() const;
37 
39  std::vector<rbd::MultiBody> & mbs();
41  const std::vector<rbd::MultiBody> & mbs() const;
42 
44  std::vector<rbd::MultiBodyConfig> & mbcs();
46  const std::vector<rbd::MultiBodyConfig> & mbcs() const;
47 
49  bool hasRobot(const std::string & name) const;
50 
52  inline mc_rbdyn::Robots & robots() noexcept { return *this; }
53 
55  inline const mc_rbdyn::Robots & robots() const noexcept { return *this; }
56 
58  unsigned int robotIndex() const;
60  unsigned int envIndex() const;
62  unsigned int robotIndex(const std::string & name) const;
63 
82  Robot & load(const std::string & name, const RobotModule & module, const LoadRobotParameters & params = {});
83 
88  inline Robot & load(const RobotModule & module, const LoadRobotParameters & params = {})
89  {
90  return load(module.name, module, params);
91  }
92 
97  void load(const std::vector<std::shared_ptr<RobotModule>> & modules);
98 
103  void rename(const std::string & oldName, const std::string & newName);
104 
115  Robot & loadFromUrdf(const std::string & name,
116  const std::string & urdf,
117  const rbd::parsers::ParserParameters & parser_params = {},
118  const LoadRobotParameters & load_params = {});
119 
120  void robotCopy(const Robot & robot, const std::string & copyName);
121 
122  void removeRobot(const std::string & name);
123 
124  void removeRobot(unsigned int idx);
125 
127  /* End of Robot(s) loading/unloading functions group */
128 
129  const RobotModule & robotModule(size_t idx) const;
130 
132  const Robot & robot() const;
133 
134  Robot & env();
135  const Robot & env() const;
136 
137  Robot & robot(size_t idx);
138  const Robot & robot(size_t idx) const;
139 
140  Robot & robot(const std::string & name);
141  const Robot & robot(const std::string & name) const;
142 
149  iterator begin() noexcept;
150  const_iterator begin() const noexcept;
151  const_iterator cbegin() const noexcept;
152 
153  iterator end() noexcept;
154  const_iterator end() const noexcept;
155  const_iterator cend() const noexcept;
156 
157  reverse_iterator rbegin() noexcept;
158  const_reverse_iterator rbegin() const noexcept;
159  const_reverse_iterator crbegin() const noexcept;
160 
161  reverse_iterator rend() noexcept;
162  const_reverse_iterator rend() const noexcept;
163  const_reverse_iterator crend() const noexcept;
173  using onRobotAddedSigT = mc_rtc::Signal<std::string>;
175 
183  inline onRobotAddedSigT::Proxy onRobotAdded() const noexcept { return onRobotAdded_; }
184 
187 
195  inline onRobotRemovedSigT::Proxy onRobotRemoved() const noexcept { return onRobotRemoved_; }
203  size_type size() const noexcept;
204 
211  void reserve(size_type new_cap);
212 
217  inline mc_rbdyn::Robot & operator[](size_t idx)
218  {
219  assert(idx < robots_.size());
220  return *robots_[idx];
221  }
222 
227  inline const mc_rbdyn::Robot & operator[](size_t idx) const
228  {
229  assert(idx < robots_.size());
230  return *robots_[idx];
231  }
232 
237  inline mc_rbdyn::Robot & at(size_t idx)
238  {
239  assert(idx < robots_.size());
240  return *robots_.at(idx);
241  }
242 
247  inline const mc_rbdyn::Robot & at(size_t idx) const
248  {
249  assert(idx < robots_.size());
250  return *robots_.at(idx);
251  }
252 
254  inline static RobotsPtr make() noexcept { return std::make_shared<Robots>(NewRobotsToken{}); }
255 
257  template<class Deleter>
258  inline static RobotsPtr make(Deleter deleter) noexcept
259  {
260  return std::shared_ptr<Robots>(new Robots{NewRobotsToken{}}, deleter);
261  }
262 
267  void copy(mc_rbdyn::Robots & out) const;
268 
269 protected:
271  {
272  };
273 
274 public:
276 
277 protected:
278  Robots(const Robots & rhs) = delete;
279  Robots & operator=(const Robots & rhs) = delete;
280  Robots(Robots && robots) = delete;
281  Robots & operator=(Robots && robots) = delete;
282 
284  std::vector<RobotPtr> robots_;
285  std::vector<rbd::MultiBody> mbs_;
286  std::vector<rbd::MultiBodyConfig> mbcs_;
287  std::vector<rbd::MultiBodyGraph> mbgs_;
288  unsigned int robotIndex_;
289  unsigned int envIndex_;
291  std::unordered_map<std::string, unsigned int> robotNameToIndex_;
294 };
295 
296 /* Static pendant of the loader functions to create Robots directly */
298 
299 MC_RBDYN_DLLAPI RobotsPtr loadRobot(const std::string & name,
300  const RobotModule & module,
301  const LoadRobotParameters & params = {});
302 
303 MC_RBDYN_DLLAPI RobotsPtr loadRobots(const std::vector<std::shared_ptr<RobotModule>> & modules);
304 
306 
307 MC_RBDYN_DLLAPI RobotsPtr loadRobotFromUrdf(const std::string & name,
308  const std::string & urdf,
309  const rbd::parsers::ParserParameters & parser_params = {},
310  const LoadRobotParameters & load_params = {});
311 
312 } // namespace mc_rbdyn
#define MC_RBDYN_DLLAPI
Definition: api.h:50
void load(Archive &ar, Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > &m, const unsigned int)
Definition: generic_gripper.h:15
MC_RBDYN_DLLAPI RobotsPtr loadRobotFromUrdf(const std::string &name, const std::string &urdf, const rbd::parsers::ParserParameters &parser_params={}, const LoadRobotParameters &load_params={})
MC_RBDYN_DLLAPI RobotsPtr loadRobots(const std::vector< std::shared_ptr< RobotModule >> &modules)
MC_RBDYN_DLLAPI RobotsPtr loadRobot(const RobotModule &module, const LoadRobotParameters &params={})
std::vector< RobotModule, Eigen::aligned_allocator< RobotModule > > RobotModuleVector
Definition: RobotModule.h:863
MC_RBDYN_DLLAPI RobotsPtr loadRobotAndEnv(const RobotModule &module, const RobotModule &envModule)
std::shared_ptr< Robots > RobotsPtr
Definition: fwd.h:17
Definition: Contact.h:88
Definition: Contact.h:67
Definition: Robot.h:33
Definition: RobotModule.h:66
std::string name
Definition: RobotModule.h:779
Definition: Robot.h:63
Definition: Robots.h:271
Definition: Robots.h:17
size_type size() const noexcept
static RobotsPtr make(Deleter deleter) noexcept
Definition: Robots.h:258
bool hasRobot(const std::string &name) const
const Robot & robot() const
unsigned int robotIndex(const std::string &name) const
void rename(const std::string &oldName, const std::string &newName)
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: Robots.h:31
std::vector< RobotPtr > robots_
Definition: Robots.h:284
void removeRobot(unsigned int idx)
RobotModuleVector robot_modules_
Definition: Robots.h:283
const Robot & robot(size_t idx) const
unsigned int envIndex() const
Robot & load(const RobotModule &module, const LoadRobotParameters &params={})
Definition: Robots.h:88
Robots & operator=(Robots &&robots)=delete
void removeRobot(const std::string &name)
Robot & loadFromUrdf(const std::string &name, const std::string &urdf, const rbd::parsers::ParserParameters &parser_params={}, const LoadRobotParameters &load_params={})
mc_rbdyn::Robot & at(size_t idx)
Definition: Robots.h:237
const mc_rbdyn::Robots & robots() const noexcept
Definition: Robots.h:55
Robots(NewRobotsToken)
std::vector< rbd::MultiBodyGraph > mbgs_
Definition: Robots.h:287
unsigned int robotIndex() const
const mc_rbdyn::Robot & operator[](size_t idx) const
Definition: Robots.h:227
Robot & load(const std::string &name, const RobotModule &module, const LoadRobotParameters &params={})
Robots(const Robots &rhs)=delete
onRobotAddedSigT onRobotAdded_
Definition: Robots.h:292
void robotCopy(const Robot &robot, const std::string &copyName)
Robot & robot(size_t idx)
mc_rbdyn::Robots & robots() noexcept
Definition: Robots.h:52
std::vector< rbd::MultiBody > mbs_
Definition: Robots.h:285
const Robot & env() const
Robots(Robots &&robots)=delete
iterator begin() noexcept
const RobotModule & robotModule(size_t idx) const
Robots & operator=(const Robots &rhs)=delete
const std::vector< rbd::MultiBody > & mbs() const
std::unordered_map< std::string, unsigned int > robotNameToIndex_
Correspondance between robot name and index.
Definition: Robots.h:291
std::vector< rbd::MultiBodyConfig > & mbcs()
onRobotRemovedSigT onRobotRemoved_
Definition: Robots.h:293
std::reverse_iterator< iterator > reverse_iterator
Definition: Robots.h:30
static RobotsPtr make() noexcept
Definition: Robots.h:254
void copy(mc_rbdyn::Robots &out) const
const std::vector< rbd::MultiBodyConfig > & mbcs() const
unsigned int robotIndex_
Definition: Robots.h:288
std::vector< rbd::MultiBody > & mbs()
const std::vector< mc_rbdyn::RobotModule > & robotModules() const
void load(const std::vector< std::shared_ptr< RobotModule >> &modules)
const Robot & robot(const std::string &name) const
onRobotRemovedSigT::Proxy onRobotRemoved() const noexcept
Definition: Robots.h:195
Robot & robot(const std::string &name)
unsigned int envIndex_
Definition: Robots.h:289
std::vector< RobotPtr >::size_type size_type
Definition: Robots.h:32
const mc_rbdyn::Robot & at(size_t idx) const
Definition: Robots.h:247
std::vector< rbd::MultiBodyConfig > mbcs_
Definition: Robots.h:286
Definition: iterators.h:35
Definition: iterators.h:17
Definition: SignalSlot.h:113
Definition: shared.h:28