实时控制软件设计第二次编程作业

  1 #include <iostream>
  2 #include"robot.h"
  3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  4
  5 int main(int argc, char** argv) {
  6     Robot Robot(140,200,6,4);
  7     jointframe JF;
  8     worldframe WF;
  9     taskframe TF1(4,3,35),TF2(2,2,0),TF3(0,1,40);
 10     Robot.PTPMove(JF,150,240);
 11     Robot.PTPMove(WF,-1,7);
 12     Robot.PTPMove(TF1,-2,3);
 13     Robot.PTPMove(TF2,-1,5);
 14     Robot.PTPMove(TF3,-1,3);
 15     return 0;
 16 }
 17 #ifndef FRAME_H
 18 #define FRAME_H
 19 #include <iostream>
 20 #include <Eigen/Dense>
 21 #include <cmath>
 22 #include <vector>
 23 #define pi 3.1415926
 24 using Eigen::MatrixXd;
 25 using namespace std;
 26
 27 class jointframe{
 28 private:
 29     double deg1;
 30     double deg2;
 31 public:
 32     jointframe(double deg=0,double deg4=0);
 33     double getdeg1();
 34     double getdeg2();
 35 };
 36
 37 class worldframe{
 38 private:
 39     double wfx;
 40     double wfy;
 41     double wfdeg;
 42 public:
 43     worldframe();
 44     //worldframe(double wfx1,double wfy1,double wfdeg1);
 45     //MatrixXd getWF();
 46     //double getX();
 47     //double getY();
 48 };
 49
 50
 51
 52 class taskframe{
 53 private:
 54     double tfx;
 55     double tfy;
 56     double tfdeg;
 57 public:
 58     taskframe();
 59     taskframe(double tfx1,double tfy1,double tfdeg1);
 60     MatrixXd getTF();
 61     double getX();
 62     double getY();
 63 };
 64 #endif
 65 #include "frame.h"
 66 jointframe::jointframe(double deg3,double deg4){
 67     deg1=deg3;
 68     deg2=deg4;
 69 }
 70 double jointframe::getdeg1(){
 71     return deg1;
 72 }
 73 double jointframe::getdeg2(){
 74     return deg2;
 75 }
 76 worldframe::worldframe(){
 77     wfx=wfy=0;
 78     wfdeg=0*pi/180;
 79 }
 80 taskframe::taskframe(){
 81     tfx=tfy=0;
 82     tfdeg=0*pi/180;
 83 }
 84 taskframe::taskframe(double tfx1,double tfy1,double tfdeg1){
 85     tfx=tfx1;
 86     tfy=tfy1;
 87     tfdeg=tfdeg1*pi/180;
 88 }
 89 MatrixXd taskframe::getTF(){
 90     MatrixXd TF(3,3);
 91     TF(0,0)=cos(tfdeg);
 92     TF(0,1)=sin(tfdeg);
 93     TF(0,2)=tfx;
 94     TF(1,0)=-sin(tfdeg);
 95     TF(1,1)=cos(tfdeg);
 96     TF(1,2)=tfy;
 97     TF(2.0)=TF(2,1)=0;
 98     TF(2,2)=1;
 99     return TF;
100 }
101 double taskframe::getX(){
102     return tfx;
103 }
104 double taskframe::getY(){
105     return tfy;
106 }
107 #ifndef SOLVER_H
108 #define SOLVER_H
109 #include"frame.h"
110
111 class Solver{
112 private:
113     double x,y;
114     double theta3,theta4;
115     worldframe WF1;
116 public:
117     Solver();
118     MatrixXd getXY(double a,double b,double l1,double l2);
119     double getdeg1(double c,double d,double l1,double l2);
120     double getdeg2(double c,double d,double l1,double l2);
121 };
122 #endif
123 #include"solver.h"
124 Solver::Solver(){
125     x=y=0;
126     theta3=theta4=0;
127 }
128 MatrixXd Solver::getXY(double a,double b,double l1,double l2){
129     MatrixXd T(3,3);
130     double ang1,ang2,arm1,arm2;
131     ang1=a;
132     ang2=b;
133     arm1=l1;
134     arm2=l2;
135     T(0,0)=cos(ang1+ang2);
136     T(0,1)=-sin(ang1+ang2);
137     T(0,2)=arm2*cos(ang1+ang2)+arm1*cos(ang1);
138     T(1,0)=sin(ang1+ang2);
139     T(1,1)=cos(ang1+ang2);
140     T(1,2)=arm2*sin(ang1+ang2)+arm1*sin(ang1);
141     T(2,0)=T(2,1)=0;
142     T(2,2)=1;
143     return T;
144 }
145 double Solver::getdeg1(double c,double d,double l1,double l2){
146     double theta34;
147     double arm1,arm2,l;
148     x=c;
149     y=d;
150     l=abs(sqrt(x*x+y*y));
151     arm1=l1;
152     arm2=l2;
153     theta34=atan2(y,x)/pi*180;
154     theta3=theta34+acos((-arm2*arm2+arm1*arm1+l*l)/(2*arm1*l))/pi*180;
155     theta4=acos((-l*l+arm1*arm1+arm2*arm2)/(2*arm1*arm2))/pi*180+180;
156     return theta3;
157 }
158 double Solver::getdeg2(double c,double d,double l1,double l2){
159     double theta34;
160     double arm1,arm2,l;
161     x=c;
162     y=d;
163     l=abs(sqrt(x*x+y*y));
164     arm1=l1;
165     arm2=l2;
166     theta34=atan2(y,x)/pi*180;
167     theta3=theta34+acos((-arm2*arm2+arm1*arm1+l*l)/(2*arm1*l))/pi*180;
168     theta4=acos((-l*l+arm1*arm1+arm2*arm2)/(2*arm1*arm2))/pi*180+180;
169     return theta4;
170 }
171 #ifndef ROBOT_H
172 #define ROBOT_H
173 #include"solver.h"
174 class Robot{
175 private:
176     double theta1;
177     double theta2;
178     double seg1;
179     double seg2;
180     jointframe JF;
181     worldframe WF;
182     std::vector<taskframe> TF;
183     Solver normal;
184     Solver inverse;
185 public:
186     Robot();
187     Robot(double alpha,double beta,double lenth1,double lenth2);
188     void PTPMove(jointframe JF1,double X,double Y);
189     void PTPMove(worldframe WF1,double X,double Y);
190     void PTPMove(taskframe TF1,double X,double Y);
191 };
192 #endif
193 #include"robot.h"
194 Robot::Robot(){
195     theta1=180/pi*180;
196     theta2=270/pi*180;
197     seg1=0;seg2=0;
198 }
199 Robot::Robot(double alpha,double beta,double lenth1,double lenth2){
200     theta1=alpha/pi*180;
201     theta2=beta/pi*180;
202     seg1=lenth1;
203     seg2=lenth2;
204 }
205 void Robot::PTPMove(jointframe JF1,double X,double Y){
206     double x,y,c,d;
207     MatrixXd B(3,1);
208     c=X+JF1.getdeg1();
209     d=Y+JF1.getdeg2();
210     x=c*pi/180;
211     y=d*pi/180;
212     if(c>180||c<100||d<220||d>300)
213     {
214         cout<<"无法旋转到该位置"<<endl;
215     }
216     else
217     {
218     B=normal.getXY(x,y,seg1,seg2);
219     cout<<"关节坐标为"<<‘(‘<<B(0,0)<<‘,‘<<B(1,0)<<‘)‘<<endl;
220     }
221
222 }
223 void Robot::PTPMove(worldframe WF1,double X,double Y){
224     double deg1,deg2,x,y;
225     x=X;
226     y=Y;
227     deg1=inverse.getdeg1(x,y,seg1,seg2);
228     deg2=inverse.getdeg2(x,y,seg1,seg2);
229     if(deg1>180||deg1<100||deg2<220||deg2>300)
230     {
231         cout<<"无法旋转到该位置"<<endl;
232     }
233     else
234     {
235          cout<<"关节坐标为"<<‘(‘<<deg1<<‘,‘<<deg2<<‘)‘<<endl;
236     }
237 }
238 void Robot::PTPMove(taskframe TF1,double X,double Y){
239     double deg1,deg2,x,y;
240     MatrixXd TFs(3,3),coordt(3,1),anst(3,1);
241     coordt(0,0)=X;
242     coordt(1,0)=Y;
243     coordt(2,0)=1;
244     TFs=TF1.getTF();
245     anst=TFs*coordt;
246     x=anst(0,0);
247     y=anst(1,0);
248     deg1=inverse.getdeg1(x,y,seg1,seg2);
249     deg2=inverse.getdeg2(x,y,seg1,seg2);
250     if(deg1>180||deg1<100||deg2<220||deg2>300)
251     {
252         cout<<"无法旋转到该位置"<<endl;
253     }
254     else
255     {
256         cout<<"关节坐标为"<<‘(‘<<deg1<<‘,‘<<deg2<<‘)‘<<endl;
257     }
258 }

