6 namespace experimental {
12 std::shared_ptr<robot_model::RobotModel> robot_model;
23 std::shared_ptr<Group>
group;
29 std::cout <<
"Could not create arm! Check that family and names match actuators on the network.\n";
34 if (group->size() != robot_model->getDoFCount()) {
35 std::cout <<
"HRDF does not have the same number of actuators as group!\n";
41 std::cout <<
"Could not set command lifetime on group; check that it is valid.\n";
45 std::cout <<
"Could not set feedback frequency on group; check that it is valid.\n";
55 while (!group->getNextFeedback(feedback)) {
56 if (num_attempts++ > 10) {
57 std::cout <<
"Could not communicate with robot; check network connection.\n";
69 if (!gains_cmd.readGains(gains_file))
72 return group_->sendCommandWithAcknowledgement(gains_cmd);
88 Eigen::VectorXd aux(0);
97 t_traj = std::min(t_traj,
trajectory_->getDuration());
102 pos_.setConstant(std::numeric_limits<double>::quiet_NaN());
103 vel_.setConstant(std::numeric_limits<double>::quiet_NaN());
132 const Eigen::MatrixXd& positions,
133 const Eigen::MatrixXd& velocities,
134 const Eigen::MatrixXd& accelerations) {
136 double rampTime = 1.2;
138 size_t num_waypoints = positions.cols();
140 Eigen::VectorXd times(num_waypoints);
141 for (
size_t i = 0; i < num_waypoints; ++i)
142 times[i] = rampTime * (
double)i;
148 int num_joints = goal.
positions().rows();
152 Eigen::VectorXd curr_pos = Eigen::VectorXd::Zero(num_joints);
153 Eigen::VectorXd curr_vel = Eigen::VectorXd::Zero(num_joints);
154 Eigen::VectorXd curr_accel = Eigen::VectorXd::Zero(num_joints);
159 t_traj = std::min(t_traj,
trajectory_->getDuration());
160 trajectory_->getState(t_traj, &curr_pos, &curr_vel, &curr_accel);
167 int num_waypoints = goal.
positions().cols() + 1;
169 Eigen::MatrixXd positions(num_joints, num_waypoints);
170 Eigen::MatrixXd velocities(num_joints, num_waypoints);
171 Eigen::MatrixXd accelerations(num_joints, num_waypoints);
174 positions.col(0) = curr_pos;
175 velocities.col(0) = curr_vel;
176 accelerations.col(0) = curr_accel;
179 positions.rightCols(num_waypoints - 1) = goal.
positions();
180 velocities.rightCols(num_waypoints - 1) = goal.
velocities();
181 accelerations.rightCols(num_waypoints - 1) = goal.
accelerations();
184 Eigen::VectorXd waypoint_times(num_waypoints);
186 if (goal.
times().size() == 0) {
189 waypoint_times(0) = 0;
190 waypoint_times.tail(num_waypoints - 1) = goal.
times();
195 waypoint_times, positions, &velocities, &accelerations);
199 if (goal.
aux().rows() > 0 && (goal.
aux().cols() + 1) == num_waypoints) {
200 aux_.resize(goal.
aux().rows(), goal.
aux().cols() + 1);
201 aux_.col(0).setConstant(std::numeric_limits<double>::quiet_NaN());
202 aux_.rightCols(num_waypoints - 1) = goal.
aux();
214 t_traj = std::min(t_traj,
trajectory_->getDuration());
229 return Eigen::VectorXd();
233 for (
int i =
aux_times_.size() - 1; i >= 0; --i) {
A list of Feedback objects that can be received from a Group of modules; the size() must match the nu...
std::shared_ptr< robot_model::RobotModel > robot_model_
Eigen::VectorXd getVelocity() const
Convenience function for returning feedback velocity values.
double trajectory_start_time_
std::shared_ptr< robot_model::RobotModel > robot_model_
static Eigen::VectorXd getGravCompEfforts(const hebi::robot_model::RobotModel &model, const Eigen::VectorXd &masses, const hebi::GroupFeedback &feedback)
const Eigen::VectorXd & times() const
const Eigen::MatrixXd & positions() const
static std::shared_ptr< Trajectory > createUnconstrainedQp(const VectorXd &time_vector, const MatrixXd &positions, const MatrixXd *velocities=nullptr, const MatrixXd *accelerations=nullptr)
Creates a smooth trajectory through a set of waypoints (position velocity and accelerations defined a...
std::shared_ptr< trajectory::Trajectory > trajectory_
Eigen::VectorXd getPosition() const
Convenience function for returning feedback position values.
double control_frequency_
static std::unique_ptr< RobotModel > loadHRDF(const std::string &file)
Creates a robot model object with no bodies and an identity base frame.
const Eigen::MatrixXd & accelerations() const
std::function< double()> get_current_time_s_
Eigen::VectorXd getWaypointTimes(const Eigen::MatrixXd &positions, const Eigen::MatrixXd &velocities, const Eigen::MatrixXd &accelerations)
const Group & group() const
static std::unique_ptr< Arm > create(const Params ¶ms)
std::shared_ptr< EndEffectorBase > end_effector_
const Eigen::MatrixXd & aux() const
double goalProgress() const
A list of Command objects appropriate for sending to a Group of modules; the size() must match the nu...
std::shared_ptr< Group > group_
std::function< double()> get_current_time_s_
Maintains a registry of network-connected modules and returns Group objects to the user...
void setVelocity(const Eigen::VectorXd &velocity)
Convenience function for setting velocity commands from Eigen vectors.
bool loadGains(const std::string &gains_file)
void setGoal(const Goal &goal)
void setPosition(const Eigen::VectorXd &position)
Convenience function for setting position commands from Eigen vectors.
std::vector< std::string > names_
hebi::GroupFeedback feedback_
void setEffort(const Eigen::VectorXd &effort)
Convenience function for setting effort commands from Eigen vectors.
std::vector< std::string > families_
Arm(std::function< double()> get_current_time_s, std::shared_ptr< Group > group, std::shared_ptr< robot_model::RobotModel > robot_model, std::shared_ptr< EndEffectorBase > end_effector=nullptr)
Eigen::VectorXd aux_times_
hebi::GroupCommand command_
std::shared_ptr< EndEffectorBase > end_effector_
std::shared_ptr< Group > getGroupFromNames(const std::vector< std::string > &families, const std::vector< std::string > &names, int32_t timeout_ms=DEFAULT_TIMEOUT)
Get a group from modules with the given names and families.
const Eigen::MatrixXd & velocities() const
Eigen::VectorXd getAux(double t) const