实时控制软件设计 第二次作业 myRobot
#include<iostream>
#include <Eigen/Dense>
#include <math.h>
#include <vector>
using namespace std;
using namespace Eigen;
using Eigen::MatrixXd;
const double Dk=3.1415926/; //定义Frame(二维笛卡尔坐标系)类
class Frame{
private:
double Ox;
double Oy;//Frame对象在WF(世界坐标系)下的原点坐标
double Angle;//方位角(弧度制)
public:
Frame();
Frame(double ox,double oy,double an);
MatrixXd CalPose();//获得齐次位姿矩阵
};
Frame::Frame() {
Ox=;Oy=;Angle=;
}
Frame::Frame(double ox,double oy,double an){
Ox=ox;Oy=oy;Angle=an*Dk;//输入为角度制
}
MatrixXd Frame::CalPose(){
MatrixXd Pose(,);
Pose(,)=cos(Angle);Pose(,)=-sin(Angle);Pose(,)=Ox;
Pose(,)=sin(Angle);Pose(,)=cos(Angle);Pose(,)=Oy;
Pose(,)=;Pose(,)=;Pose(,)=;
return Pose;
}//由原点和方位角计算位姿矩阵
//Frame定义结束 //定义Solver(运动学求解器)类
class Solver{
private:
vector<Frame> frameVec;
public:
MatrixXd CalTheta(double l1,double l2,Frame frame,double px,double py);//运动学反解
void addFrame(Frame frame);//添加任务框
void deleteFrame(); //移除任务框
};
MatrixXd Solver::CalTheta(double l1,double l2,Frame frame,double px,double py) {
MatrixXd P_task(,),P_world(,),T(,);
P_task(,)=px;P_task(,)=py;P_task(,)=;
P_world=frame.CalPose()*P_task;
T(,)=acos((px*px+py*py-l1*l1-l2*l2)//l1/l2);//取0°到180°
double beta=atan2(py,px);
double lp=sqrt(px*px+py*py);//端点模值
double fea=acos((lp*lp+l1*l1-l2*l2)//l1/lp);
T(,)=beta-fea;
return T;
}
void Solver::addFrame(Frame frame) {
frameVec.push_back(frame);
}
void Solver::deleteFrame() {
frameVec.pop_back();
}
//Solver类定义结束 //定义Robot类
class Robot{
public:
double L1;
double L2;//臂长
double theta1;
double theta2;//SCARA关节变量 (弧度角) Robot();
Robot(double l1,double l2,double t1,double t2);
Vector2d getTerminal();//手臂末端的世界坐标(笛卡尔坐标) ,正运动学计算
void ShowState();//状态显示
void PTPmove(Frame frame,double px,double py);//点到点运动 };
Robot::Robot() {
L1=;L2=;theta1=;theta2=;
};
Robot::Robot(double l1,double l2,double t1,double t2){
L1=l1;L2=l2;theta1=t1*Dk;theta2=t2*Dk;//输入为角度制角
}
Vector2d Robot::getTerminal() {
double Tx,Ty;
Tx=L1*cos(theta1)+L2*cos(theta1+theta2);
Ty=L1*sin(theta1)+L2*sin(theta1+theta2);
Vector2d T(Tx,Ty);
return T;
}
void Robot::ShowState(){
cout<<"theta1="<<theta1/Dk<<endl<<"theta2="<<theta2/Dk<<endl;
}
void Robot::PTPmove(Frame frame,double px,double py){
Solver solver;
MatrixXd T(,);
T=solver. CalTheta(L1,L2,frame,px,py);
theta1=T(,);theta2=T(,);
}
//Robot定义结束 int main(){
Robot myRobot(,,,);//构造Robot对象
Frame TF1(,,),TF2(-,,),TF3(0.5,1.5,);//定义任务坐标系
myRobot.ShowState();
myRobot.PTPmove(TF1,,);
myRobot.ShowState();
myRobot.PTPmove(TF2,,);
myRobot.ShowState();
return ;
}
实时控制软件设计 第二次作业 myRobot的更多相关文章
- 实时控制软件设计第一周作业-汽车ABS软件系统案例分析
汽车ABS软件系统案例分析 ABS 通过控制作用于车轮制动分泵上的制动管路压力,使汽车在紧急刹车时车轮不会抱死,这样就能使汽车在紧急制动时仍能保持较好的方向稳定性. ABS系统一般是在普通制动系统基础 ...
- 《实时控制软件设计》之Github提交作业步骤
在掌握GIT/GITHUB基本操作后,接下来把第一次的编程作业提交到 https://github.com/RTCSD15/HOMEWORK1 ,把第二次的编程作业提交到https://github. ...
- 实时控制软件设计作业_01——汽车ABS系统分析
制动防抱死系统(antilock brake system)简称ABS.作用就是在汽车制动时,自动控制制动器制动力的大小,使车轮不被抱死,处于边滚边滑(滑移率在20%左右)的状态,以保证车轮与地面的附 ...
- 《实时控制软件设计》第一周作业 欧梓峰 U201317662 (更新)
CNC 插补计算程序分析 前言:插补(Interpolation),即机床数控系统依照一定方法确定刀具运动轨迹的过程.一般是已知起点坐标.终点坐标和轨迹,由数控插补计算程序实时的算出各个中间的坐标来拟 ...
- 实时控制软件设计 第一次作业 Draw
#include <iostream> #include <cstring> #include <math.h> #include <Eigen/Dense& ...
- 《实时控制软件设计》之Automation Studio开发环境
Automation Studio是贝加莱公司的控制软件开发平台,软件可运行在贝加莱的基于PC的控制器上,基于Automation Studio我们可构建一个完整的控制软件构建.测试和仿真运行平台.本 ...
- 《实时控制软件设计》Git 基本操作练习
根据老师提供的教程 对 数据库创建.提交文件.创建分支.删除分支.合并分支.冲突处理等操作进行了练习 得到log文件如下: yanbin-guo@yanbinguo MINGW64 /Git (mas ...
- OO--第三单元规格化设计 博客作业
OO--第三单元规格化设计 博客作业 前言 第三单元,我们以JML为基础,先后完成了 PathContainer -> Graph -> RailwaySystem 这是一个递进的过程,代 ...
- 2017-2018-1 20179205《Linux内核原理与设计》第二周作业
<Linux内核原理与分析>第二周作业 本周视频学习情况: 通过孟老师的视频教程,大致对风诺依曼体系结构有了一个初步的认识,视频从硬件角度和程序员角度对CPU和Main Memory(内存 ...
随机推荐
- [HTML/Javascript] JS判断IE浏览器各版本
代码参考: function isLowIEVersion() { var browser = navigator.appName var b_version = navigator.appVersi ...
- 使用CXF发布WebService
这里普及一下WebService和cxf的知识.关于webservice和cxf: WebService.各种提供服务的组件 .企业总线.通讯总线(ESB)CXF:是一个SOA框架,Axi ...
- mybatis if test 不为空字符串或null
<if test="type !=null and type !=''"> AND l.type=#{type,jdbcType=INTEGER} </if> ...
- js 读取 地址栏参数 转
用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var re ...
- ARM: STM32F7: hardfault caused by unaligned memory access
ARM: STM32F7: hardfault caused by unaligned memory access ARM: STM32F7: 由未对齐的内存访问引起的hardfault异常 Info ...
- 矩阵k次幂 采用三重循环
#include<iostream> using namespace std; int main() { int n,k; ][],b[][],c[][]; while(cin>&g ...
- spring开发的总结
1,当出现无法创建bean,( Error creating bean with name 'fileUploadService': Injection of resource dependencie ...
- WCF传输大数据的设置2
本节主要内容:1.如何读取Binding中的binding元素.2.CustomBinding元素的基本配置.3.代码示例 一.Bingding是由binding元素构成的,可以根据实际需要,进行适当 ...
- 【工具】【电子设计】超屌的 fritzing 新建元件
fritzing 有多好,用了才知道,但是通常会遇到一个问题,他的元件库不一定够用,这时候就得自己做元件了,但是搜了一下网上没有相关的教程啊. 算了,去官网看英文吧.. 首先在最新版本不支持直接新建元 ...
- Epson机械手4轴6轴示意图
世界坐标系(World Coordinate System,简称WCS)是由三个垂直并相交的坐标轴X轴.Y轴和Z轴构成,一般显示在绘图区域的左下角,如图1-7所示.X轴和Y轴的交点就是坐标原点O,X轴 ...