时间: 2024-10-11 22:26:49

实时控制软件设计第二次编程作业的相关文章

《实时控制软件设计》第一次编程作业

//代码: #include <iostream> #include <Eigen/Dense> #include <cmath> using Eigen::MatrixXd; using namespace std; float pi=3.1415926; void mpoint(MatrixXd m) { MatrixXd T(1,2),A(1,2); cout<<"请输入移动距离:"; fflush(stdin); scanf(&q

实时控制软件设计第二周作业

一.汽车出入门禁系统状态机设计 状态机所有状态: 入闸传感器(两种状态): Ture  False  (分别用ET和EF表示) 出闸传感器(两种状态): Ture  False  (分别用OT和OF表示) 起落杆(两种状态):     UP DOWN   (分别用UP和DW表示) 通行灯(两种状态):       Red Green   (分别用R和G表示) 状态机所接收到的外部事件: 汽车进入和驶离门禁系统区: Enter  Out (分别用E和O表示) 状态机所产生的动作: 起落杆的动作: 

实时控制软件设计第二周作业-停车场门禁控制系统状态机

画出动作转换图为: 使用模块化设计,将起落杆.出入传感器和通行灯设计成四个模块,分别继承设计好的系统模块接口: 1 //FSM_Interface.h 2 #pragma once 3 4 namespace FSM 5 { 6 7 class ISystemUnit //系统单元接口 8 { 9 public: 10 11 virtual void Initialize() = 0; //初始化 12 13 virtual void Execute() = 0; //执行动作 14 15 vi

