zoukankan      html  css  js  c++  java
  • 第二次编程作业

      1 //Point2D.h 点类
      2 #ifndef POINT2D
      3 #define POINT2D
      4 
      5 #include<EigenDense>
      6 using namespace Eigen;
      7 
      8 class Point2D
      9 {
     10 private:
     11     double x;
     12     double y;
     13 
     14 public:
     15     //Point2D(){};
     16     Point2D(double X = 0.0,double Y = 0.0){x = X; y = Y;}
     17 
     18     double getX(){return x;}
     19     double getY(){return y;}
     20 
     21     Vector2d  PTV();
     22     Point2D & operator+(const Point2D &);
     23     Point2D & operator-(const Point2D &);
     24     Point2D & operator=(const Point2D &);
     25 };
     26 
     27 #endif POINT2D
     28 
     29 
     30 //Point2D.cpp
     31 #include "Point2D.h"
     32 
     33 Point2D & Point2D::operator+(const Point2D & p)
     34 {
     35     Point2D temp(x+p.x,y+p.y);
     36     return temp;
     37 }
     38 
     39 Point2D & Point2D::operator-(const Point2D & p)
     40 {
     41     Point2D temp(x-p.x,y-p.y);
     42     return temp;
     43 }
     44 
     45 Point2D & Point2D::operator=(const Point2D & p)
     46 {
     47     Point2D temp(p.x,p.y);
     48     return temp;
     49 }
     50 
     51 Vector2d  Point2D::PTV()
     52 {
     53     Vector2d temp;
     54     temp(0) = getX();
     55     temp(1) = getY();
     56     return temp;
     57 }
     58 
     59 
     60 //Frames.h 坐标系类
     61 #ifndef Frame
     62 #define Frame
     63 
     64 #include"Point2D.h"
     65 
     66 class Frames
     67 {
     68 public:
     69     EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
     70     Frames(){};
     71     Frames(double,double,double,double,double,double);
     72     ~Frames(){};
     73     Matrix2d  rotation(Frames &);    //两坐标系之间的旋转矩阵
     74     Vector2d  move(Frames &);        //两坐标系之间的移动向量
     75 
     76 private:
     77     Point2D originalPoint;
     78     Vector2d XAxis;
     79     Vector2d YAxis;
     80 };
     81 
     82 #endif Frame
     83 
     84 
     85 //Frames.cpp
     86 #include"Frames.h"
     87 #include"math.h"
     88 #include<cmath>
     89 #include<iostream>
     90 using namespace std;
     91 
     92 #define pi 3.141592654
     93 
     94 Frames::Frames(double px,double py,double vxx,double vxy,double vyx,double vyy)
     95     :originalPoint(px,py),XAxis(vxx,vxy),YAxis(vyx,vyy)
     96 {
     97     
     98     if(XAxis.dot(YAxis) != 0.0)
     99     {
    100         cout << "输入的坐标轴不垂直!" << endl;
    101     }
    102 }
    103 
    104 //两坐标系之间的旋转矩阵
    105 Matrix2d  Frames::rotation(Frames& fram)
    106 {
    107     double s1;
    108     double c1;
    109     double theta;
    110     Matrix2d temp;
    111     if(fram.XAxis(0) !=0 && XAxis(0)!= 0)
    112         theta = atan(fram.XAxis(1)/fram.XAxis(0))-atan(XAxis(1)/XAxis(0));
    113     if(fram.XAxis(0) !=0 && XAxis(0)== 0)
    114     {
    115         if(XAxis(1)== 1)
    116             theta = atan(fram.XAxis(1)/fram.XAxis(0))- 90/180*pi;
    117         if(XAxis(1)== -1)
    118             theta = atan(fram.XAxis(1)/fram.XAxis(0))- 180/180*pi;
    119     }
    120     if(fram.XAxis(0) ==0 && XAxis(0)!= 0)
    121     {
    122         double k = atan(XAxis(1)/XAxis(0));
    123         if(fram.XAxis(1)== 1)
    124             theta = (double)90/180*pi - k;
    125         if(fram.XAxis(1)== -1)
    126             theta = (double)180/180*pi - atan(XAxis(1)/XAxis(0));
    127     }
    128     s1 = sin(theta);
    129     c1 = cos(theta);
    130     if(abs(s1) < 0.000000000000001)
    131         s1 = 0;
    132     if(abs(c1) < 0.000000000000001)
    133         c1 = 0;
    134     temp << c1,-s1,
    135             s1,c1;
    136     return temp;
    137 }
    138 
    139 
    140 //两坐标系之间的移动向量
    141 Vector2d  Frames::move(Frames & fra)
    142 {
    143     Vector2d temp;
    144     temp = fra.originalPoint.PTV()-originalPoint.PTV();
    145     return temp;
    146 }
    147 
    148 
    149 //Solver.h  解算类
    150 #ifndef SOLVER
    151 #define SOLVER
    152 
    153 #include"Frames.h"
    154 
    155 class Solver 
    156 {
    157 public:
    158     Solver(){};
    159     ~Solver(){};
    160     Vector2d  directSolution(double link1,double link2,double th1,double th2);
    161     Matrix2d  inverSolution(double link1,double link2,Frames &, Point2D &);
    162 private:
    163 
    164 };
    165 
    166 
    167 
    168 
    169 #endif SOLVER
    170 
    171 //Solver.cpp
    172 #include"Solver.h"
    173 #include<iostream>
    174 using namespace std;
    175 #include<cmath>
    176 #define pi 3.141592654
    177 
    178 Vector2d Solver::directSolution(double link1,double link2,double th1,double th2)
    179 {
    180     Vector2d temp;
    181     temp(0) = link1*cos(th1) + link2*cos(th1+th2);
    182     temp(1) = link1*sin(th1) + link2*sin(th1+th2);
    183 
    184     return temp;
    185 }
    186 
    187 Matrix2d  Solver::inverSolution(double link1,double link2,Frames &f,Point2D & p)
    188 {
    189     Vector3d point;
    190     Vector2d result;    //p在基坐标系上的坐标值
    191     Vector2d moveF;        //坐标系f与极坐标系原点之间的向量
    192     Matrix2d rota;        //坐标系f与基坐标系之间的旋转矩阵
    193     Matrix3d T;            //坐标系f与基坐标系之间的转换矩阵
    194     Matrix2d Theta;    //关节角
    195     Vector2d temp;
    196     Frames base(0.0,0.0,1.0,0.0,0.0,1.0);
    197 
    198     //把坐标系f的点p转换到基坐标
    199     rota = base.rotation(f);
    200     moveF = base.move(f);
    201     moveF = moveF.transpose();
    202     T << rota,moveF,
    203         0,0,1;
    204     temp = p.PTV();
    205     point << temp,1;
    206     point = point.transpose();
    207     point = T*point;
    208     result << point(0),point(1);
    209 
    210     //判断点是否在找工作空间
    211     double dis = sqrt(result.dot(result));
    212     if(dis>(link1+link2) || dis<(link1-link2))
    213     {
    214         Matrix2d zeros(2,2);
    215         cout << "坐标点不在工作空间!"<< endl;
    216         return zeros;
    217     }
    218 
    219     //求反解关节值
    220     else
    221     {
    222     double beita = atan2(result(1),result(0));
    223     double fi;
    224     double theta11,theta12,theta21,theta22;
    225 
    226     fi = acos((dis*dis+link1*link1-link2*link2)/(2*link1*dis));
    227     theta12 = acos((dis*dis-link1*link1-link2*link2)/(2*link1*link2))*180/pi;
    228 
    229     if(theta12<0)
    230         theta11 = (beita + fi)*180/pi;
    231     else 
    232         theta11 = (beita - fi)*180/pi;
    233 
    234     theta22 = -acos((dis*dis-link1*link1-link2*link2)/(2*link1*link2))*180/pi;
    235 
    236     if(theta22<0)
    237         theta21 = (beita + fi)*180/pi;
    238     else 
    239         theta21 = (beita - fi)*180/pi;
    240     Theta << theta11,theta12,
    241         theta21,theta22;
    242     return Theta;
    243     }
    244     
    245 }
    246 
    247 
    248 //Robot.h 机器人类
    249 #ifndef ROBOT
    250 #define ROBOT
    251 
    252 #include<vector>    
    253 #include"Solver.h"
    254 using namespace std;
    255 
    256 
    257 class Robot:Solver
    258 {
    259 public:
    260     Robot(){};
    261     Robot(vector<Frames> &fr,double link1 = 100,double link2 = 100,
    262         double the1=0,double the2 = 0);
    263     ~Robot(){};
    264 
    265     void PTPMove(Frames &,Point2D &);
    266     void thetaToTCP(double,double);
    267 
    268     inline double getLink1(){return linkage1;}
    269     inline double getLink2(){return linkage2;}
    270     inline double getTheta1(){return theta1;}
    271     inline double getTheta2(){return theta2;}
    272 
    273 private:
    274     vector <Frames> fra;
    275     double linkage1;
    276     double linkage2;
    277     double theta1;
    278     double theta2;
    279 };
    280 
    281 
    282 
    283 
    284 #endif ROBOT
    285 
    286 
    287 //Robot.cpp
    288 #include"Robot.h"
    289 #include<iostream>
    290 using namespace std;
    291 
    292 Robot::Robot(vector<Frames>& fr,double link1,double link2
    293              ,double the1,double the2):
    294              linkage1(link1),linkage2(link2)
    295              ,theta1(the1),theta2(the2)
    296 {
    297     for(int i=0; i < fr.size(); i++)
    298         fra.push_back(fr[i]);
    299     /*if (fr.size() == 0)
    300     {
    301         Frames base(0.0,0.0,1.0,0.0,0.0,1.0);
    302         fra.push_back(base);
    303     }*/
    304 }
    305 
    306 void Robot::PTPMove(Frames & f,Point2D & p)
    307 {
    308     Matrix2d temp;
    309     Matrix2d zeros(2,2);
    310     temp = inverSolution(linkage1,linkage2,f,p);
    311     if (temp != zeros)
    312         cout << "关节值: " <<endl << temp << endl;
    313     cout << endl;
    314 }
    315 void Robot::thetaToTCP(double th1,double th2)
    316 {
    317     Vector2d temp;
    318     temp = directSolution(linkage1,linkage2,th1,th2);
    319     cout << "运动到的点坐标:" << endl << temp;
    320     cout << endl;
    321 }
    322 
    323 
    324 
    325 //测试程序
    326 
    327 #include"Robot.h"
    328 #include <iostream>
    329 using namespace std;
    330 
    331 int main()
    332 {
    333     Point2D p(90,92);    //要运动到的目标点坐标
    334     Point2D p1(500,1305);
    335     vector<Frames> robotFrames;
    336     Frames WF(0.0,0.0,1.0,0.0,0.0,1.0);    //世界坐标系
    337     robotFrames.push_back(WF);
    338     Frames J1(0.0,0.0,1.0,0.0,0.0,1.0);    //关节1坐标系
    339     robotFrames.push_back(J1);
    340     Frames J2(200.0,0.0,1.0,0.0,0.0,1.0);    //关节2坐标系
    341     robotFrames.push_back(J2);
    342     Frames TCP(200.0,150.0,0.0,1.0,-1.0,0.0);    //工具坐标系
    343     robotFrames.push_back(TCP);
    344 
    345     vector<int> b;
    346     for(int i = 0; i< 5;i++)
    347         b.push_back(i);
    348     //工作坐标系
    349     Frames TF1(1.0,1.0,0.8,0.6,-0.6,0.8);
    350     Frames TF2(1.0,2.0,0.0,1.0,-1.0,0.0);
    351 
    352     Robot myrobot(robotFrames,200.0,150.0,0.0,90.0);
    353 
    354     myrobot.PTPMove(WF,p);
    355     myrobot.PTPMove(J1,p);
    356     myrobot.PTPMove(J2,p);
    357     myrobot.PTPMove(TF1,p);
    358     myrobot.PTPMove(TF2,p);
    359     myrobot.PTPMove(TCP,p);
    360 
    361     myrobot.PTPMove(WF,p1);
    362     myrobot.PTPMove(J1,p1);
    363     myrobot.PTPMove(J2,p1);
    364     myrobot.PTPMove(TF1,p1);
    365     myrobot.PTPMove(TF2,p1);
    366     myrobot.PTPMove(TCP,p1);
    367 
    368     system("pause");
    369      return 1;
    370 }

    测试结果

  • 相关阅读:
    common-fileupload上传图片并显示图片
    common-fileupload上传文件
    Hibernate映射文件配置(hbm.xml和注解方式)
    hdu1272:小希的迷宫(并查集)
    hdu1272:小希的迷宫(并查集)
    hdu1102:Constructing Roads(最小生成树)
    hdu1102:Constructing Roads(最小生成树)
    hdu1054:Strategic Game(最小点覆盖)
    hdu1054:Strategic Game(最小点覆盖)
    hdu2255:奔小康赚大钱(KM)
  • 原文地址:https://www.cnblogs.com/RXWein/p/5037653.html
Copyright © 2011-2022 走看看