22 #include <unordered_map>
38 std::optional<sva::PTransformd> base_tf_ = std::nullopt;
40 std::optional<std::string> base_ = std::nullopt;
42 bool warn_on_missing_files_ =
false;
47 #define MAKE_LOAD_ROBOT_PARAMETER_SETTER(T, NAME) \
48 inline LoadRobotParameters & NAME(T value) noexcept \
59 #undef MAKE_LOAD_ROBOT_PARAMETER_SETTER
64 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
81 const std::string &
name()
const;
108 {
return data_->bodySensorsIndex.count(name) != 0; }
116 {
return data_->bodyBodySensors.count(body) != 0; }
148 {
return data()->jointJointSensors.count(joint) != 0; }
160 inline const std::vector<JointSensor> &
jointSensors() const noexcept {
return data_->jointSensors; }
172 inline bool hasFrame(
const std::string & name)
const noexcept {
return frames_.count(name) != 0; }
180 auto it = frames_.find(name);
181 if(it != frames_.end()) {
return *it->second; }
190 {
return const_cast<RobotFrame &
>(
static_cast<const Robot *
>(
this)->frame(name)); }
232 bool baked =
false)
const;
241 void makeFrames(std::vector<mc_rbdyn::RobotModule::FrameDescription> frames);
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;
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();
311 inline std::vector<std::vector<double>> &
controlTorque() noexcept {
return jointTorque(); }
354 Eigen::Vector3d
com()
const;
401 Eigen::Vector2d
cop(
const std::string & frame,
double min_pressure = 0.5)
const;
414 Eigen::Vector3d
copW(
const std::string & frame,
double min_pressure = 0.5)
const;
446 const Eigen::Vector3d & plane_p,
447 const Eigen::Vector3d & plane_n,
448 double minimalNetNormalForce = 1.)
const;
465 bool zmp(Eigen::Vector3d & zmpOut,
467 const Eigen::Vector3d & plane_p,
468 const Eigen::Vector3d & plane_n,
469 double minimalNetNormalForce = 1.) const noexcept;
488 double minimalNetNormalForce = 1.) const;
509 double minimalNetNormalForce = 1.) const noexcept;
518 const
Eigen::Vector3d & plane_p,
519 const
Eigen::Vector3d & plane_n,
520 double minimalNetNormalForce = 1.) const;
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;
543 double minimalNetNormalForce = 1.) const;
553 const
std::vector<
std::
string> & sensorNames,
555 double minimalNetNormalForce = 1.) const noexcept;
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;
602 std::vector<
std::vector<
double>> & tdl();
604 std::vector<
std::vector<
double>> & tdu();
624 const
Eigen::Vector3d & zmpTarget() const;
627 inline
double mass() const noexcept {
return mass_; }
637 inline const std::vector<double> &
encoderValues() const noexcept {
return data_->encoderValues; }
640 inline const std::vector<double> &
encoderVelocities() const noexcept {
return data_->encoderVelocities; }
643 inline const std::vector<double> &
jointTorques() const noexcept {
return data_->jointTorques; }
646 inline const std::vector<std::string> &
refJointOrder()
const {
return data_->refJointOrder; }
678 {
return data_->forceSensorsIndex.count(name) != 0; }
691 {
return data_->bodyForceSensors_.count(body) != 0; }
707 {
return bodyHasForceSensor(this->surface(surface).bodyName()); }
719 {
return bodyHasForceSensor(body) || findIndirectForceSensorBodyName(body).empty(); }
730 {
return bodyHasIndirectForceSensor(this->surface(surface).bodyName()); }
802 inline const std::vector<ForceSensor> &
forceSensors() const noexcept {
return data_->forceSensors; }
822 bool hasDevice(
const std::string & name)
const noexcept;
826 inline bool hasSensor(
const std::string & name)
const noexcept
827 {
return hasDevice<T>(name); }
841 const T &
device(
const std::string & name)
const;
846 {
return const_cast<T &
>(
const_cast<const Robot *
>(
this)->device<T>(name)); }
853 inline const T &
sensor(
const std::string & name)
const
854 {
return device<T>(name); }
858 inline T &
sensor(
const std::string & name)
859 {
return device<T>(name); }
895 const std::map<std::string, mc_rbdyn::SurfacePtr> &
surfaces()
const;
919 const std::map<std::string, convex_pair_t> &
convexes()
const;
935 const std::string & body,
972 std::map<std::string, std::vector<double>>
stance()
const;
1062 inline const std::unordered_map<std::string, mc_control::GripperPtr> &
grippersByName() const noexcept
1063 {
return data_->grippers; }
1066 inline const std::vector<mc_control::GripperRef> &
grippers() const noexcept {
return data_->grippersRef; }
1091 unsigned int robots_idx_;
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_;
1115 std::vector<int> refJointIndexToMBCIndex_;
1119 std::vector<Flexibility> flexibility_;
1121 std::unordered_map<std::string, RobotFramePtr> frames_;
1138 const std::string & name,
1140 unsigned int robots_idx,
1186 mutable std::map<std::string, mc_tvm::ConvexPtr> tvm_convexes_;
1193 void name(
const std::string & n);
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 =
"");
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 =
"");
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 =
"");
1280 #include <mc_rbdyn/Robot.hpp>
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: RobotFrame.h:22
Definition: RobotModule.h:66
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.
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
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
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 ¶ms={})
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
const ForceSensor * findBodyForceSensor(const std::string &body) const
Simplify access to values hold within a JSON file.
Definition: Configuration.h:166