实时控制软件设计第二次作业

1-1.Point.h #ifndef MY_POINT #define MY_POINT class Point{ private: double _x; double _y; public: Point(double x,double y); double getX(); double getY(); }; #endif  1-2.Point.cpp #include"Point.h" #include<iostream> Point::Point(double x,d

《实时控制软件设计》第一周作业 欧梓峰 U201317662

CNC 插补计算程序分析 一.该系统有哪些强实时功能需求?需要对哪些实时事件进行实时响应,对允许的实时延迟的数量级进行估计. 答:该系统对如何控制刀具或工具的运动有强的实时控制需求,通过插补控制和位置控制以及主轴控制实现一边插补进行运算,一边进行加工,才能完成程序规定的加工任务,反过来讲,才能实时控制加工. 二.如果你是软件设计者,要实现这些实时功能,要设计几个实时任务? 答:①插补计算任务:对轮廓线的起点到终点之间再密集的计算出有限个坐标点,刀具沿着这些坐标点移动,来逼近理论轮廓,以保证切削过

《实时控制软件设计》第一周作业

《实时控制软件设计》读书笔记

读书笔记 在浅读过<构建之法:现代软件工程>第一章和邹欣老师的一些博文后,我对以下四个方面有了一些粗陋的认识. 一.      对软件工程的理解 <构建之法>第一章中对软件工程有着自己的理解.书中提到“软件=程序+软件工程”这一概念.同时,书中还指出软件工程包含软件需求分析.软件设计.软件构建.软件测试和软件维护这些领域.看过这些介绍后,我认为首先要弄请程序.软件.软件工程的区别.正如书中提到阿超的例子一样,程序只是完成某一项或几项简单任务的代码和数据结构集成:而软件则是能满足用户

《实时控制软件》第三周作业

一.Xenomai的简介 1.简介 Xenomai 是一种采用双内核机制的Linux 内核的强实时扩展.优先级高于Linux 内核,它负责处理系统的实时任务.Xenomai 无缝集成到Linux操作系统,从而无障碍所有的Linux软件栈源代码和更多的东西Xenomai 实时内核为开发强实时应用提供了丰富的功能, 主要包括实时线程调度与管理用户空间实时任务支持中断服务线程同步服务实时对象注册服务和动态内存申请等. 和典型的Linux实时方案( RTLinux和RTAI) 相比,Xenomai拥有自

【助教】第二次编程作业[初稿]

童鞋们好,通过和老师商量,决定第二次的编程作业要求如下: 1) 从第一次作业出发,将程序改装成一个单机带用户界面(不是控制台)的程序.    2) 我们会列出 8 个可以扩展的方向,相互独立.     3) 老师会让同学两两结对, 根据学号做一个数学映射, 选取 8 个可扩展方向上面的 4个,每个结对的同学提交的一份代码里面必须独立实现这 4 个方向.    4) 两个童鞋只需要一个童鞋将代码提交到博客,代码提交要求参见:http://www.cnblogs.com/greyzeng/p/437