• 第二次编程作业


    第二次作业要求


    描述

    main.cpp

    #include <iostream> 
    #include "robot.h"
    
    using namespace std;
    
    int main(){
    	Robot myRobot(10, 5);
    	taskFrame tk1(0, 0, -90), tk2(1, 5, 30);
    	Vector2d P(5, 5);	
    	myRobot.PTPMove(tk1, P);
    	cout << "第一个角度" << myRobot.getA() << ',' << "第二个的角度" << myRobot.getB() << endl;
    	myRobot.PTPMove(tk2, P);
    	cout << "第一个角度" << myRobot.getA() << ',' << "第二个的角度" << myRobot.getB() << endl;
    		
    	return 0;
    }
    

    运行结果
    反解的时候有两组解,最终只选择显示了一种,代码注释中有第二种结果

    其他代码段

    frame.h

    #ifndef _Frame_H_
    #define _Frame_H_
    
    class worldFrame{
    	private:
    		double x, y, angle;
    	public:
    		worldFrame();
    		double getX();
    		double getY();
    		double getAngle();
    };
    
    class taskFrame{
    	private:
    		double x, y, angle;
    	public:
    		taskFrame();
    		taskFrame(double, double, double);
    		double getX();
    		double getY();
    		double getAngle();
    };
    
    class jointFrame{
    	private:
    		double alpha,beta;
    	public:
    		jointFrame();
    		jointFrame(double, double);
    		double getAlpha();
    		double getBeta();
    		void setAlpha(double);
    		void setBeta(double);
    };
    
    #endif
    

    frame.cpp

    #include "Frame.h"
    
    worldFrame::worldFrame(){
    	x = 0;
    	y = 0;
    	angle = 0;
    }
    
    double worldFrame::getX(){
    	return x;
    }
    
    double worldFrame::getY(){
    	return y;
    }
    
    double worldFrame::getAngle(){
    	return angle;
    }
    
    taskFrame::taskFrame(){
    	x = 0;
    	y = 0;
    	angle = 0;
    }
    
    double taskFrame::getX(){
    	return x;
    }
    
    double taskFrame::getY(){
    	return y;
    }
    
    double taskFrame::getAngle(){
    	return angle;
    }
    
    taskFrame::taskFrame(double a, double b, double ang){
    	x = a;
    	y = b;
    	angle = ang;
    }
    
    jointFrame::jointFrame(){
    	alpha = 0;
    	beta = 0;
    }
    
    jointFrame::jointFrame(double ang1, double ang2){
    	alpha = ang1;
    	beta = ang2;
    }
    
    double jointFrame::getAlpha(){
    	return alpha;
    }
    
    double jointFrame::getBeta(){
    	return beta;
    }
    
    void jointFrame::setAlpha(double a){
    	alpha = a;
    }
    
    void jointFrame::setBeta(double b){
    	beta = b;
    }
    

    solver.h

    #ifndef _Solver_H_
    #define _Solver_H_
    
    #include "Frame.h"
    #include <Eigen/Dense>
    using Eigen::Vector2d;
    using Eigen::Matrix2d;
    
    class Solver{
    	private:
    		double la;
    		double lb;
    
    
    	public:
    		Vector2d forwardS(Vector2d);	//将关节坐标转化为笛卡尔坐标
    		Vector2d reverseS(Vector2d);	//将笛卡尔坐标转化为关节坐标 
    		void setLa(double);
    		void setLb(double);	
    		double getLa();
    		double getLb();
    		Vector2d TF2WF(taskFrame, Vector2d);   //将任务坐标系下的点转换到世界坐标系下	
    };
    
    #endif
    

    solver.cpp

    #include "solver.h"
    #include <cmath>
    
    Vector2d Solver::forwardS(Vector2d jnt){
    	Vector2d dkr; //笛卡尔坐标 
    	dkr(0) = la * cos(jnt(0)*180/M_PI) + lb * cos(jnt(1)*180/M_PI);
    	dkr(1) = la * sin(jnt(0)*180/M_PI) + lb * sin(jnt(1)*180/M_PI);
    	return dkr;
    }
    
    Vector2d Solver::reverseS(Vector2d dkr){
    	Vector2d jnt; //关节坐标 
    	double delta = 0.00001;
    	double x = dkr(0);
    	double y = dkr(1);
    	double thita = atan(y/x);	
    	double k0 = (x*x + y*y + la*la - lb*lb) / (2*la*sqrt(x*x+y*y));
    	double fi0 = acos(k0);
    	jnt(0) = (thita - fi0) * 180 / M_PI; 	
    	double k1 = (x*x + y*y + lb*lb - la*la) / (2*lb*sqrt(x*x+y*y));
    	double fi1 = acos(k1);	
    	jnt(1) = (thita + fi1) * 180 / M_PI; 
    // 角度值足够小的时候取 0 
    	if (abs(jnt(0))< delta) jnt(0) = 0;
    	if (abs(jnt(1))< delta) jnt(1) = 0;
    	return jnt;
    //  反解的时候有两组解
    //  第一组里jnt(0) = thita - fi 
    //          jnt(1) = fi + thita
    //	第二组里jnt(0) = thita + fi 
    //          jnt(1) = fi - thita
    }
    
    void Solver::setLa(double l){
    	la = l;
    }
    
    void Solver::setLb(double l){
    	lb = l;
    }
    
    double Solver::getLa(){
    	return la;
    }
    
    double Solver::getLb(){
    	return lb;
    }
    
    Vector2d Solver::TF2WF(taskFrame TF, Vector2d P){
    	Vector2d T;    //距离矢量 
    	Matrix2d R;    //旋转矩阵 
    
    	double angle = TF.getAngle() / 180 * M_PI;
    	T(0) = TF.getX();
    	T(1) = TF.getY();
    	R << cos(angle), -sin(angle),
             sin(angle), cos(angle);  
        return R * P + T;	
    }
    

    robot.h

    #ifndef _Robot_H_
    #define _Robot_H_
    
    #include "solver.h"
    #include "frame.h"
    
    class Robot{
    	private:
    		double lengthA, lengthB;
    		double alpha, beta;
    		Solver S;
    		
    	public:
    		Robot();
    		Robot(double, double);
    		void setLa(double);
    		void setLb(double);
    		double getLa();
    		double getLb();
    		double getA();
    		double getB();
    		void PTPMove(jointFrame, Vector2d);
    		void PTPMove(worldFrame, Vector2d); 
    		void PTPMove(taskFrame, Vector2d);
    };
    
    #endif
    

    robot.cpp

    #include "robot.h"
    
    
    Robot::Robot(){
    	lengthA = 0;
    	lengthB = 0;
    }
    
    Robot::Robot(double l1, double l2){
    	lengthA = l1;
    	lengthB = l2;
    }
    
    void Robot::setLa(double l){
    	lengthA = l;
    }
    
    void Robot::setLb(double l){
    	lengthB = l;
    }
    
    double Robot::getLa(){
    	return lengthA;
    }
    
    double Robot::getLb(){
    	return lengthB;
    }
    
    double Robot::getA(){
    	return alpha;
    }
    
    double Robot::getB(){
    	return beta;
    }
    
    void Robot::PTPMove(jointFrame JF, Vector2d P){
    	alpha = P(0);
    	beta = P(1);
    }
    
    void Robot::PTPMove(taskFrame TF, Vector2d P){
    	Vector2d tmp;
    	tmp = S.TF2WF(TF, P);   	
    	S.setLa(lengthA);      //给solver类中的la和lb赋值       
    	S.setLb(lengthB);	
    	tmp = S.reverseS(tmp);
    	alpha = tmp(0);
    	beta = tmp(1);
    }
    
    void Robot::PTPMove(worldFrame WF, Vector2d P){
    	Vector2d tmp;
    	S.setLa(lengthA);         
    	S.setLb(lengthB);
    	tmp = S.reverseS(P);
    	alpha = tmp(0);
    	beta = tmp(1);
    }
    
    Sola
  • 相关阅读:
    上传图片至fastdfs显示连接超时
    Linux上安装maven
    multipartFile.getOriginalFilename();不能获取原文件名称,也就是含有路径名
    /usr/bin/ld: cannot find -lfdfsclient
    linux开放22端口
    Ajax上传file出现的bad request问题
    easyui combobox实现下拉自动提示补全功能
    js格式化时间
    codeforces 780B
    codeforces 61 D 115 A
  • 原文地址:https://www.cnblogs.com/akisaya/p/5046830.html
Copyright © 2020-2023  润新知