00001 #include "kinton_arm_tag_tracker_alg.h" 00002 00003 // using namespace KDL; 00004 // using namespace Eigen; 00005 00006 KintonArmTagTrackerAlgorithm::KintonArmTagTrackerAlgorithm(void) 00007 { 00008 } 00009 00010 KintonArmTagTrackerAlgorithm::~KintonArmTagTrackerAlgorithm(void) 00011 { 00012 } 00013 00014 void KintonArmTagTrackerAlgorithm::config_update(Config& new_cfg, uint32_t level) 00015 { 00016 this->lock(); 00017 00018 // save the current configuration 00019 this->config_=new_cfg; 00020 00021 this->unlock(); 00022 } 00023 00024 // KintonArmTagTrackerAlgorithm Public API 00025 00026 void KintonArmTagTrackerAlgorithm::tag_tracker(const MatrixXd& cam_vel, 00027 const Chain& kdl_chain, 00028 const double& dt, 00029 MatrixXd& q) 00030 { 00031 this->lock(); 00032 00033 // Get forward kinematics 00034 MatrixXd fkine = this->kinematics_.fkinematics(kdl_chain,q); 00035 00036 00037 // Get actual arm jacobian 00038 MatrixXd jacobian = this->kinematics_.jacobian(kdl_chain,q); 00039 00040 // Get joint velocities from expected end effector velocities 00041 MatrixXd vel_joints = this->kinematics_.jointvel_from_endeffvel(cam_vel,jacobian); 00042 00043 MatrixXd inc = vel_joints * dt*180/3.1416; 00044 00045 // Get new joint positions 00046 q = q + inc; 00047 00048 for (int i = 0; i < q.rows(); ++i) 00049 { 00050 if (q(i)>180) q(i)=180; 00051 if (q(i)<0) q(i)=0; 00052 } 00053 00054 // MatrixXd Ttarget(4,4); 00055 // Ttarget = MatrixXd::Zero(4,4); 00056 // Ttarget.block(0,0,3,3) = MatrixXd::Identity(3,3); 00057 // Ttarget(0,3)=-0.1; 00058 // Ttarget(1,3)=0; 00059 // Ttarget(2,3)=0.1; 00060 // Ttarget(3,3)=1; 00061 00062 // MatrixXd q_pos=q; 00063 // MatrixXd q_new=MatrixXd::Zero(5,1); 00064 // bool ik = this->kinematics_.ikinematics(kdl_chain,Ttarget,q_pos,q_new); 00065 00066 // if (ik) q=q_new; 00067 00068 // ROS_INFO_STREAM(q); 00069 00070 this->unlock(); 00071 }