openg离线包_robot-program-offline-master(五轴机器人离线仿真)
刪除代碼項目里面的ui開頭的文件重新編譯就不會出錯;
模型
左邊導(dǎo)航
Dockwidget
點擊聯(lián)調(diào)按鈕加載analysiswidget
繪圖使用customplot
STLView 解析STL文件 使用多線程解析
頂點
//三角形片類,主要由三個頂點坐標和一個法向量組成
classMyTriangle
{
public:
MyPointnormal,vertex1,vertex2,vertex3;
};
//解析STL文件生成triangleVector數(shù)組
boolSTLView::readSTL(constQString&fname){
QFilefile(fname);
if(file.open(QFile::ReadOnly|QFile::Text))//僅讀和文字
{
QTextStreamin(&file);
MyTriangletriangle;
QStringline;
inttrianglePartNums=0;
while(!in.atEnd())
{
line=in.readLine();
QVectorwords;
//分割一行,生成words字符串數(shù)組返回字符個數(shù)
intnum=CommonFun::splitString(line,'',words);
//解析一行
for(inti=0;i
{
//集齊4個參數(shù),添加一個三角片
if(trianglePartNums==4)
{
triangleVector.push_back(triangle);
trianglePartNums=0;
}
if(words[i]=="normal")
{
triangle.normal.x=words[i+1].toDouble();
triangle.normal.y=words[i+2].toDouble();
triangle.normal.z=words[i+3].toDouble();
trianglePartNums++;
break;
}
if(words[i]=="vertex")
{
if(trianglePartNums==1)
{
triangle.vertex1.x=words[i+1].toDouble();
triangle.vertex1.y=words[i+2].toDouble();
triangle.vertex1.z=words[i+3].toDouble();
}
if(trianglePartNums==2)
{
triangle.vertex2.x=words[i+1].toDouble();
triangle.vertex2.y=words[i+2].toDouble();
triangle.vertex2.z=words[i+3].toDouble();
}
if(trianglePartNums==3)
{
triangle.vertex3.x=words[i+1].toDouble();
triangle.vertex3.y=words[i+2].toDouble();
triangle.vertex3.z=words[i+3].toDouble();
}
trianglePartNums++;
break;
}
}
}
file.close();
returntrue;
}
else
{
qWarning()<
returnfalse;
}
}
voidSTLView::run()
{
switch(type)
{
caseLanxunCoordRobot:
lanxunCoordView[n].readSTL(QString(":/stl/lanxunCoordRobot/%1.STL").arg(n+1));
break;
caseLanxun5JointRobot:
lanxun5JointView[n].readSTL(QString(":/stl/lanxun5JointRobot/%1.STL").arg(n+1));
break;
caseLanxun6JointRobot:
lanxun6JointView[n].readSTL(QString(":/stl/lanxun6JointRobot/%1.STL").arg(n));
break;
}
}
OpenglWidget 使用gllist生成
voidOpenglWidget::makeObject()
{
qDebug()<
doublediv=scaleNum;
intlistNum=0;
//如果沒有工件,就少一個顯示列表
/*if(artifacts==NULL){
listNum=num;
}else{
listNum=num+1;
}*/
listNum=(!artifacts)?num:++num;
/**************************************************************************
OpenGL中用正整數(shù)來區(qū)分不同的顯示列表,為防止重復(fù)定義已經(jīng)存在的顯示列表號,
使用glGenLists函數(shù)來自動分配一個沒有被使用過的顯示列表編號。
參數(shù)指定要分配幾個顯示列表,返回值是被分配的顯示列表中的最小編號,若返回0表示分配失敗
**************************************************************************/
gllist[0]=glGenLists(listNum);
for(inti=1;i
gllist[i]=gllist[0]+i;
}
for(intn=0;n
//開始裝入:第一個參數(shù)標示當前正在操作的顯示列表號
//第二個參數(shù)有兩種取值GL_COMPILE和GLCOMPILE_AND_EXECUTE,
//前者聲明當前顯示列表只是裝入相應(yīng)OpenGL語句,不執(zhí)行;后者表示在裝入的同時,執(zhí)行一遍當前顯示列表。
glNewList(gllist[n],GL_COMPILE);
qglColor(color[n]);
glBegin(GL_TRIANGLES);
for(inti=0;i
glNormal3f((view[n]).triangleVector[i].normal.x,(view[n]).triangleVector[i].normal.y,(view[n]).triangleVector[i].normal.z);
glTexCoord2f(0,0);
glVertex3f((view[n]).triangleVector[i].vertex1.x/div,(view[n]).triangleVector[i].vertex1.y/div,
(view[n]).triangleVector[i].vertex1.z/div);
glTexCoord2f(0.5,1.0);
glVertex3f((view[n]).triangleVector[i].vertex2.x/div,(view[n]).triangleVector[i].vertex2.y/div,
(view[n]).triangleVector[i].vertex2.z/div);
glTexCoord2f(1.0,0);
glVertex3f((view[n]).triangleVector[i].vertex3.x/div,(view[n]).triangleVector[i].vertex3.y/div,
(view[n]).triangleVector[i].vertex3.z/div);
}
glEnd();
glEndList();
}
if(artifacts){
//創(chuàng)建顯示列表并付給list
glNewList(gllist[num],GL_COMPILE);
qglColor(color[num]);
/**************************************************************************
*glNormal3f設(shè)置當前法線數(shù)組
*glTexCoord2f繪制圖形時指定紋理的坐標,為了將紋理正確的映射到四邊形上,必須將紋理的四個角映射到四邊形的四個角
*glVertex3f指定3D頂點,一般與glTexCoord2f同時使用,先紋理后頂點
*glBegin(GL_TRIANGLES)多組獨立填充三角形
**************************************************************************/
glBegin(GL_TRIANGLES);
for(MyTriangleit:artifacts->triangleVector){
glNormal3f(it.normal.x,it.normal.y,it.normal.z);
//左下角的紋理與頂點映射
glTexCoord2f(0,0);
glVertex3f(it.vertex1.x/div,it.vertex1.y/div,it.vertex1.z/div);
//中間點
glTexCoord2f(0.5,1.0);
glVertex3f(it.vertex2.x/div,it.vertex2.y/div,it.vertex2.z/div);
//右下角
glTexCoord2f(1.0,0);
glVertex3f(it.vertex3.x/div,it.vertex3.y/div,it.vertex3.z/div);
/*
for(inti=0;itriangleVector.size();i++){
glNormal3f(artifacts->triangleVector[i].normal.x,artifacts->triangleVector[i].normal.y,artifacts->triangleVector[i].normal.z);
//左下角的紋理與頂點映射
glTexCoord2f(0,0);
glVertex3f(artifacts->triangleVector[i].vertex1.x/div,artifacts->triangleVector[i].vertex1.y/div,
artifacts->triangleVector[i].vertex1.z/div);
//中間點
glTexCoord2f(0.5,1.0);
glVertex3f(artifacts->triangleVector[i].vertex2.x/div,artifacts->triangleVector[i].vertex2.y/div,
artifacts->triangleVector[i].vertex2.z/div);
//右下角
glTexCoord2f(1.0,0);
glVertex3f(artifacts->triangleVector[i].vertex3.x/div,artifacts->triangleVector[i].vertex3.y/div,
artifacts->triangleVector[i].vertex3.z/div);
*/
}
glEnd();
glEndList();
}
qDebug()<
}
OpenglWidget 按鍵鼠標 滾輪
通過改變關(guān)節(jié)角度重新繪制
OpenglWidget 文字
示教窗口
示教窗口 列表
列表右鍵菜單
示教窗口 點動 逆解求關(guān)節(jié)角度
機器人正逆解
SimulationParse
Opengl繪制(使用GLlist)
數(shù)據(jù)包解析
//提取數(shù)據(jù),數(shù)據(jù)包結(jié)構(gòu)包括,(指令,指令長度,6個坐標,8關(guān)節(jié)值)
int Parser::getValue(const QStringList & list)
{
if(list.size() < 2)
return -1;
if(list.size() != list[1].toInt())
return -1;
if(list[0] == "UC"){
cmd = CoordJoint;
for(int i=2;i<16;++i){
if(i<8){
coord[i-2] = list[i].toDouble();
}else{
joint[i-8] = list[i].toDouble();
}
}
// for(int i = 2;i < 8;i++){
// coord[i - 2] = list[i].toDouble();
// }
// for(int i = 8; i < 16; i++){
// joint[i - 8] = list[i].toDouble();
// }
return 0;
}
if(list[0] == "M7"){
qDebug() << "開火";
cmd = OpenFire;
return 0;
}
if(list[0] == "M8"){
qDebug() << "關(guān)火";
cmd = CloseFire;
return 0;
}
if(list[0] == "EE"){
qDebug() << "連接";
cmd = ConnectCmd;
return 0;
}
else
return -1;
}
數(shù)據(jù)發(fā)送(使用套接字)
數(shù)據(jù)曲線繪制
矩陣運算(機器人正逆解)
各種旋轉(zhuǎn)矩陣
逆運動學(xué)結(jié)算由解析解公式代入即可
G代碼解析(插補運算,圓弧等分)
總結(jié)
以上是生活随笔為你收集整理的openg离线包_robot-program-offline-master(五轴机器人离线仿真)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置sygate客户端
- 下一篇: 江苏省计算机等级考试一级b,计算机等级考