Aikido
Robot.hpp
Go to the documentation of this file.
1 #ifndef AIKIDO_ROBOT_ROBOT_HPP_
2 #define AIKIDO_ROBOT_ROBOT_HPP_
3 
4 #include <chrono>
5 #include <string>
6 #include <unordered_map>
7 
8 #include <Eigen/Dense>
9 #include <dart/collision/CollisionDetector.hpp>
10 #include <dart/collision/CollisionFilter.hpp>
11 #include <dart/dynamics/dynamics.hpp>
12 
13 #include "aikido/common/util.hpp"
23 #include "aikido/planner/World.hpp"
27 #include "aikido/robot/util.hpp"
31 
32 namespace aikido {
33 namespace robot {
34 
36 
37 class Robot
39 {
40 public:
50  Robot(
51  dart::dynamics::SkeletonPtr skeleton,
52  const std::string name = "robot",
53  bool addDefaultExecutors = true);
54 
63  Robot(
64  dart::dynamics::ReferentialSkeletonPtr refSkeleton,
65  Robot* rootRobot,
66  dart::collision::CollisionDetectorPtr collisionDetector,
67  std::shared_ptr<dart::collision::BodyNodeCollisionFilter> collisionFilter,
68  const std::string name = "subrobot");
69 
71  virtual ~Robot() = default;
72 
78  virtual void ignoreSelfCollisionPairs(
79  const std::vector<std::pair<std::string, std::string>> bodyNodeList);
80 
87  virtual void enforceSelfCollisionPairs(
88  const std::vector<std::pair<std::string, std::string>> bodyNodeList);
89 
95  virtual void step(const std::chrono::system_clock::time_point& timepoint);
96 
100 
107  const constraint::dart::CollisionFreePtr& collisionFree) const;
108 
117  const std::vector<std::string> bodyNames
118  = std::vector<std::string>()) const;
119 
126  virtual RobotPtr registerSubRobot(
127  dart::dynamics::ReferentialSkeletonPtr refSkeleton,
128  const std::string& name);
129 
134  RobotPtr getSubRobotByName(const std::string& name) const;
135 
138  Eigen::VectorXd getNamedConfiguration(const std::string& name) const;
139 
143  std::unordered_map<std::string, const Eigen::VectorXd>
144  namedConfigurations);
145 
155  const Eigen::VectorXd& goalConf,
156  const constraint::TestablePtr& testableConstraint,
157  const std::shared_ptr<planner::ConfigurationToConfigurationPlanner>&
158  planner
159  = nullptr,
160  const std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
161  trajPostProcessor
162  = nullptr) const;
163 
166  const Eigen::VectorXd& goalConf,
167  const std::shared_ptr<planner::ConfigurationToConfigurationPlanner>&
168  planner
169  = nullptr,
170  const std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
171  trajPostProcessor
172  = nullptr) const;
173 
186  const std::string bodyNodeName,
187  const Eigen::Vector3d& offset,
188  const constraint::TestablePtr& testableConstraint,
189  const std::shared_ptr<
191  = nullptr,
192  const std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
193  trajPostProcessor
194  = nullptr) const;
195 
198  const std::string bodyNodeName,
199  const Eigen::Vector3d& offset,
200  const std::shared_ptr<
202  = nullptr,
203  const std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
204  trajPostProcessor
205  = nullptr) const;
206 
220  const std::string bodyNodeName,
221  const Eigen::Vector3d& offset,
222  const Eigen::Vector3d& rotation,
223  const constraint::TestablePtr& testableConstraint,
224  const std::shared_ptr<
226  = nullptr,
227  const std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
228  trajPostProcessor
229  = nullptr) const;
230 
233  const std::string bodyNodeName,
234  const Eigen::Vector3d& offset,
235  const Eigen::Vector3d& rotation,
236  const std::shared_ptr<
238  = nullptr,
239  const std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
240  trajPostProcessor
241  = nullptr) const;
242 
262  const std::string bodyNodeName,
263  const constraint::dart::TSRPtr& tsr,
264  const constraint::TestablePtr& testableConstraint,
266  const std::shared_ptr<planner::ConfigurationToConfigurationPlanner>&
267  planner
268  = nullptr,
269  const std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
270  trajPostProcessor
271  = nullptr,
272  const distance::ConstConfigurationRankerPtr& ranker = nullptr) const;
273 
276  const std::string bodyNodeName,
277  const constraint::dart::TSRPtr& tsr,
279  const std::shared_ptr<planner::ConfigurationToConfigurationPlanner>&
280  planner
281  = nullptr,
282  const std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
283  trajPostProcessor
284  = nullptr,
285  const distance::ConstConfigurationRankerPtr& ranker = nullptr) const;
286 
288 
294  virtual void clearExecutors();
295 
299  virtual void deactivateExecutor();
300 
305 
313  virtual int registerExecutor(
314  aikido::control::ExecutorPtr executor, std::string desiredName = "");
315 
324  virtual bool activateExecutor(const int id);
325 
336  virtual bool activateExecutor(const std::string name);
337 
346  virtual bool activateExecutor(const aikido::control::ExecutorType type);
347 
356  template <aikido::control::ExecutorType T>
357  std::future<int> executeJointCommand(
358  const std::vector<double>& command,
359  const std::chrono::duration<double>& timeout);
360 
367  std::future<void> executeTrajectory(
368  const trajectory::TrajectoryPtr& trajectory);
369 
377  virtual void cancelAllCommands(
378  bool includeSubrobots = true,
379  bool includeParents = false,
380  const std::vector<std::string> excludeSubrobots
381  = std::vector<std::string>());
382 
384 
385  // Gets the (sub)robot's name
386  std::string getName() const;
387 
388  // Gets a copy of the (sub)robot's metaskeleton at the current state
389  dart::dynamics::MetaSkeletonPtr getMetaSkeletonClone() const;
390 
391  dart::dynamics::MetaSkeletonPtr getMetaSkeleton();
392 
393  const dart::dynamics::MetaSkeletonPtr getMetaSkeleton() const;
394 
395  // Retrieves current state of the robot
396  Eigen::VectorXd getCurrentConfiguration() const;
397 
398  // Clones the RNG pointer (or nullptr if not set)
400 
401  // Sets the RNG pointer
402  void setRNG(common::UniqueRNGPtr rng);
403 
404  // Gets this robot's (mutable) planning world
406 
407  // Set's this robot's planning world
408  // Adds robot to world if not already present
410 
411  // Sets the default trajectory post-processor.
412  // Also enables automatic post-processing for all planning functions.
414  const std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
415  trajPostProcessor);
416 
417  // Get current default postprocessor
418  std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
419  getDefaultPostProcessor() const;
420 
421  // Enables/disables automatic post-processing for all planning functions.
422  void setEnablePostProcessing(bool enable = true);
423 
424  // Utility function to get root skeleton
425  dart::dynamics::ConstSkeletonPtr getRootSkeleton() const;
426 
427  // Utility function to get root skeleton
428  dart::dynamics::SkeletonPtr getRootSkeleton();
429 
430  // Utility function to get Default VF Params
432 
433  // Utility function to set Default VF Params
435 
436 protected:
437  std::string mName;
438  dart::dynamics::MetaSkeletonPtr mMetaSkeleton;
440 
441  // Currently active executor
443  // Executors indexed by id (higher id has more priority)
444  std::vector<aikido::control::ExecutorPtr> mExecutors;
445  // Keeps track of executor name (if used)
446  std::unordered_map<std::string, int> mExecutorsNameMap;
447 
448  // Subrobot and Joint Management
449  Robot* mParentRobot{nullptr};
450  // Managed degrees of freedom (= mMetaSkeleton->getDofs()->getName())
451  std::set<std::string> mDofs;
452  // Subrobots indexed by name
453  std::unordered_map<std::string, RobotPtr> mSubRobots;
454 
455  // Collision objects.
456  dart::collision::CollisionDetectorPtr mCollisionDetector;
457  std::shared_ptr<dart::collision::BodyNodeCollisionFilter>
459 
460  // Planning post-processor
462  std::shared_ptr<aikido::planner::TrajectoryPostProcessor>
464 
465  // Custom random-number-generator for repeatable planning and post-processing
466  std::unique_ptr<common::RNG> mRng;
467 
468  // Planning world in which the robot resides
470 
471  // Map of commonly-used configurations
472  using ConfigurationMap
473  = std::unordered_map<std::string, const Eigen::VectorXd>;
475 
484  virtual bool validateSubRobot(
485  dart::dynamics::ReferentialSkeletonPtr refSkeleton,
486  const std::string& name);
487 
488  // Parameters for Default VF Planners
490 };
491 
492 } // namespace robot
493 } // namespace aikido
494 
495 #include "detail/Robot-impl.hpp"
496 
497 #endif // AIKIDO_ROBOT_ROBOT_HPP_
aikido::robot::Robot::planToOffset
trajectory::TrajectoryPtr planToOffset(const std::string bodyNodeName, const Eigen::Vector3d &offset, const constraint::TestablePtr &testableConstraint, const std::shared_ptr< planner::dart::ConfigurationToEndEffectorOffsetPlanner > &planner=nullptr, const std::shared_ptr< aikido::planner::TrajectoryPostProcessor > trajPostProcessor=nullptr) const
Plan a specific body node of the robot to a position offset.
aikido::robot::Robot::getDefaultPostProcessor
std::shared_ptr< aikido::planner::TrajectoryPostProcessor > getDefaultPostProcessor() const
aikido::common::UniqueRNGPtr
std::unique_ptr< RNG > UniqueRNGPtr
Definition: RNG.hpp:17
aikido::statespace::dart::MetaSkeletonStateSpacePtr
std::shared_ptr< MetaSkeletonStateSpace > MetaSkeletonStateSpacePtr
Definition: MetaSkeletonStateSpace.hpp:17
aikido::control::ExecutorPtr
std::shared_ptr< Executor > ExecutorPtr
Definition: Executor.hpp:16
aikido::robot::Robot::activateExecutor
virtual bool activateExecutor(const int id)
Deactivates the current active executor.
aikido::robot::Robot::mStateSpace
aikido::statespace::dart::MetaSkeletonStateSpacePtr mStateSpace
Definition: Robot.hpp:439
aikido::robot::Robot::setNamedConfigurations
void setNamedConfigurations(std::unordered_map< std::string, const Eigen::VectorXd > namedConfigurations)
Sets the list of named configurations.
ConfigurationRanker.hpp
aikido::robot::Robot::executeJointCommand
std::future< int > executeJointCommand(const std::vector< double > &command, const std::chrono::duration< double > &timeout)
Convenience: executes given joint command on the robot.
Definition: Robot-impl.hpp:6
aikido::robot::Robot::enforceSelfCollisionPairs
virtual void enforceSelfCollisionPairs(const std::vector< std::pair< std::string, std::string >> bodyNodeList)
Manually remove pairs of body nodes for which collision constraints are enforced.
aikido::robot::Robot::mSubRobots
std::unordered_map< std::string, RobotPtr > mSubRobots
Definition: Robot.hpp:453
aikido::robot::util::VectorFieldPlannerParameters
Paramters for Vector Field Planner.
Definition: util.hpp:42
util.hpp
aikido
Format of serialized trajectory in YAML.
Definition: algorithm.hpp:4
aikido::constraint::dart::TSRPtr
std::shared_ptr< TSR > TSRPtr
Definition: TSR.hpp:17
aikido::planner::dart::ConfigurationToEndEffectorPosePlanner
Base planner class for ConfigurationToEndEffectorPose planning problem.
Definition: ConfigurationToEndEffectorPosePlanner.hpp:14
TSR.hpp
aikido::robot::Robot::deactivateExecutor
virtual void deactivateExecutor()
Deactivates the active executor.
aikido::robot::RobotPtr
std::shared_ptr< Robot > RobotPtr
Definition: Robot.hpp:35
aikido::robot::Robot::getMetaSkeleton
dart::dynamics::MetaSkeletonPtr getMetaSkeleton()
util.hpp
StateSpace.hpp
aikido::robot::Robot::planToConfiguration
trajectory::TrajectoryPtr planToConfiguration(const Eigen::VectorXd &goalConf, const constraint::TestablePtr &testableConstraint, const std::shared_ptr< planner::ConfigurationToConfigurationPlanner > &planner=nullptr, const std::shared_ptr< aikido::planner::TrajectoryPostProcessor > trajPostProcessor=nullptr) const
Plan the robot to a specific configuration.
aikido::robot::Robot::Robot
Robot(dart::dynamics::SkeletonPtr skeleton, const std::string name="robot", bool addDefaultExecutors=true)
Construct a new Robot object.
aikido::robot::Robot::~Robot
virtual ~Robot()=default
Destructor.
aikido::robot::Robot::setRNG
void setRNG(common::UniqueRNGPtr rng)
KinematicSimulationTrajectoryExecutor.hpp
aikido::constraint::dart::CollisionFreePtr
std::shared_ptr< CollisionFree > CollisionFreePtr
Definition: CollisionFree.hpp:22
aikido::robot::Robot::mMetaSkeleton
dart::dynamics::MetaSkeletonPtr mMetaSkeleton
Definition: Robot.hpp:438
aikido::trajectory::TrajectoryPtr
std::shared_ptr< Trajectory > TrajectoryPtr
Definition: Trajectory.hpp:13
aikido::robot::Robot::getWorldCollisionConstraint
constraint::TestablePtr getWorldCollisionConstraint(const std::vector< std::string > bodyNames=std::vector< std::string >()) const
Get the collision constraint between this (sub)robot and selected bodies within its World,...
aikido::robot::Robot::mWorld
aikido::planner::WorldPtr mWorld
Definition: Robot.hpp:469
aikido::robot::Robot::mDofs
std::set< std::string > mDofs
Definition: Robot.hpp:451
aikido::robot::Robot::getNamedConfiguration
Eigen::VectorXd getNamedConfiguration(const std::string &name) const
Returns a named configuration, or size-0 vector if not found.
aikido::robot::Robot::getWorld
aikido::planner::WorldPtr getWorld() const
aikido::planner::WorldPtr
std::shared_ptr< World > WorldPtr
Definition: World.hpp:14
Executor.hpp
KunzRetimer.hpp
aikido::robot::Robot::registerSubRobot
virtual RobotPtr registerSubRobot(dart::dynamics::ReferentialSkeletonPtr refSkeleton, const std::string &name)
Registers a subset of the joints of the skeleton as a new robot.
aikido::robot::Robot::mVFParams
util::VectorFieldPlannerParameters mVFParams
Definition: Robot.hpp:489
aikido::robot::Robot::validateSubRobot
virtual bool validateSubRobot(dart::dynamics::ReferentialSkeletonPtr refSkeleton, const std::string &name)
Checks validity of subrobot for registration: name should be unique.
CollisionFree.hpp
aikido::robot::Robot::setDefaultPostProcessor
void setDefaultPostProcessor(const std::shared_ptr< aikido::planner::TrajectoryPostProcessor > trajPostProcessor)
aikido::robot::Robot::executeTrajectory
std::future< void > executeTrajectory(const trajectory::TrajectoryPtr &trajectory)
Convenience: executes given trajectory on the robot.
aikido::robot::Robot::getMetaSkeletonClone
dart::dynamics::MetaSkeletonPtr getMetaSkeletonClone() const
aikido::distance::ConstConfigurationRankerPtr
std::shared_ptr< const ConfigurationRanker > ConstConfigurationRankerPtr
Definition: ConfigurationRanker.hpp:13
aikido::robot::Robot::mActiveExecutor
int mActiveExecutor
Definition: Robot.hpp:442
Robot-impl.hpp
aikido::robot::Robot::setEnablePostProcessing
void setEnablePostProcessing(bool enable=true)
aikido::robot::Robot::setVFParams
void setVFParams(util::VectorFieldPlannerParameters params)
Trajectory.hpp
aikido::robot::Robot::mParentRobot
Robot * mParentRobot
Definition: Robot.hpp:449
aikido::robot::util::PlanToTSRParameters
Definition: util.hpp:123
aikido::robot::Robot::mCollisionDetector
dart::collision::CollisionDetectorPtr mCollisionDetector
Definition: Robot.hpp:456
aikido::planner::dart::ConfigurationToEndEffectorOffsetPlanner
Base planner class for ConfigurationToEndEffectorOffset planning problem.
Definition: ConfigurationToEndEffectorOffsetPlanner.hpp:14
aikido::robot::Robot::cloneRNG
common::UniqueRNGPtr cloneRNG() const
aikido::robot::Robot::mEnablePostProcessing
bool mEnablePostProcessing
Definition: Robot.hpp:461
ConfigurationToEndEffectorOffsetPlanner.hpp
aikido::robot::Robot::cancelAllCommands
virtual void cancelAllCommands(bool includeSubrobots=true, bool includeParents=false, const std::vector< std::string > excludeSubrobots=std::vector< std::string >())
Cancels all running commands on this robot.
aikido::robot::Robot::getActiveExecutor
virtual aikido::control::ExecutorPtr getActiveExecutor()
Retrieves the active executor.
World.hpp
aikido::robot::Robot::getCurrentConfiguration
Eigen::VectorXd getCurrentConfiguration() const
aikido::robot::Robot::mNamedConfigurations
ConfigurationMap mNamedConfigurations
Definition: Robot.hpp:474
KinematicSimulationJointCommandExecutor.hpp
MetaSkeletonStateSpace.hpp
aikido::robot::Robot::clearExecutors
virtual void clearExecutors()
Deactivates the active executor.
aikido::robot::Robot
Robot base class for defining basic behaviors common to most robots.
Definition: Robot.hpp:38
aikido::robot::Robot::mName
std::string mName
Definition: Robot.hpp:437
aikido::robot::Robot::getRootSkeleton
dart::dynamics::ConstSkeletonPtr getRootSkeleton() const
aikido::robot::Robot::combineCollisionConstraint
constraint::TestablePtr combineCollisionConstraint(const constraint::dart::CollisionFreePtr &collisionFree) const
Given a collision constraint, returns it combined with the self-collision constraint of the entire ro...
aikido::robot::Robot::planToPoseOffset
trajectory::TrajectoryPtr planToPoseOffset(const std::string bodyNodeName, const Eigen::Vector3d &offset, const Eigen::Vector3d &rotation, const constraint::TestablePtr &testableConstraint, const std::shared_ptr< planner::dart::ConfigurationToEndEffectorPosePlanner > &planner=nullptr, const std::shared_ptr< aikido::planner::TrajectoryPostProcessor > trajPostProcessor=nullptr) const
Plan a specific body node of the robot to a pose offset (i.e.
aikido::robot::Robot::mExecutors
std::vector< aikido::control::ExecutorPtr > mExecutors
Definition: Robot.hpp:444
aikido::robot::Robot::mExecutorsNameMap
std::unordered_map< std::string, int > mExecutorsNameMap
Definition: Robot.hpp:446
ConfigurationToEndEffectorPosePlanner.hpp
aikido::robot::Robot::getName
std::string getName() const
aikido::robot::Robot::mRng
std::unique_ptr< common::RNG > mRng
Definition: Robot.hpp:466
aikido::robot::Robot::ConfigurationMap
std::unordered_map< std::string, const Eigen::VectorXd > ConfigurationMap
Definition: Robot.hpp:473
aikido::control::ExecutorType
ExecutorType
Type of executor Can be used to determine if 2 executors make conflicting demands of individual degre...
Definition: Executor.hpp:35
aikido::constraint::TestablePtr
std::shared_ptr< Testable > TestablePtr
Definition: Testable.hpp:13
aikido::robot::Robot::step
virtual void step(const std::chrono::system_clock::time_point &timepoint)
Steps the robot (and underlying executors and subrobots) through time.
TrajectoryExecutor.hpp
aikido::robot::Robot::getSelfCollisionConstraint
constraint::dart::CollisionFreePtr getSelfCollisionConstraint() const
Get the self-collision constraint of the robot.
ConfigurationToConfigurationPlanner.hpp
aikido::robot::Robot::mSelfCollisionFilter
std::shared_ptr< dart::collision::BodyNodeCollisionFilter > mSelfCollisionFilter
Definition: Robot.hpp:458
aikido::robot::Robot::setWorld
void setWorld(aikido::planner::WorldPtr world)
AIKIDO_DECLARE_POINTERS
#define AIKIDO_DECLARE_POINTERS(X)
Definition: pointers.hpp:21
aikido::robot::Robot::getVFParams
util::VectorFieldPlannerParameters getVFParams() const
aikido::robot::Robot::registerExecutor
virtual int registerExecutor(aikido::control::ExecutorPtr executor, std::string desiredName="")
Add an executor to the inactive executors list.
aikido::robot::Robot::ignoreSelfCollisionPairs
virtual void ignoreSelfCollisionPairs(const std::vector< std::pair< std::string, std::string >> bodyNodeList)
Manually add pairs of body nodes for which collision is ignored Note: adjacent body pairs are already...
aikido::robot::Robot::planToTSR
trajectory::TrajectoryPtr planToTSR(const std::string bodyNodeName, const constraint::dart::TSRPtr &tsr, const constraint::TestablePtr &testableConstraint, const util::PlanToTSRParameters &params=util::PlanToTSRParameters(), const std::shared_ptr< planner::ConfigurationToConfigurationPlanner > &planner=nullptr, const std::shared_ptr< aikido::planner::TrajectoryPostProcessor > trajPostProcessor=nullptr, const distance::ConstConfigurationRankerPtr &ranker=nullptr) const
Plan a specific body node of the robot to a sample configuraiton within a Task Space Region.
Planner.hpp
aikido::robot::Robot::getSubRobotByName
RobotPtr getSubRobotByName(const std::string &name) const
Get existing subrobot pointer.
aikido::robot::Robot::mDefaultPostProcessor
std::shared_ptr< aikido::planner::TrajectoryPostProcessor > mDefaultPostProcessor
Definition: Robot.hpp:463