通过在史陶比尔官网下载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.14159265358979323846class 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中显示该图形可参考上篇博客。

coin3D中导入机器人模型相关推荐

  1. 一种从Robotstudio环境中导出机器人模型并在MATLAB下使其可视化的研究记录

    1.前记:回到学校反而没时间记录了自己瞎折腾的东西了,允我长长的叹一口气   '_' // 先提一下,在这篇MATLAB机器人可视化博客中提到了如何使CAD模型的机器人在MATLAB环境下可视化的问题 ...

  2. ADS中导入SPICE模型

    这里写目录标题 在官网中下载SPICE模型 ADS中导入SPICE模型 在官网中下载SPICE模型 英飞凌官网 ADS中导入SPICE模型 点击option,设置导入选项 然后点击ok 如果desti ...

  3. 6.5 Rviz中控制机器人模型运动

    ROS入门 6.5 Rviz中控制机器人模型运动 <ROS入门-理论与实践>视频教程镇楼 通过 URDF 结合 rviz 可以创建并显示机器人模型,不过,当前实现的只是静态模型,如何控制模 ...

  4. 解决在OpenGL中导入.obj模型所遇一些问题的方法

    解决在OpenGL中导入.obj模型所遇一些问题的方法 相对路径格式 "/"与"\" 相对路径起始 导入模型的限制 最近在学习 LearnOpenGL CN,学 ...

  5. Rviz中控制机器人模型运动(arbotix)

    前言: 通过 URDF 结合 rviz 可以创建并显示机器人模型,不过,当前实现的只是静态模型,如何控制模型的运动呢?在此,可以调用 Arbotix 实现此功能. 简介: Arbotix:Arboti ...

  6. Three.js中导入GLTF模型变黑无法看到模型

    一个下午都在Three.js官网导入GLTF模型,但是很不幸,根据官网DEMO中一直待有texture纹理,不能单独载入模型,后经一番查找,发现其实早已经单独讲模型载入到网页中,但是模型与背景色均为黑 ...

  7. Zemax | Zemax中导入CAD模型

    在处理非序列模式时常常需要导入一些复杂的模型结构,使用Zemax软件自身的画图功能显得有些相形见绌了,可以在CAD中先画好模型再导入进去. 一.将CAD模型导出为IGES/STEP等格式,将文件放出到 ...

  8. AutoCAD中导入Inventor模型

    大家知道,Inventor能产生工程图,但有一部分用户更习惯在AutoCAD中去进行工程图的设计.从AutoCAD 2013开始支持导入Inventor模型,生成对应的工程图.有两种模式: 模式一: ...

  9. Unity中导入外部模型与预制件

    前言: 在Unity3D的 Asset Store  中下载的包(package)资源, 其默认位置是: C:\Users\用户名\AppData\Roaming\Unity\Asset Store- ...

  10. unity支持的模型数据格式_Unity3D开发:向Unity3D中导入外部模型

    Unity3D支持多种外部导入的模型格式,但它并不是对每一种外部模型的属性都支持.具体的支持参数,您可以对照如下列表: 种类 网络 材质 动画 骨骼 Maya的.mb和.mal格式 √ √ √ √ 3 ...

最新文章

  1. Apache软件历史版本下载地址
  2. C#二进制文件编程实践
  3. tensorflow随笔-条件循环控制(1)
  4. 摇杆怎么映射到键盘_[评测]YAMAHA PSRSX900:雅马哈升级幅度最大的高端编曲键盘键盘中国原创评测...
  5. Useful “ifconfig” Commands to Configure Network Interface in Linux
  6. 如何优化多数据集关联报表
  7. python猜数字十次、猜对输出猜了多少次_python-猜数字小练习
  8. 考勤系统(打卡时间计算)
  9. 数据库实验7---数据库的备份与恢复
  10. 个人支付微信支付宝接口
  11. linux mplayer rpm,mplayer - movie player for linux
  12. C++:pass by reference的时候真正传递的是什么?
  13. Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 21 declared in lib
  14. html5 单元格宽度,html table呈现个人简历以及单元格宽度失效的问题解决
  15. 可视化编程,公网访问——全网首个基于Node-red的在线评语系统
  16. python写对象提供的方法_下面哪些是python读对象提供的“写”方法?
  17. 对接天猫接口之获取宝贝主图和购买宝贝对应的SKU图片(Java实现)
  18. XCKU5P-2FFVB676E 赛灵思FPGA可编程逻辑芯片器件 XILINX
  19. Apache Log4j2 RCE漏洞利用反弹shell合集
  20. [转]C++中的头文件和源文件 .h .cpp

热门文章

  1. 11.30上海交大PMP试题每日一题
  2. 3.15PMP试题每日一题
  3. JSP九大内置对象及其作用域
  4. 下载徐小明新浪博客全部博文链接
  5. 用JEP+SpringBoot进行动态公式处理计算
  6. 《21天学通Java(第6版)》—— 2.10 认证练习
  7. Windows个人常用软件推荐
  8. VS2008+Vassistx使用技巧
  9. CS231n 课程笔记翻译
  10. CAN协议 J1939