Mujoco KDL Wrapper  0.2.2
MuJoCo + KDL bridge for robot kinematics and dynamics
Loading...
Searching...
No Matches
ex_admittance_ft.cpp
Go to the documentation of this file.
2
3namespace
4{
5
6class PositionController final : public admittance_ft::Controller
7{
8public:
9 explicit PositionController(admittance_ft::SceneHandles &handles)
10 : h(handles),
11 fk(h.robot.chain),
12 ik(h.robot.chain),
13 q_des(admittance_ft::home_q(h.robot.n_joints)),
14 dq(h.robot.n_joints)
15 {
16 ik.setLambda(0.05);
17 }
18
19 const char *name() const override { return "ex_admittance_ft"; }
20 mj_kdl::CtrlMode mode() const override { return mj_kdl::CtrlMode::POSITION; }
21
22 void reset() override { q_des = admittance_ft::home_q(h.robot.n_joints); }
23
24 void track(const KDL::Frame &target) override
25 {
26 KDL::Frame current;
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);
33
34 if (ik.CartToJnt(q_des, dx, dq) >= 0) {
35 for (unsigned i = 0; i < q_des.rows(); ++i) q_des(i) += dq(i);
36 clamp_to_limits();
37 }
38 for (int i = 0; i < h.robot.n_joints; ++i) h.robot.jnt_pos_cmd[i] = q_des(i);
39 mj_kdl::set_joint_pos(&h.robot, q_des, true);
40 mj_kdl::update(&h.robot);
41 }
42
43private:
44 void clamp_to_limits()
45 {
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]);
51 }
52 }
53 }
54
55 admittance_ft::SceneHandles &h;
56 KDL::ChainFkSolverPos_recursive fk;
57 KDL::ChainIkSolverVel_wdls ik;
58 KDL::JntArray q_des;
59 KDL::JntArray dq;
60};
61
62std::unique_ptr<admittance_ft::Controller> make_controller(admittance_ft::SceneHandles &h)
63{
64 return std::make_unique<PositionController>(h);
65}
66
67} // namespace
68
69int main(int argc, char **argv)
70{
71 return admittance_ft::run(argc, argv, make_controller);
72}
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)
void update(Robot *r)
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)