標籤:
第二個編程作業,為了實現我們的機器人咖啡角,我們將基於第一次作業中的圖形旋轉,構造一個兩軸平面機器人,運動原理見動畫
要求:
1)代碼中至少包括兩個類:一個Robot類和一個Solver類,Robot類中定義每個機械臂的長度,每個關節的轉動角度範圍和零點,Solver求解器類用於實現機器人的正逆運動學變換,正運動學為把機器人的關節座標變換成笛卡爾座標,逆運動學為把機器人的笛卡爾座標變換成關節座標。
2)定義座標系類:機器人的原點為全局座標系(World Frame),同時,允許使用者定義工件座標系或任務座標系(Task Frame),任務座標系和全局座標系之間存在著位移和旋轉關係。機器人各個關節的角度值構成關節座標系(Joint Frame)。
3)每個機器人允許定義任意多個任務座標系,請運用Vector容器實現該功能。
4)機器人對象接收來自使用者的PTP(Point To Point)運動指令,該指令所給出的座標值,可能是關節座標系或全局座標系或任務座標系,機器人通過Solver求解器類把全局座標值和任務座標值變換成關節座標並更新關節角度值。
注意:在本次編程中不需要機器人具備連續軌跡運動的功能,只需要能夠根據使用者的PTP指令直接把內部的關節角度值更新就可以。
5)測試主程式架構如下:
int main()
{
//建立一個機器人對象myRobot,初始化機器人的機械參數,關節座標系(JF),全局座標系(WF)。
//給機器人對象建立3個任務座標系TF1, TF2, TF3。
//控制機器人對象在不同座標系下的運動,如:
//myRobot.PTPMove(JF,P1);
//myRobot.PTPMove(WF,P2);
//myRobot.PTPMove(TF1,P3);
//myRobot.PTPMove(TF2,P4);
//myRobot.PTPMove(TF3,P5);
}
#include<iostream>#include<vector>#include<algorithm>using namespace std;class Point{public: Point() { x = 0; y = 0; } Point(double x, double y) { this->x = x; this->y = y; }private: double x; double y;};class Line{public: Line(Point start, Point end) { this->start = start; this->end = end; }private: Point start; Point end;};class Solver{ };class Frame{public: Frame() { delta_theta = 0; delta_x = 0; delta_y = 0; } Frame(double delta_theta, double delta_x, double delta_y) { this->delta_theta = delta_theta; this->delta_x = delta_x; this->delta_x = delta_x; }private: double delta_theta; double delta_x; double delta_y;};class Robot{public: vector<Frame> TaskFrame; Robot() { ArmLength1 = 5; ArmLength2 = 5; } Robot(double ArmLength1,double Armlength2) { this->ArmLength1 = ArmLength1; this->ArmLength2 = Armlength2; } void PTPMove(Point start, Point end) { }private: Frame WorldFrame; Frame JointFrame; double ArmLength1; double ArmLength2;};int main(){ //建立一個機器人對象myRobot,初始化機器人的機械參數,關節座標系(JF),全局座標系(WF)。 //給機器人對象建立3個任務座標系TF1, TF2, TF3。 //控制機器人對象在不同座標系下的運動,如: //myRobot.PTPMove(JF,P1); //myRobot.PTPMove(WF,P2); //myRobot.PTPMove(TF1,P3); //myRobot.PTPMove(TF2,P4); //myRobot.PTPMove(TF3,P5);}
《即時控制軟體設計》第二個編程作業