mc_rtc  2.16.0
Robot.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/RobotData.h>
8 #include <mc_rbdyn/RobotFrame.h>
9 #include <mc_rbdyn/RobotModule.h>
10 #include <mc_rbdyn/Surface.h>
11 
13 
14 #include <mc_tvm/fwd.h>
15 
16 #include <RBDyn/MultiBody.h>
17 #include <RBDyn/MultiBodyConfig.h>
18 #include <RBDyn/MultiBodyGraph.h>
19 
20 #include <memory>
21 #include <optional>
22 #include <unordered_map>
23 
24 namespace mc_rbdyn
25 {
26 
27 struct Robots;
28 
29 struct Robot;
30 
33 {
34  friend struct Robot;
35 
36 private:
38  std::optional<sva::PTransformd> base_tf_ = std::nullopt;
40  std::optional<std::string> base_ = std::nullopt;
42  bool warn_on_missing_files_ = false;
44  RobotDataPtr data_ = nullptr;
45 
46 public:
47 #define MAKE_LOAD_ROBOT_PARAMETER_SETTER(T, NAME) \
48  inline LoadRobotParameters & NAME(T value) noexcept \
49  { \
50  NAME##_ = value; \
51  return *this; \
52  }
53 
55  MAKE_LOAD_ROBOT_PARAMETER_SETTER(std::string_view, base)
56  MAKE_LOAD_ROBOT_PARAMETER_SETTER(bool, warn_on_missing_files)
58 
59 #undef MAKE_LOAD_ROBOT_PARAMETER_SETTER
60 };
61 
63 {
64  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
65  friend struct Robots;
66 
67 public:
68  using convex_pair_t = std::pair<std::string, S_ObjectPtr>;
69 
70 public:
71  Robot(Robot &&);
73 
74  ~Robot();
75 
81  const std::string & name() const;
82 
84  const RobotModule & module() const;
85 
94  inline const BodySensor & bodySensor() const noexcept { return data_->bodySensors[0]; }
95 
100  void addBodySensor(const BodySensor & sensor);
101 
107  inline bool hasBodySensor(const std::string & name) const noexcept
108  { return data_->bodySensorsIndex.count(name) != 0; }
109 
115  inline bool bodyHasBodySensor(const std::string & body) const noexcept
116  { return data_->bodyBodySensors.count(body) != 0; }
117 
125  const BodySensor & bodySensor(const std::string & name) const;
126 
134  const BodySensor & bodyBodySensor(const std::string & name) const;
135 
137  inline const BodySensorVector & bodySensors() const noexcept { return data_->bodySensors; }
138 
140  /* End of Body sensors group */
141 
147  inline bool jointHasJointSensor(const std::string & joint) const noexcept
148  { return data()->jointJointSensors.count(joint) != 0; }
149 
157  const JointSensor & jointJointSensor(const std::string & joint) const;
158 
160  inline const std::vector<JointSensor> & jointSensors() const noexcept { return data_->jointSensors; }
161 
163  /* End of Joint sensors group */
164 
166  bool hasJoint(const std::string & name) const;
167 
169  bool hasBody(const std::string & name) const;
170 
172  inline bool hasFrame(const std::string & name) const noexcept { return frames_.count(name) != 0; }
173 
178  inline const RobotFrame & frame(const std::string & name) const
179  {
180  auto it = frames_.find(name);
181  if(it != frames_.end()) { return *it->second; }
182  mc_rtc::log::error_and_throw("No frame named {} in {}", name, name_);
183  }
184 
189  inline RobotFrame & frame(const std::string & name)
190  { return const_cast<RobotFrame &>(static_cast<const Robot *>(this)->frame(name)); }
191 
193  std::vector<std::string> frames() const;
194 
209  RobotFrame & makeFrame(const std::string & name, RobotFrame & parent, sva::PTransformd X_p_f, bool baked = false);
210 
229  RobotFramePtr makeTemporaryFrame(const std::string & name,
230  const RobotFrame & parent,
231  sva::PTransformd X_p_f,
232  bool baked = false) const;
233 
241  void makeFrames(std::vector<mc_rbdyn::RobotModule::FrameDescription> frames);
242 
247  unsigned int jointIndexByName(const std::string & name) const;
248 
261  int jointIndexInMBC(size_t jointIndex) const;
262 
267  unsigned int bodyIndexByName(const std::string & name) const;
268 
272  const rbd::MultiBody & mb() const;
273 
277  const rbd::MultiBodyConfig & mbc() const;
278 
282  const rbd::MultiBodyGraph & mbg() const;
283 
285  const std::vector<std::vector<double>> & q() const;
287  const std::vector<std::vector<double>> & alpha() const;
289  const std::vector<std::vector<double>> & alphaD() const;
291  const std::vector<std::vector<double>> & jointTorque() const;
293  inline const std::vector<std::vector<double>> & controlTorque() const noexcept { return jointTorque(); }
295  const std::vector<sva::PTransformd> & bodyPosW() const;
297  const std::vector<sva::MotionVecd> & bodyVelW() const;
299  const std::vector<sva::MotionVecd> & bodyVelB() const;
301  const std::vector<sva::MotionVecd> & bodyAccB() const;
303  std::vector<std::vector<double>> & q();
305  std::vector<std::vector<double>> & alpha();
307  std::vector<std::vector<double>> & alphaD();
309  std::vector<std::vector<double>> & jointTorque();
311  inline std::vector<std::vector<double>> & controlTorque() noexcept { return jointTorque(); }
313  std::vector<sva::PTransformd> & bodyPosW();
315  std::vector<sva::MotionVecd> & bodyVelW();
317  std::vector<sva::MotionVecd> & bodyVelB();
319  std::vector<sva::MotionVecd> & bodyAccB();
320 
325  const sva::PTransformd & bodyPosW(const std::string & name) const;
326 
333  sva::PTransformd X_b1_b2(const std::string & b1, const std::string & b2) const;
334 
339  const sva::MotionVecd & bodyVelW(const std::string & name) const;
340 
345  const sva::MotionVecd & bodyVelB(const std::string & name) const;
346 
351  const sva::MotionVecd & bodyAccB(const std::string & name) const;
352 
354  Eigen::Vector3d com() const;
356  Eigen::Vector3d comVelocity() const;
358  Eigen::Vector3d comAcceleration() const;
359 
373  sva::ForceVecd surfaceWrench(const std::string & surfaceName) const;
374 
388  sva::ForceVecd bodyWrench(const std::string & bodyName) const;
389 
401  Eigen::Vector2d cop(const std::string & frame, double min_pressure = 0.5) const;
402 
414  Eigen::Vector3d copW(const std::string & frame, double min_pressure = 0.5) const;
415 
423  sva::ForceVecd netWrench(const std::vector<std::string> & sensorNames) const;
424 
445  Eigen::Vector3d zmp(const sva::ForceVecd & netTotalWrench,
446  const Eigen::Vector3d & plane_p,
447  const Eigen::Vector3d & plane_n,
448  double minimalNetNormalForce = 1.) const;
449 
465  bool zmp(Eigen::Vector3d & zmpOut,
466  const sva::ForceVecd & netTotalWrench,
467  const Eigen::Vector3d & plane_p,
468  const Eigen::Vector3d & plane_n,
469  double minimalNetNormalForce = 1.) const noexcept;
470 
486  Eigen::Vector3d zmp(const sva::ForceVecd & netTotalWrench,
487  const sva::PTransformd & zmpFrame,
488  double minimalNetNormalForce = 1.) const;
489 
506  bool zmp(Eigen::Vector3d & zmpOut,
507  const sva::ForceVecd & netTotalWrench,
508  const sva::PTransformd & zmpFrame,
509  double minimalNetNormalForce = 1.) const noexcept;
510 
517  Eigen::Vector3d zmp(const std::vector<std::string> & sensorNames,
518  const Eigen::Vector3d & plane_p,
519  const Eigen::Vector3d & plane_n,
520  double minimalNetNormalForce = 1.) const;
521 
528  bool zmp(Eigen::Vector3d & zmpOut,
529  const std::vector<std::string> & sensorNames,
530  const Eigen::Vector3d & plane_p,
531  const Eigen::Vector3d & plane_n,
532  double minimalNetNormalForce = 1.) const noexcept;
533 
541  Eigen::Vector3d zmp(const std::vector<std::string> & sensorNames,
542  const sva::PTransformd & zmpFrame,
543  double minimalNetNormalForce = 1.) const;
544 
552  bool zmp(Eigen::Vector3d & zmpOut,
553  const std::vector<std::string> & sensorNames,
554  const sva::PTransformd & zmpFrame,
555  double minimalNetNormalForce = 1.) const noexcept;
556 
558  const std::vector<std::vector<double>> & ql() const;
560  const std::vector<std::vector<double>> & qu() const;
562  const std::vector<std::vector<double>> & vl() const;
564  const std::vector<std::vector<double>> & vu() const;
566  const std::vector<std::vector<double>> & al() const;
568  const std::vector<std::vector<double>> & au() const;
570  const std::vector<std::vector<double>> & jl() const;
572  const std::vector<std::vector<double>> & ju() const;
574  const std::vector<std::vector<double>> & tl() const;
576  const std::vector<std::vector<double>> & tu() const;
578  const std::vector<std::vector<double>> & tdl() const;
580  const std::vector<std::vector<double>> & tdu() const;
582  std::vector<std::vector<double>> & ql();
584  std::vector<std::vector<double>> & qu();
586  std::vector<std::vector<double>> & vl();
588  std::vector<std::vector<double>> & vu();
590  std::vector<std::vector<double>> & al();
592  std::vector<std::vector<double>> & au();
594  std::vector<std::vector<double>> & jl();
596  std::vector<std::vector<double>> & ju();
598  std::vector<std::vector<double>> & tl();
600  std::vector<std::vector<double>> & tu();
602  std::vector<std::vector<double>> & tdl();
604  std::vector<std::vector<double>> & tdu();
605 
607  const std::vector<Flexibility> & flexibility() const;
609  std::vector<Flexibility> & flexibility();
610 
618  void zmpTarget(const Eigen::Vector3d & zmp);
619 
624  const Eigen::Vector3d & zmpTarget() const;
625 
627  inline double mass() const noexcept { return mass_; }
628 
637  inline const std::vector<double> & encoderValues() const noexcept { return data_->encoderValues; }
638 
640  inline const std::vector<double> & encoderVelocities() const noexcept { return data_->encoderVelocities; }
641 
643  inline const std::vector<double> & jointTorques() const noexcept { return data_->jointTorques; }
644 
646  inline const std::vector<std::string> & refJointOrder() const { return data_->refJointOrder; }
647 
649  /* End Joints sensors section */
650 
670 
677  inline bool hasForceSensor(const std::string & name) const noexcept
678  { return data_->forceSensorsIndex.count(name) != 0; }
679 
690  inline bool bodyHasForceSensor(const std::string & body) const noexcept
691  { return data_->bodyForceSensors_.count(body) != 0; }
692 
706  inline bool surfaceHasForceSensor(const std::string & surface) const
707  { return bodyHasForceSensor(this->surface(surface).bodyName()); }
708 
718  inline bool bodyHasIndirectForceSensor(const std::string & body) const
719  { return bodyHasForceSensor(body) || findIndirectForceSensorBodyName(body).empty(); }
720 
729  inline bool surfaceHasIndirectForceSensor(const std::string & surface) const
730  { return bodyHasIndirectForceSensor(this->surface(surface).bodyName()); }
731 
741  const ForceSensor & forceSensor(const std::string & name) const;
742 
754  const ForceSensor & bodyForceSensor(const std::string & body) const;
755 
760  const ForceSensor * findBodyForceSensor(const std::string & body) const;
761 
773  const ForceSensor & surfaceForceSensor(const std::string & surfaceName) const;
774 
785  const ForceSensor & indirectBodyForceSensor(const std::string & body) const;
786 
799  const ForceSensor & indirectSurfaceForceSensor(const std::string & surface) const;
800 
802  inline const std::vector<ForceSensor> & forceSensors() const noexcept { return data_->forceSensors; }
803 
805  /* End of Force sensors group */
806 
821  template<typename T>
822  bool hasDevice(const std::string & name) const noexcept;
823 
825  template<typename T>
826  inline bool hasSensor(const std::string & name) const noexcept
827  { return hasDevice<T>(name); }
828 
840  template<typename T>
841  const T & device(const std::string & name) const;
842 
844  template<typename T>
845  T & device(const std::string & name)
846  { return const_cast<T &>(const_cast<const Robot *>(this)->device<T>(name)); }
847 
849  inline const DevicePtrVector & devices() const noexcept { return data_->devices; }
850 
852  template<typename T>
853  inline const T & sensor(const std::string & name) const
854  { return device<T>(name); }
855 
857  template<typename T>
858  inline T & sensor(const std::string & name)
859  { return device<T>(name); }
860 
862  void addDevice(DevicePtr device);
863 
865  inline void addSensor(SensorPtr sensor) { addDevice(std::move(sensor)); }
866 
868  /* End of Devices group */
869 
874  bool hasSurface(const std::string & surface) const;
875 
877  mc_rbdyn::Surface & surface(const std::string & sName);
879  const mc_rbdyn::Surface & surface(const std::string & sName) const;
880 
886  sva::PTransformd surfacePose(const std::string & sName) const;
887 
889  mc_rbdyn::Surface & copySurface(const std::string & sName, const std::string & name);
890 
892  void addSurface(mc_rbdyn::SurfacePtr surface, bool doNotReplace = true);
893 
895  const std::map<std::string, mc_rbdyn::SurfacePtr> & surfaces() const;
896 
898  std::vector<std::string> availableSurfaces() const;
899 
904  bool hasConvex(const std::string & name) const;
905 
911  convex_pair_t & convex(const std::string & cName);
913  const convex_pair_t & convex(const std::string & cName) const;
914 
919  const std::map<std::string, convex_pair_t> & convexes() const;
920 
934  void addConvex(const std::string & name,
935  const std::string & body,
936  S_ObjectPtr convex,
937  const sva::PTransformd & X_b_c = sva::PTransformd::Identity());
938 
949  void removeConvex(const std::string & name);
950 
957  const sva::PTransformd & bodyTransform(const std::string & bName) const;
958 
960  const sva::PTransformd & bodyTransform(int bodyIndex) const;
961 
963  const std::vector<sva::PTransformd> & bodyTransforms() const;
964 
966  const sva::PTransformd & collisionTransform(const std::string & cName) const;
967 
969  void loadRSDFFromDir(const std::string & surfaceDir);
970 
972  std::map<std::string, std::vector<double>> stance() const;
973 
975  inline mc_rbdyn::Robots & robots() noexcept { return *robots_; }
976 
978  inline const mc_rbdyn::Robots & robots() const noexcept { return *robots_; }
979 
981  unsigned int robotIndex() const;
982 
987 
992 
994  void forwardAcceleration(const sva::MotionVecd & A_0 = sva::MotionVecd(Eigen::Vector6d::Zero()));
997  const sva::MotionVecd & A_0 = sva::MotionVecd(Eigen::Vector6d::Zero())) const;
998 
1000  void eulerIntegration(double step);
1002  void eulerIntegration(rbd::MultiBodyConfig & mbc, double step) const;
1003 
1005  const sva::PTransformd & posW() const;
1017  void posW(const sva::PTransformd & pt);
1018 
1025  void velW(const sva::MotionVecd & vel);
1026 
1028  const sva::MotionVecd & velW() const;
1029 
1036  void accW(const sva::MotionVecd & acc);
1037 
1041  const sva::MotionVecd accW() const;
1042 
1049  mc_control::Gripper & gripper(const std::string & gripper);
1050 
1057  const mc_control::Gripper & gripper(const std::string & gripper) const;
1058 
1060  bool hasGripper(const std::string & gripper) const;
1061 
1062  inline const std::unordered_map<std::string, mc_control::GripperPtr> & grippersByName() const noexcept
1063  { return data_->grippers; }
1064 
1066  inline const std::vector<mc_control::GripperRef> & grippers() const noexcept { return data_->grippersRef; }
1067 
1069  inline const RobotDataPtr data() const noexcept { return data_; }
1070 
1077 
1087  mc_tvm::Convex & tvmConvex(const std::string & name) const;
1088 
1089 private:
1090  Robots * robots_;
1091  unsigned int robots_idx_;
1092  std::string name_;
1093  Eigen::Vector3d zmp_;
1094  std::vector<sva::PTransformd> bodyTransforms_;
1095  std::vector<std::vector<double>> ql_;
1096  std::vector<std::vector<double>> qu_;
1097  std::vector<std::vector<double>> vl_;
1098  std::vector<std::vector<double>> vu_;
1099  std::vector<std::vector<double>> al_;
1100  std::vector<std::vector<double>> au_;
1101  std::vector<std::vector<double>> jl_;
1102  std::vector<std::vector<double>> ju_;
1103  std::vector<std::vector<double>> tl_;
1104  std::vector<std::vector<double>> tu_;
1105  std::vector<std::vector<double>> tdl_;
1106  std::vector<std::vector<double>> tdu_;
1107  std::map<std::string, convex_pair_t> convexes_;
1108  std::map<std::string, sva::PTransformd> collisionTransforms_;
1109  std::map<std::string, mc_rbdyn::SurfacePtr> surfaces_;
1110  std::map<std::string, std::vector<double>> stance_;
1112  RobotDataPtr data_;
1115  std::vector<int> refJointIndexToMBCIndex_;
1117  Springs springs_;
1119  std::vector<Flexibility> flexibility_;
1121  std::unordered_map<std::string, RobotFramePtr> frames_;
1123  double mass_ = 0.0;
1124 
1125 protected:
1127  {
1128  };
1129 
1130 public:
1138  const std::string & name,
1139  Robots & robots,
1140  unsigned int robots_idx,
1141  bool loadFiles,
1142  const LoadRobotParameters & params = {});
1143 
1144 protected:
1146  void copyLoadedData(Robot & destination) const;
1147 
1154  void fixSurfaces();
1155 
1163  void fixSurface(Surface & surface);
1164 
1167 
1176  std::string findIndirectForceSensorBodyName(const std::string & bodyName) const;
1177 
1178 private:
1179  Robot(const Robot &) = delete;
1180  Robot & operator=(const Robot &) = delete;
1181 
1182  /* mutable to allow initialization in const method */
1183  mutable mc_tvm::RobotPtr tvm_robot_;
1184 
1185  /* mutable to allow initialization in const method */
1186  mutable std::map<std::string, mc_tvm::ConvexPtr> tvm_convexes_;
1187 
1193  void name(const std::string & n);
1194 
1196  LoadRobotParameters load_params_;
1197 };
1198 
1233  const mc_rbdyn::Robots & robots,
1234  const std::string & prefix,
1235  bool required = false,
1236  const std::string & robotIndexKey = "robotIndex",
1237  const std::string & robotNameKey = "robot",
1238  const std::string & defaultRobotName = "");
1239 
1247  const mc_rbdyn::Robots & robots,
1248  const std::string & prefix = "",
1249  bool required = false,
1250  const std::string & robotIndexKey = "robotIndex",
1251  const std::string & robotNameKey = "robot",
1252  const std::string & defaultRobotName = "");
1253 
1265  const mc_rbdyn::Robots & robots,
1266  const std::string & prefix = "",
1267  bool required = false,
1268  const std::string & robotIndexKey = "robotIndex",
1269  const std::string & robotNameKey = "robot",
1270  const std::string & defaultRobotName = "");
1271 
1274 /*FIXME Not implemetend for now, only used for ATLAS
1275 void loadPolyTorqueBoundsData(const std::string & file, Robot & robot);
1276 */
1277 
1278 } // namespace mc_rbdyn
1279 
1280 #include <mc_rbdyn/Robot.hpp>
static PTransform< T > Identity()
double step
std::string MC_RBDYN_DLLAPI robotNameFromConfig(const mc_rtc::Configuration &config, const mc_rbdyn::Robots &robots, const std::string &prefix="", bool required=false, const std::string &robotIndexKey="robotIndex", const std::string &robotNameKey="robot", const std::string &defaultRobotName="")
Helper to obtain the robot name from configuration.
MC_RBDYN_DLLAPI const mc_rbdyn::Robot & robotFromConfig(const mc_rtc::Configuration &config, const mc_rbdyn::Robots &robots, const std::string &prefix, bool required=false, const std::string &robotIndexKey="robotIndex", const std::string &robotNameKey="robot", const std::string &defaultRobotName="")
Obtains a reference to a loaded robot from configuration (using robotName or robotIndex)
unsigned int MC_RBDYN_DLLAPI robotIndexFromConfig(const mc_rtc::Configuration &config, const mc_rbdyn::Robots &robots, const std::string &prefix="", bool required=false, const std::string &robotIndexKey="robotIndex", const std::string &robotNameKey="robot", const std::string &defaultRobotName="")
Helper to obtain the robot index from configuration.
#define MC_RBDYN_DLLAPI
Definition: api.h:50
#define MAKE_LOAD_ROBOT_PARAMETER_SETTER(T, NAME)
Definition: Robot.h:47
Definition: generic_gripper.h:15
Eigen::Vector3d MC_RBDYN_DLLAPI zmp(const sva::ForceVecd &netTotalWrench, const Eigen::Vector3d &plane_p, const Eigen::Vector3d &plane_n, double minimalNetNormalForce=1.)
Actual ZMP computation from net total wrench and the ZMP plane.
std::shared_ptr< RobotData > RobotDataPtr
Definition: RobotData.h:73
std::unique_ptr< Device > DevicePtr
Definition: Device.h:20
std::shared_ptr< RobotFrame > RobotFramePtr
Definition: fwd.h:24
std::vector< BodySensor, Eigen::aligned_allocator< BodySensor > > BodySensorVector
Definition: BodySensor.h:139
std::shared_ptr< Surface > SurfacePtr
Definition: Surface.h:85
DevicePtr SensorPtr
Definition: Device.h:22
std::shared_ptr< sch::S_Object > S_ObjectPtr
Definition: RobotModule.h:31
auto Robot(const std::string &name, GetT get_fn)
Definition: Robot.h:54
void error_and_throw(const S &format, Args &&... args)
Definition: logging.h:40
std::unique_ptr< Robot > RobotPtr
Definition: fwd.h:25
PTransform< double > PTransformd
ForceVec< double > ForceVecd
A robot's gripper reprensentation.
Definition: generic_gripper.h:35
Definition: BodySensor.h:20
Definition: RobotModule.h:38
Definition: Flexibility.h:25
Definition: ForceSensor.h:20
Definition: JointSensor.h:18
Definition: Robot.h:33
Definition: RobotFrame.h:22
Definition: RobotModule.h:66
Definition: Robot.h:1127
Definition: Robot.h:63
rbd::MultiBodyConfig & mbc()
void fixCollisionTransforms()
const std::vector< std::string > & refJointOrder() const
Definition: Robot.h:646
const sva::PTransformd & bodyTransform(int bodyIndex) const
void addSurface(mc_rbdyn::SurfacePtr surface, bool doNotReplace=true)
const mc_rbdyn::Surface & surface(const std::string &sName) const
const std::vector< JointSensor > & jointSensors() const noexcept
Definition: Robot.h:160
sva::PTransformd surfacePose(const std::string &sName) const
const ForceSensor & indirectBodyForceSensor(const std::string &body) const
Return a force sensor directly or indirectly attached to a body.
sva::ForceVecd netWrench(const std::vector< std::string > &sensorNames) const
Computes net total wrench from a list of sensors.
Robot(Robot &&)
const std::vector< sva::PTransformd > & bodyTransforms() const
void loadRSDFFromDir(const std::string &surfaceDir)
void addDevice(DevicePtr device)
const std::vector< double > & encoderValues() const noexcept
Definition: Robot.h:637
const std::vector< sva::MotionVecd > & bodyAccB() const
mc_tvm::Convex & tvmConvex(const std::string &name) const
sva::ForceVecd bodyWrench(const std::string &bodyName) const
std::vector< sva::MotionVecd > & bodyVelW()
void addForceSensor(const mc_rbdyn::ForceSensor &fs)
const convex_pair_t & convex(const std::string &cName) const
Eigen::Vector3d copW(const std::string &frame, double min_pressure=0.5) const
const sva::MotionVecd accW() const
void removeConvex(const std::string &name)
int jointIndexInMBC(size_t jointIndex) const
const sva::MotionVecd & velW() const
Eigen::Vector3d zmp(const sva::ForceVecd &netTotalWrench, const Eigen::Vector3d &plane_p, const Eigen::Vector3d &plane_n, double minimalNetNormalForce=1.) const
Actual ZMP computation from net total wrench and the ZMP plane.
void fixSurface(Surface &surface)
const RobotModule & module() const
const ForceSensor & forceSensor(const std::string &name) const
Robot & operator=(Robot &&)
const BodySensor & bodySensor() const noexcept
Definition: Robot.h:94
bool hasForceSensor(const std::string &name) const noexcept
Definition: Robot.h:677
const std::vector< mc_control::GripperRef > & grippers() const noexcept
Definition: Robot.h:1066
bool hasSurface(const std::string &surface) const
const std::vector< std::vector< double > > & q() const
const sva::PTransformd & posW() const
mc_rbdyn::Robots & robots() noexcept
Definition: Robot.h:975
bool hasFrame(const std::string &name) const noexcept
Definition: Robot.h:172
const T & device(const std::string &name) const
Eigen::Vector3d com() const
void velW(const sva::MotionVecd &vel)
bool hasBodySensor(const std::string &name) const noexcept
Definition: Robot.h:107
unsigned int bodyIndexByName(const std::string &name) const
std::vector< sva::MotionVecd > & bodyVelB()
void posW(const sva::PTransformd &pt)
const std::vector< std::vector< double > > & alpha() const
bool hasSensor(const std::string &name) const noexcept
Definition: Robot.h:826
bool hasDevice(const std::string &name) const noexcept
std::vector< std::vector< double > > & alphaD()
const JointSensor & jointJointSensor(const std::string &joint) const
Eigen::Vector3d comAcceleration() const
const mc_rbdyn::Robots & robots() const noexcept
Definition: Robot.h:978
T & device(const std::string &name)
Definition: Robot.h:845
const BodySensor & bodySensor(const std::string &name) const
T & sensor(const std::string &name)
Definition: Robot.h:858
void forwardVelocity(rbd::MultiBodyConfig &mbc) const
bool hasConvex(const std::string &name) const
sva::PTransformd X_b1_b2(const std::string &b1, const std::string &b2) const
const ForceSensor & indirectSurfaceForceSensor(const std::string &surface) const
Return a force sensor directly or indirectly attached to a surface.
const rbd::MultiBodyGraph & mbg() const
rbd::MultiBody & mb()
unsigned int jointIndexByName(const std::string &name) const
const ForceSensor & bodyForceSensor(const std::string &body) const
const std::vector< sva::PTransformd > & bodyPosW() const
convex_pair_t & convex(const std::string &cName)
bool surfaceHasForceSensor(const std::string &surface) const
Checks if the surface has a force sensor directly attached to it.
Definition: Robot.h:706
const sva::MotionVecd & bodyAccB(const std::string &name) const
bool hasBody(const std::string &name) const
const std::vector< std::vector< double > > & controlTorque() const noexcept
Definition: Robot.h:293
const sva::MotionVecd & bodyVelB(const std::string &name) const
const std::vector< double > & encoderVelocities() const noexcept
Definition: Robot.h:640
std::vector< std::vector< double > > & q()
mc_control::Gripper & gripper(const std::string &gripper)
std::vector< std::string > frames() const
void accW(const sva::MotionVecd &acc)
bool jointHasJointSensor(const std::string &joint) const noexcept
Definition: Robot.h:147
rbd::MultiBodyGraph & mbg()
const sva::PTransformd & bodyTransform(const std::string &bName) const
sva::ForceVecd surfaceWrench(const std::string &surfaceName) const
void forwardKinematics(rbd::MultiBodyConfig &mbc) const
const std::vector< std::vector< double > > & jointTorque() const
mc_rbdyn::Surface & copySurface(const std::string &sName, const std::string &name)
const std::string & name() const
const std::map< std::string, convex_pair_t > & convexes() const
Eigen::Vector3d comVelocity() const
Eigen::Vector2d cop(const std::string &frame, double min_pressure=0.5) const
mc_rbdyn::Surface & surface(const std::string &sName)
RobotFramePtr makeTemporaryFrame(const std::string &name, const RobotFrame &parent, sva::PTransformd X_p_f, bool baked=false) const
std::vector< std::string > availableSurfaces() const
const std::vector< sva::MotionVecd > & bodyVelW() const
bool bodyHasBodySensor(const std::string &body) const noexcept
Definition: Robot.h:115
bool hasJoint(const std::string &name) const
const rbd::MultiBody & mb() const
void makeFrames(std::vector< mc_rbdyn::RobotModule::FrameDescription > frames)
void forwardAcceleration(const sva::MotionVecd &A_0=sva::MotionVecd(Eigen::Vector6d::Zero()))
void addSensor(SensorPtr sensor)
Definition: Robot.h:865
const sva::MotionVecd & bodyVelW(const std::string &name) const
const mc_control::Gripper & gripper(const std::string &gripper) const
const std::vector< ForceSensor > & forceSensors() const noexcept
Definition: Robot.h:802
std::map< std::string, std::vector< double > > stance() const
const std::vector< sva::MotionVecd > & bodyVelB() const
const BodySensor & bodyBodySensor(const std::string &name) const
const DevicePtrVector & devices() const noexcept
Definition: Robot.h:849
const RobotFrame & frame(const std::string &name) const
Definition: Robot.h:178
std::vector< std::vector< double > > & controlTorque() noexcept
Definition: Robot.h:311
const T & sensor(const std::string &name) const
Definition: Robot.h:853
std::vector< sva::MotionVecd > & bodyAccB()
void eulerIntegration(double step)
const ForceSensor & surfaceForceSensor(const std::string &surfaceName) const
bool bodyHasForceSensor(const std::string &body) const noexcept
Definition: Robot.h:690
bool zmp(Eigen::Vector3d &zmpOut, const sva::ForceVecd &netTotalWrench, const Eigen::Vector3d &plane_p, const Eigen::Vector3d &plane_n, double minimalNetNormalForce=1.) const noexcept
Actual ZMP computation from net total wrench and the ZMP plane.
std::vector< std::vector< double > > & alpha()
RobotFrame & frame(const std::string &name)
Definition: Robot.h:189
RobotFrame & makeFrame(const std::string &name, RobotFrame &parent, sva::PTransformd X_p_f, bool baked=false)
void forwardAcceleration(rbd::MultiBodyConfig &mbc, const sva::MotionVecd &A_0=sva::MotionVecd(Eigen::Vector6d::Zero())) const
std::string findIndirectForceSensorBodyName(const std::string &bodyName) const
Finds the name of the body to which a force sensor is attached, starting from the provided body and g...
std::vector< sva::PTransformd > & bodyPosW()
bool surfaceHasIndirectForceSensor(const std::string &surface) const
Definition: Robot.h:729
bool hasGripper(const std::string &gripper) const
void copyLoadedData(Robot &destination) const
void addConvex(const std::string &name, const std::string &body, S_ObjectPtr convex, const sva::PTransformd &X_b_c=sva::PTransformd::Identity())
const std::unordered_map< std::string, mc_control::GripperPtr > & grippersByName() const noexcept
Definition: Robot.h:1062
void forwardKinematics()
mc_tvm::Robot & tvmRobot() const
void eulerIntegration(rbd::MultiBodyConfig &mbc, double step) const
void addBodySensor(const BodySensor &sensor)
std::pair< std::string, S_ObjectPtr > convex_pair_t
Definition: Robot.h:68
const std::vector< std::vector< double > > & alphaD() const
const rbd::MultiBodyConfig & mbc() const
const std::map< std::string, mc_rbdyn::SurfacePtr > & surfaces() const
bool bodyHasIndirectForceSensor(const std::string &body) const
Definition: Robot.h:718
unsigned int robotIndex() const
const sva::PTransformd & collisionTransform(const std::string &cName) const
const RobotDataPtr data() const noexcept
Definition: Robot.h:1069
Robot(NewRobotToken, const std::string &name, Robots &robots, unsigned int robots_idx, bool loadFiles, const LoadRobotParameters &params={})
const std::vector< double > & jointTorques() const noexcept
Definition: Robot.h:643
const sva::PTransformd & bodyPosW(const std::string &name) const
std::vector< std::vector< double > > & jointTorque()
const BodySensorVector & bodySensors() const noexcept
Definition: Robot.h:137
void forwardVelocity()
const ForceSensor * findBodyForceSensor(const std::string &body) const
Definition: Robots.h:17
Definition: Springs.h:17
Definition: Surface.h:26
Simplify access to values hold within a JSON file.
Definition: Configuration.h:166
Definition: Convex.h:24
Definition: Robot.h:49