9 explicit PositionController(admittance_ft::SceneHandles &handles)
13 q_des(admittance_ft::
home_q(h.robot.n_joints)),
19 const char *name()
const override {
return "ex_admittance_ft"; }
24 void track(
const KDL::Frame &target)
override
27 fk.JntToCart(q_des, current);
28 KDL::Twist dx = KDL::diff(current, target);
29 const double vel_norm = dx.vel.Norm();
30 const double rot_norm = dx.rot.Norm();
31 if (vel_norm > 0.03) dx.vel = dx.vel * (0.03 / vel_norm);
32 if (rot_norm > 0.15) dx.rot = dx.rot * (0.15 / rot_norm);
34 if (ik.CartToJnt(q_des, dx, dq) >= 0) {
35 for (
unsigned i = 0; i < q_des.rows(); ++i) q_des(i) += dq(i);
38 for (
int i = 0; i < h.robot.n_joints; ++i) h.robot.jnt_pos_cmd[i] = q_des(i);
44 void clamp_to_limits()
46 for (
int i = 0; i < h.robot.n_joints; ++i) {
47 const int dof = h.robot.kdl_to_mj_dof[i];
48 const int jnt = h.model->dof_jntid[dof];
49 if (h.model->jnt_limited[jnt]) {
50 q_des(i) =
admittance_ft::clamp(q_des(i), h.model->jnt_range[2 * jnt], h.model->jnt_range[2 * jnt + 1]);
55 admittance_ft::SceneHandles &h;
56 KDL::ChainFkSolverPos_recursive fk;
57 KDL::ChainIkSolverVel_wdls ik;
64 return std::make_unique<PositionController>(h);
69int main(
int argc,
char **argv)
int main(int argc, char **argv)
ResetInfo reset(Env *env, const ResetOptions *options=nullptr)
void set_joint_pos(Robot *r, const KDL::JntArray &q, bool call_forward=true)
KDL::JntArray home_q(unsigned n)
int run(int argc, char **argv, std::unique_ptr< Controller >(*make_controller)(SceneHandles &))
double clamp(double v, double lo, double hi)
kdl.JntArray jnt(list[float] values)