zoukankan      html  css  js  c++  java
  • 《实时控制软件设计》第二个编程作业

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

  • 相关阅读:
    Python random() 生成随机数
    【centos7】添加开机启动服务/脚本
    SSH远程会话管理工具
    resolv.conf 的超时(timeout)与重试(attempts)机制
    Linux系统中sysctl命令详解
    NMI watchdog: BUG: soft lockup
    nginx实现最简单的直播
    Linux下编译PHP常见错误及解决方法
    zbb20180919 db 数据库的水平分割和垂直分割
    zbb20180918 java servlet 重定向与请求转发的区别
  • 原文地址:https://www.cnblogs.com/marinehdk/p/5103636.html
Copyright © 2011-2022 走看看