mc_rtc  2.16.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  { return load(module.name, module, params); }
90 
95  void load(const std::vector<std::shared_ptr<RobotModule>> & modules);
96 
101  void rename(const std::string & oldName, const std::string & newName);
102 
113  Robot & loadFromUrdf(const std::string & name,
114  const std::string & urdf,
115  const rbd::parsers::ParserParameters & parser_params = {},
116  const LoadRobotParameters & load_params = {});
117 
118  void robotCopy(const Robot & robot, const std::string & copyName);
119 
120  void removeRobot(const std::string & name);
121 
122  void removeRobot(unsigned int idx);
123 
125  /* End of Robot(s) loading/unloading functions group */
126 
127  const RobotModule & robotModule(size_t idx) const;
128 
130  const Robot & robot() const;
131 
132  Robot & env();
133  const Robot & env() const;
134 
135  Robot & robot(size_t idx);
136  const Robot & robot(size_t idx) const;
137 
138  Robot & robot(const std::string & name);
139  const Robot & robot(const std::string & name) const;
140 
147  iterator begin() noexcept;
148  const_iterator begin() const noexcept;
149  const_iterator cbegin() const noexcept;
150 
151  iterator end() noexcept;
152  const_iterator end() const noexcept;
153  const_iterator cend() const noexcept;
154 
155  reverse_iterator rbegin() noexcept;
156  const_reverse_iterator rbegin() const noexcept;
157  const_reverse_iterator crbegin() const noexcept;
158 
159  reverse_iterator rend() noexcept;
160  const_reverse_iterator rend() const noexcept;
161  const_reverse_iterator crend() const noexcept;
171  using onRobotAddedSigT = mc_rtc::Signal<std::string>;
173 
181  inline onRobotAddedSigT::Proxy onRobotAdded() const noexcept { return onRobotAdded_; }
182 
185 
193  inline onRobotRemovedSigT::Proxy onRobotRemoved() const noexcept { return onRobotRemoved_; }
201  size_type size() const noexcept;
202 
209  void reserve(size_type new_cap);
210 
215  inline mc_rbdyn::Robot & operator[](size_t idx)
216  {
217  assert(idx < robots_.size());
218  return *robots_[idx];
219  }
220 
225  inline const mc_rbdyn::Robot & operator[](size_t idx) const
226  {
227  assert(idx < robots_.size());
228  return *robots_[idx];
229  }
230 
235  inline mc_rbdyn::Robot & at(size_t idx)
236  {
237  assert(idx < robots_.size());
238  return *robots_.at(idx);
239  }
240 
245  inline const mc_rbdyn::Robot & at(size_t idx) const
246  {
247  assert(idx < robots_.size());
248  return *robots_.at(idx);
249  }
250 
252  inline static RobotsPtr make() noexcept { return std::make_shared<Robots>(NewRobotsToken{}); }
253 
255  template<class Deleter>
256  inline static RobotsPtr make(Deleter deleter) noexcept
257  { return std::shared_ptr<Robots>(new Robots{NewRobotsToken{}}, deleter); }
258 
263  void copy(mc_rbdyn::Robots & out) const;
264 
265 protected:
267  {
268  };
269 
270 public:
272 
273 protected:
274  Robots(const Robots & rhs) = delete;
275  Robots & operator=(const Robots & rhs) = delete;
276  Robots(Robots && robots) = delete;
277  Robots & operator=(Robots && robots) = delete;
278 
280  std::vector<RobotPtr> robots_;
281  std::vector<rbd::MultiBody> mbs_;
282  std::vector<rbd::MultiBodyConfig> mbcs_;
283  std::vector<rbd::MultiBodyGraph> mbgs_;
284  unsigned int robotIndex_;
285  unsigned int envIndex_;
287  std::unordered_map<std::string, unsigned int> robotNameToIndex_;
290 };
291 
292 /* Static pendant of the loader functions to create Robots directly */
294 
295 MC_RBDYN_DLLAPI RobotsPtr loadRobot(const std::string & name,
296  const RobotModule & module,
297  const LoadRobotParameters & params = {});
298 
299 MC_RBDYN_DLLAPI RobotsPtr loadRobots(const std::vector<std::shared_ptr<RobotModule>> & modules);
300 
302 
303 MC_RBDYN_DLLAPI RobotsPtr loadRobotFromUrdf(const std::string & name,
304  const std::string & urdf,
305  const rbd::parsers::ParserParameters & parser_params = {},
306  const LoadRobotParameters & load_params = {});
307 
308 } // 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:858
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: Robot.h:33
Definition: RobotModule.h:66
std::string name
Definition: RobotModule.h:774
Definition: Robot.h:63
Definition: Robots.h:267
Definition: Robots.h:17
size_type size() const noexcept
static RobotsPtr make(Deleter deleter) noexcept
Definition: Robots.h:256
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:280
void removeRobot(unsigned int idx)
RobotModuleVector robot_modules_
Definition: Robots.h:279
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:235
const mc_rbdyn::Robots & robots() const noexcept
Definition: Robots.h:55
Robots(NewRobotsToken)
std::vector< rbd::MultiBodyGraph > mbgs_
Definition: Robots.h:283
unsigned int robotIndex() const
const mc_rbdyn::Robot & operator[](size_t idx) const
Definition: Robots.h:225
Robot & load(const std::string &name, const RobotModule &module, const LoadRobotParameters &params={})
Robots(const Robots &rhs)=delete
onRobotAddedSigT onRobotAdded_
Definition: Robots.h:288
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:281
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:287
std::vector< rbd::MultiBodyConfig > & mbcs()
onRobotRemovedSigT onRobotRemoved_
Definition: Robots.h:289
std::reverse_iterator< iterator > reverse_iterator
Definition: Robots.h:30
static RobotsPtr make() noexcept
Definition: Robots.h:252
void copy(mc_rbdyn::Robots &out) const
const std::vector< rbd::MultiBodyConfig > & mbcs() const
unsigned int robotIndex_
Definition: Robots.h:284
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:193
Robot & robot(const std::string &name)
unsigned int envIndex_
Definition: Robots.h:285
std::vector< RobotPtr >::size_type size_type
Definition: Robots.h:32
const mc_rbdyn::Robot & at(size_t idx) const
Definition: Robots.h:245
std::vector< rbd::MultiBodyConfig > mbcs_
Definition: Robots.h:282
Definition: iterators.h:35
Definition: iterators.h:17
Definition: SignalSlot.h:111
Definition: shared.h:28