第二次编程作业

  1 #include <iostream>
  2 #include<Eigen/Dense>
  3 #include<cmath>
  4 #define PI 3.1415926
  5 using namespace std;
  6 using namespace Eigen;
  7 class Point{
  8     public:
  9         double x;
 10         double y;
 11         
 12         Point(double a=0,double b=0);
 13         void SetP(double a,double b);
 14         
 15 };
 16 Point::Point(double a,double b){
 17     x=a;
 18     y=b;
 19 }
 20 void Point::SetP(double a,double b){
 21     x=a;
 22     y=b;
 23 }
 24 
 25 class WorldFrame{
 26     
 27 };
 28 class TaskFrame{
 29     public:
 30         double x;
 31         double y;
 32         double ang;
 33     
 34         TaskFrame(double a=0,double b=0,double d=0);
 35         void WtoT(Point &p);
 36         void TtoW(Point &p);
 37         void TtoJ(Point &p,double a1,double a2);
 38 };
 39 
 40 TaskFrame::TaskFrame(double a,double b,double A){
 41     x=a;
 42     y=b;
 43     ang=A;
 44 }
 45 
 46 void TaskFrame::WtoT(Point &p){
 47     MatrixXd m(3,3);
 48     MatrixXd pt(1,3);
 49     double deg;
 50     deg=ang*PI/180;
 51     m(0,0)=cos(deg);
 52     m(0,1)=sin(deg);
 53     m(0,2)=0;
 54     m(1,0)=-sin(deg);
 55     m(1,1)=cos(deg);
 56     m(1,1)=0;
 57     m(2,0)=x,
 58     m(2,1)=y;
 59     m(2,2)=0;
 60     pt(0,0)=p.x;
 61     pt(0,0)=p.y;
 62     pt(0,2)=1;
 63     pt*=m;
 64     p.x=pt(0,0);
 65     p.y=pt(0,1);    
 66 }
 67 void TaskFrame::TtoW(Point &p){
 68     MatrixXd m(3,3);
 69     MatrixXd pt(1,3);
 70     double deg;    
 71     deg=ang*PI/180;
 72     m(0,0)=cos(deg);
 73     m(0,1)=sin(deg);
 74     m(0,2)=0;
 75     m(1,0)=-sin(deg);
 76     m(1,1)=cos(deg);
 77     m(1,1)=0;
 78     m(2,0)=x;
 79     m(2,1)=y;
 80     m(2,2)=0;
 81     pt(0,0)=-p.x;
 82     pt(0,0)=-p.y;
 83     pt(0,2)=1;
 84     pt*=m;
 85     p.x=pt(0,0);
 86     p.y=pt(0,1);
 87 }
 88 void TaskFrame::TtoJ(Point &p,double a1,double a2){
 89     double l,deg1,deg2,deg3;
 90     l=sqrt(p.x*p.x+p.y*p.y);
 91     deg1=atan(p.y/p.x);
 92     deg2=acos((a1*a1+l*l-a2*a2)/(2*a1*l));
 93     deg3=acos((a1*a1+a2*a2-l*l)/(2*a1*a2));
 94     p.x=(deg1+deg2)*180/PI;
 95     p.y=deg3*180/PI+180;
 96 }
 97 class JointFrame{
 98 
 99 };
100 
101 class Robot{
102     private:
103         double arm1,arm2,deg1min,deg2min,deg1max,deg2max;
104     public:
105         Robot(double a1=1,double a2=1,double d1min=0,double d2min=0,double d1max=180,double d2max=360);
106         void SetRobot(double a1=1,double a2=1,double d1min=0,double d2min=0,double d1max=180,double d2max=360);
107         void PTPMove(WorldFrame wf,TaskFrame tf,Point p);
108         void PTPMove(TaskFrame tf,Point P);
109         void PTPMove(JointFrame jf,Point P);
110         void print(Point &p);
111 };
112 
113 Robot::Robot(double a1,double a2,double d1min,double d2min,double d1max,double d2max){
114     arm1=a1;
115     arm2=a2;
116     deg1min=d1min;
117     deg2min=d2min;
118     deg1max=d1max;
119     deg2max=d2max;
120 }
121 void Robot::SetRobot(double a1,double a2,double d1min,double d2min,double d1max,double d2max){
122     arm1=a1;
123     arm2=a2;
124     deg1min=d1min;
125     deg2min=d2min;
126     deg1max=d1max;
127     deg2max=d2max;
128 }
129 void Robot::PTPMove(WorldFrame wf,TaskFrame tf,Point p){
130     tf.WtoT(p);
131     tf.TtoJ(p,arm1,arm2);
132     print(p);
133 }
134 void Robot::PTPMove(TaskFrame tf,Point p){
135     tf.TtoJ(p,arm1,arm2);
136     print(p);
137 }
138 void Robot::PTPMove(JointFrame jf,Point p){
139     print(p);
140 }
141 void Robot::print(Point &p){
142     if(p.x>=deg1min||p.y<=deg1max){
143         cout<<"机器人的关节坐标为:("<<p.x<<','<<p.y<<')'<<endl;
144     }
145     else cout<<"无法旋转到该位置"<<endl; 
146 }
147 
148 
149 
150 int main(int argc, char** argv) {
151     Robot myRobot(10,10);
152     WorldFrame WF;
153     TaskFrame TF1(0,0,0),TF2(2,2,30),TF3(1,3,60);
154     JointFrame JF;
155     Point P1(0,0),P2(1,1),P3(2,2),P4(2,1),P5(3,7);
156     myRobot.PTPMove(JF,P1);
157     myRobot.PTPMove(WF,TF1,P2);
158     myRobot.PTPMove(TF1,P3);
159     myRobot.PTPMove(TF2,P4);
160     myRobot.PTPMove(TF3,P5);
161     return 0;
162 }
运算结果:

原文地址:https://www.cnblogs.com/hangfengz/p/5047411.html