一份可能的kdl求解franka机器人逆运动学代码

 #include <kdl/kdl.hpp>
 #include <kdl/chain.hpp>
 #include <kdl/tree.hpp>
 #include <kdl/segment.hpp>
 #include <kdl/chainfksolver.hpp>
 #include <kdl/chainiksolver.hpp>
 #include <kdl/chainiksolverpos_lma.hpp>
 #include <kdl/chainiksolverpos_nr.hpp>
 #include <kdl/chainiksolverpos_nr_jl.hpp>
 #include <kdl_parser/kdl_parser.hpp>
 #include <kdl/chainfksolverpos_recursive.hpp>
 #include <kdl/frames_io.hpp>
 #include <kdl/frames.hpp>
 #include <urdf/model.h>


 JntArray joint_init_pose = JntArray(7);

 //kdl frankapanda 模型导入
     KDL::Tree my_tree;
     if (!kdl_parser::treeFromFile("/home/qiren/franka_ws/src/franka_ros/franka_catching_ball_controllers/urdf/panda.urdf", my_tree)){
       ROS_ERROR("Failed to construct kdl tree");
       return false;
     }
     else{
       cout<<"contruct kdl tree completed"<<endl;
     }

//sdk逆运动学求解
    bool exit_value;
    Chain chain;
    exit_value = my_tree.getChain("base","tool0",chain);
    double eps=1E-5;
    int maxiter=500;
    double eps_joints=1E-15;
    ChainIkSolverPos_LMA iksolver = ChainIkSolverPos_LMA(chain,eps,maxiter,eps_joints);
cout<<"1"<<endl;
    // unsigned int nj = chain.getNrOfJoints();
    // JntArray joint_init_pose = JntArray(nj);
    float roll,pitch,yaw;
    float cy = abs(X(5)/sqrt(pow(X(3),2)+pow(X(4),2)+pow(X(5),2)));
    float sy = abs(sqrt(pow(X(3),2)+pow(X(4),2))/sqrt(pow(X(3),2)+pow(X(4),2)+pow(X(5),2)));
    float cp = 1;
    float sp = 0;
    float cr = abs(X(4)/sqrt(pow(X(3),2)+pow(X(4),2)));
    float sr = abs(X(3)/sqrt(pow(X(3),2)+pow(X(4),2)));
    double rot0 = cy*cp;
    double rot1 = cy*sp*sr - sy*cr;
    double rot2 = cy*sp*cr + sy*sr;
    double rot3 = sy*cp;
    double rot4 = sy*sp*sr + cy*cr;
    double rot5 = sy*sp*cr - cy*sr;
    double rot6 = -sp;
    double rot7 = cp*sr;
    double rot8 = cp*cr;
    Rotation rot = Rotation(rot0,rot1,rot2,rot3,rot4,rot5,rot6,rot7,rot8);
    cout<<"rot"<<rot<<endl;

    Vector pose_vec = Vector(0.0057523,-0.188266,0.229913);
    Vector Rot_col_z(X(3),X(4),X(5));
    Rot_col_z.Normalize();
    Vector Rot_col_y(1,1,-(Rot_col_z(0)+Rot_col_z(1))/Rot_col_z(2));
    Rot_col_y.Normalize();
    Vector Rot_col_x;
    Rot_col_x = Rot_col_y*Rot_col_z;
    Rot_col_x.Normalize();
    Rotation rot_matrix(Rot_col_x,Rot_col_y,Rot_col_z);
cout<<rot_matrix<<endl;
Rotation rot_now = Rotation(1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0);


// 0, -M_PI_4, 0, -3 * M_PI_4, 0, M_PI_2, M_PI_4
    joint_init_pose(0) = 0;
    joint_init_pose(1) = M_PI_4;
    joint_init_pose(2) = 0;
    joint_init_pose(3) = -3 * M_PI_4;
    joint_init_pose(4) = 0;
    joint_init_pose(5) = M_PI_2;
    joint_init_pose(6) = M_PI_4;
cout<<"joint_init_pose"<<joint_init_pose(0)<<endl;
cout<<"joint_init_pose"<<joint_init_pose(1)<<endl;

    Frame cartpos = Frame(rot_matrix,pose_vec);
    // Frame cartpos = Frame(rot_matrix,pose_vec);
    JntArray jointpositions = JntArray(7);
cout<<cartpos<<endl;
    bool kinematics_status;
    kinematics_status = iksolver.CartToJnt(joint_init_pose,cartpos,jointpositions);
cout<<jointpositions(0)<<endl;
    if(kinematics_status>=0){
        for(int i=0;i<7;i++){
          std::cout <<"jointpositions"<<i<<"     "<< jointpositions(i) << std::endl;
          catching_joint_pose.data.push_back(jointpositions(i));
std::cout <<"jointpositions"<<i<<"     "<< catching_joint_pose.data.at(i) << std::endl;
        }
        cout<<"Success"<<endl;
    }
    else{
      cout<<"error"<<endl;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值