coin3D中匯入機器人模型
阿新 • • 發佈:2018-12-10
通過在史陶比爾官網下載TX90機械臂模型,經過UG進行座標轉換,creo導成iv格式,最後匯入Coin3D中,模型如圖所示: 主要步驟如下: 1.通過UG移動零件本身,將世界座標系移至運動副。以連桿arm為例 裝配中,arm 的Y軸和Z軸應如上圖所示,而零件中,arm的世界座標如下圖: 通過UG的座標轉換,首先要建立絕對座標系,通過移動或旋轉零件使其滿足裝配下的座標系: 導成iv格式放入程式中,讀取arm的程式如下
SoSeparator* TX90robot::makeRod2()
{
SoSeparator* tx90_arm = new SoSeparator;
m_rot2-> axis = SoRotationXYZ::Y;
SoTransform* form2 = new SoTransform;
form2->translation.setValue(0.05, 0.160, 0.230);
SoInput inputAxis2;
inputAxis2.openFile("tx90_arm.iv");
SoSeparator* mygraph = SoDB::readAll(&inputAxis2);
mygraph->ref();
tx90_arm->addChild(form2);
tx90_arm-> addChild(m_rot2);
tx90_arm->addChild(mygraph);
return tx90_arm;
}
其中 m_rot2->axis = SoRotationXYZ::Y;表示為繞Y軸旋轉,也是為什麼要把座標系放到運動副的原因 form2->translation.setValue(0.05, 0.160, 0.230);為ARM的座標系相對shouder的座標系,這樣shouder旋轉,arm也會相應旋轉,shouder裡的座標系資料如圖: 同理依次變換測量其他連桿,最後裝配如下:
//按相對座標 Rod0->addChild(Rod1 );表示在ROd0座標系中組裝
robot->addChild(Rod0);
Rod0->addChild(Rod1);
Rod1->addChild(Rod2);
Rod2->addChild(Rod3);
Rod3->addChild(Rod4);
Rod4->addChild(Rod5);
Rod5->addChild(Rod6);
root->addChild(robot);
其中 Rod0->addChild(Rod1);表示在rod1在ROd0座標系中組裝,是相對Rod0的。 完整的robot類標頭檔案如下:
#pragma once
#include "stdafx.h"
#include <Inventor/Win/SoWin.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoTransform.h>
#include <Inventor/nodes/SoRotationXYZ.h>
#include <Inventor/nodes/SoRotor.h>
#define PI 3.14159265358979323846
class TX90robot
{
public:
TX90robot(void);
~TX90robot(void);
public:
SoSeparator *root;
//旋轉軸
SoRotationXYZ *m_rot1;
SoRotationXYZ *m_rot2;
SoRotationXYZ *m_rot3;
SoRotationXYZ *m_rot4;
SoRotationXYZ *m_rot5;
SoRotationXYZ *m_rot6;
SoSeparator * makeRod0();
SoSeparator * makeRod1();
SoSeparator * makeRod2();
SoSeparator * makeRod3();
SoSeparator * makeRod4();
SoSeparator * makeRod5();
SoSeparator * makeRod6();
void makeScene();
};
實現檔案如下:
#include "stdafx.h"
#include "TX90robot.h"
TX90robot::TX90robot(void)
{
m_rot1 = new SoRotationXYZ;
m_rot2 = new SoRotationXYZ;
m_rot3 = new SoRotationXYZ;
m_rot4 = new SoRotationXYZ;
m_rot5 = new SoRotationXYZ;
m_rot6 = new SoRotationXYZ;
}
TX90robot::~TX90robot(void)
{
}
SoSeparator* TX90robot::makeRod0()
{
SoSeparator* base = new SoSeparator;//因為函式要返回soseparator*型別
SoTransform* form0 = new SoTransform;
form0->translation.setValue(0, 0, 0);
SoInput inputbase;
inputbase.openFile("tx90_horizontal_base_cable_outl.iv");
SoSeparator *mygraph = SoDB::readAll(&inputbase);
mygraph->ref();
base->addChild(form0);
base->addChild(mygraph);
return base;
}
SoSeparator* TX90robot::makeRod1()
{
SoSeparator* tx90_shoulder = new SoSeparator;//因為函式要返回soseparator*型別
tx90_shoulder->ref();
SoTransform* form1 = new SoTransform;
form1->translation.setValue(0, 0, 0.24801);//匯入的模型記錄了建立的原點,通過裝配體測兩零件間的座標系原點距離
m_rot1->axis = SoRotationXYZ::Z;
SoInput inputAxis1;
inputAxis1.openFile("tx90_shoulder.iv");
SoSeparator *mygraph = SoDB::readAll(&inputAxis1);
mygraph->ref();
tx90_shoulder->addChild(form1);
tx90_shoulder->addChild(m_rot1);
tx90_shoulder->addChild(mygraph);
return tx90_shoulder;
}
SoSeparator* TX90robot::makeRod2()
{
SoSeparator* tx90_arm = new SoSeparator;
m_rot2->axis = SoRotationXYZ::Y;
SoTransform* form2 = new SoTransform;
//form2->translation.setValue(0.05, 0.161, 0.478);
form2->translation.setValue(0.05, 0.161, 0.230);
SoInput inputAxis2;
inputAxis2.openFile("tx90_arm.iv");
SoSeparator* mygraph = SoDB::readAll(&inputAxis2);
mygraph->ref();
tx90_arm->addChild(form2);
tx90_arm->addChild(m_rot2);
tx90_arm->addChild(mygraph);
return tx90_arm;
}
SoSeparator* TX90robot::makeRod3()
{
SoSeparator* tx90_elbow = new SoSeparator;//因為函式要返回soseparator*型別
tx90_elbow->ref();
m_rot3->axis = SoRotationXYZ::Y;
SoTransform* form3 = new SoTransform;
//form3->translation.setValue(0.05, 0.16, 0.903);
form3->translation.setValue(0, 0, 0.425);
SoInput inputAxis3;
inputAxis3.openFile("tx90_elbow.iv");
SoSeparator *mygraph = SoDB::readAll(&inputAxis3);
tx90_elbow->addChild(form3);
tx90_elbow->addChild(m_rot3);
tx90_elbow->addChild(mygraph);
return tx90_elbow;
}
SoSeparator* TX90robot::makeRod4()
{
SoSeparator* tx90_forearm = new SoSeparator;//因為函式要返回soseparator*型別
tx90_forearm->ref();
SoTransform* form4 = new SoTransform;
//form4->translation.setValue(0.05, 0.05, 1.060);//相對基座標系不對
form4->translation.setValue(0, -0.11, 0.156);//相對上一個零件的座標系位置
m_rot4->axis = SoRotationXYZ::Z;
SoInput inputAxis4;
inputAxis4.openFile("tx90_forearm.iv");
SoSeparator *mygraph = SoDB::readAll(&inputAxis4);
tx90_forearm->addChild(form4);
tx90_forearm->addChild(m_rot4);
tx90_forearm->addChild(mygraph);
return tx90_forearm;
}
SoSeparator* TX90robot::makeRod5()
{
SoSeparator* tx90_wrist = new SoSeparator;//因為函式要返回soseparator*型別
tx90_wrist->ref();
m_rot5->axis = SoRotationXYZ::Y;
SoTransform* form5 = new SoTransform;
form5->translation.setValue(0, 0, 0.268);
SoInput inputAxis5;
inputAxis5.openFile("tx90_wrist.iv");
SoSeparator *mygraph = SoDB::readAll(&inputAxis5);
tx90_wrist->addChild(form5);
tx90_wrist->addChild(m_rot5);
tx90_wrist->addChild(mygraph);
return tx90_wrist;
}
SoSeparator* TX90robot::makeRod6()
{
SoSeparator* tx90_tool_flange = new SoSeparator;//因為函式要返回soseparator*型別
tx90_tool_flange->ref();
SoTransform* form6 = new SoTransform;
form6->translation.setValue(0, 0, 0.089);
m_rot6->axis = SoRotationXYZ::Z;
SoInput inputAxis6;
inputAxis6.openFile("tx90_tool_flange.iv");
SoSeparator *mygraph = SoDB::readAll(&inputAxis6);
tx90_tool_flange->addChild(form6);
tx90_tool_flange->addChild(m_rot6);
tx90_tool_flange->addChild(mygraph);
return tx90_tool_flange;
}
void TX90robot::makeScene()
{
root = new SoSeparator;
root->ref(); //這個是總結點,要釋放下
SoSeparator *robot = new SoSeparator;
SoSeparator *Rod0 = new SoSeparator;
SoSeparator *Rod1 = new SoSeparator;
SoSeparator *Rod2 = new SoSeparator;
SoSeparator *Rod3 = new SoSeparator;
SoSeparator *Rod4 = new SoSeparator;
SoSeparator *Rod5 = new SoSeparator;
SoSeparator *Rod6 = new SoSeparator;
Rod0 = makeRod0();
Rod1 = makeRod1();
Rod1->setName("rod1");
Rod2 = makeRod2();
Rod2->setName("rod2");
Rod3 = makeRod3();
Rod3->setName("rod3");
Rod4 = makeRod4();
Rod4->setName("rod4");
Rod5 = makeRod5();
Rod5->setName("rod5");
Rod6 = makeRod6();
Rod6->setName("rod6");
//設定旋轉角度
m_rot1->angle = 0*PI/180;
m_rot2->angle = 90*PI/180;
m_rot3->angle = 45*PI/180;
m_rot4->angle = 0*PI/180;
m_rot5->angle = -90*PI/180;
m_rot6->angle = 0*PI/180;
//按相對座標 Rod0->addChild(Rod1);表示在ROd0座標系中組裝
robot->addChild(Rod0);
Rod0->addChild(Rod1);
Rod1->addChild(Rod2);
Rod2->addChild(Rod3);
Rod3->addChild(Rod4);
Rod4->addChild(Rod5);
Rod5->addChild(Rod6);
root->addChild(robot);
}
如何在MFC中顯示該圖形可參考上篇部落格。