Solidworks 2016中导出URDF文件
安装SolidWorks to URDF exporter插件
下载SolidWorks to URDF Exporter插件后按照网站上的步骤进行安装(目前该插件已经在Win 7 64位系统+Solidworks 2017上验证过。So far this add-in has been tested only on Windows 7 64bit with SolidWorks 2017 64bit. It currently does not install on 32bit machines. The add-in makes use of the most up-to-date SW API so I do not expect this tool to work with versions before SolidWorks 2012)。打开Solidworks 2016的插件对话框,可以看到SW2URDF插件已经加载并启动:
导出单个零件到URDF文件
在Solidworks中定义好零件的材质等参数后,在工具→File→Export as URDF中打开导出对话框:
可以打开“工具→评估→质量属性”对话框查看零件质量属性,URDF导出界面中的质量属性参数与Solidworks中的一致,当然也可以在导出时进行手动修改。还可以在Texture栏选择材质贴图文件(You can add a texture to the link by selecting the texture from your computer. This file will be copied into your URDF package),点击Finish后将会在指定的保存目录下生成包含URDF文件、网格文件、材质文件等的一个package.(Click finish to create the package. It will export the meshes, copy the textures and create a URDF that specifies the locations of these files.)
生成的URDF文件(Unified Robot Description Format,是一种特殊的xml 文件格式)如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
<robotname="SarrusLink.SLDPRT"><linkname="SarrusLink"><inertial><originxyz="-7.5253E-05 6.87439999999998E-20 -3.9011E-18"rpy="0 0 0" /><massvalue="1.9715" /><inertiaixx="0.00294419345246927"ixy="-6.68772298538631E-19"ixz="-5.52225503571719E-19"iyy="0.0245212201140141"iyz="-3.65385697808336E-19"izz="0.0217833254619279" /></inertial><visual><originxyz="0 0 0"rpy="1.5707963267949 0 0" /><geometry><meshfilename="package://SarrusLink/meshes/SarrusLink.STL" /></geometry><materialname=""><colorrgba="0.52941 0.54902 0.54902 1" /><texturefilename="package://SarrusLink/textures/timg.jpg" /></material></visual><collision><originxyz="0 0 0"rpy="1.5707963267949 0 0" /><geometry><meshfilename="package://SarrusLink/meshes/SarrusLink.STL" /></geometry></collision></link> </robot>
View Code
Solidworks中的零件被当做一个link,link可以指定许多属性:
- <inertial> 定义惯性参数(Kinematic and dynamic description of the robot)
- <visual> 定义外观,大小,颜色和材质纹理贴图(Visual representation of the robot)
- <collision> 定义碰撞检测属性(Collision model of the robot)
V-rep中导入URDF文件
在VREP机器人仿真软件中,可以用URDF import插件导入URDF文件:
选择导入零件的视觉部件(visual part),在Visual properties下的Texture/geometry properties中点击按钮,在弹出的对话框中选择材质贴图导入:
rviz中显示单个零件
将Solidworks中的单个零件导出成urdf文件后,为了在rviz中正确显示,可以使用static_transform_publisher发布base_link和固定坐标系map之间的静态变换,以确定零件的位置和姿态。或者可以自己写程序发布tf变换,实时更改零件的位姿。
在Solidworks中画一个简单的立方体零件,然后使用SW2URDF插件导出。在ROS工作空间中使用catkin_create_pkg创建一个新的slider包,并创建scripts文件夹用于存放Python程序。
scripts文件夹中的slider.py程序(参考joint_state_publisher):
![](/assets/blank.gif)
![](/assets/blank.gif)
#!/usr/bin/env pythonimport rospy import tfimport wx from math import pi from threading import Threadclass Slider(wx.Frame): def __init__(self, parent, title): super(Slider, self).__init__(parent, title = title,size = (400,300)) self.InitUI() self.roll = 0.0self.pitch = 0.0self.yaw = 0.0def InitUI(self): panel = wx.Panel(self) vbox = wx.BoxSizer(wx.VERTICAL) self.slider1 = wx.Slider(parent = panel,id = 1, value = 0, minValue = -900, maxValue = 900, style= wx.SL_AUTOTICKS | wx.SL_HORIZONTAL) self.slider2 = wx.Slider(parent = panel,id = 2, value = 0, minValue = -900, maxValue = 900, style= wx.SL_AUTOTICKS | wx.SL_HORIZONTAL) self.slider3 = wx.Slider(parent = panel,id = 3, value = 0, minValue = -900, maxValue = 900, style= wx.SL_AUTOTICKS | wx.SL_HORIZONTAL) self.button1 = wx.Button(panel, -1, "Center") vbox.Add(self.slider1,1,flag = wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, border = 20) vbox.Add(self.slider2,1,flag = wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, border = 20) vbox.Add(self.slider3,1,flag = wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, border = 20) vbox.Add(self.button1,1,flag = wx.EXPAND | wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, border = 20) self.slider1.Bind(wx.EVT_SLIDER, self.OnSliderScroll) self.slider2.Bind(wx.EVT_SLIDER, self.OnSliderScroll) self.slider3.Bind(wx.EVT_SLIDER, self.OnSliderScroll) self.button1.Bind(wx.EVT_BUTTON, self.OnClick) panel.SetSizer(vbox) self.Centre() self.Show(True) def OnSliderScroll(self, event): obj = event.GetEventObject() val = obj.GetValue() * pi / 1800.0id = event.GetId()if id == 1:self.roll = valelif id == 2:self.pitch = valelif id ==3 :self.yaw = val#print self.roll, self.pitch, self.yawdef OnClick(self, event): self.slider1.SetValue(0)self.slider2.SetValue(0)self.slider3.SetValue(0)self.roll = 0.0self.pitch = 0.0self.yaw = 0.0def send_tf():ex = wx.App() s = Slider(None,'Change Orientation') rospy.init_node('tf_broadcaster')br = tf.TransformBroadcaster()rate = rospy.Rate(10) # 10hz Thread(target=ex.MainLoop).start()while not rospy.is_shutdown():br.sendTransform((0,0,0), \tf.transformations.quaternion_from_euler(s.roll,s.pitch,s.yaw), \rospy.Time.now(), \"base_link", \"map")rate.sleep()if __name__ == '__main__': try:send_tf()except rospy.ROSInterruptException: pass
View Code
part.urdf文件:
![](/assets/blank.gif)
![](/assets/blank.gif)
<robotname="part"><linkname="base_link"><inertial><originxyz="0 0 -0.025"rpy="0 0 0" /><massvalue="0.125" /><inertiaixx="5.20833333333333E-05"ixy="0"ixz="0"iyy="5.20833333333333E-05"iyz="0"izz="5.20833333333333E-05" /></inertial><visual><originxyz="0 0 -0.025"rpy="0 0 0" /><geometry><meshfilename="package://slider/meshes/part.STL" /></geometry><materialname=""><colorrgba="0.45294 0.75294 0.35294 1" /><texturefilename="package://slider/textures/timg.jpg" /></material></visual><collision><originxyz="0 0 0"rpy="0 0 0" /><geometry><meshfilename="package://slider/meshes/part.STL" /></geometry></collision></link> </robot>
View Code
display.launch文件:
<launch><param name="robot_description" textfile="$(find slider)/urdf/part.urdf" /><node name="slider" pkg="slider" type="slider.py" /><node name="rviz" pkg="rviz" type="rviz" args="-d $(find slider)/part.rviz" required="true" /> </launch>
Python中创建GUI界面用到了wxPython库。由于GUI和ROS分别有自己的事件循环,为了不相互阻塞,可以在主线程中执行ROS循环,然后新开启一个线程执行GUI线程。代码中函数对象ex.MainLoop作为参数传给它的初始化函数,再调用Thread对象的start方法,线程启动后将执行ex.MainLoop函数。ROS程序以10Hz的频率发布base_link相对于map的变换关系,这里只改变其姿态(GUI界面上拖动滑块时可以改变RPY角)。
threading.Thread类的初始化函数原型:
def __init__(self, group=None, target=None, name=None, args=(), kwargs={})
- 参数group是预留的,用于将来扩展;
- 参数target是一个可调用对象,在线程启动后执行;
- 参数name是线程的名字。默认值为“Thread-N”,N是一个数字。
- 参数args和kwargs分别表示调用target时的参数列表和关键字参数。
使用catkin_make编译一下slider包,并注意环境变量的设置。没问题后输入下面命令打开rviz,同时通过GUI界面上的三个滑块调整物体姿态:
$ roslaunch slider display.launch
导出装配体到URDF文件
SW2URDF插件并没有智能到能自动识别Solidworks装配体中的约束,然后正确导出URDF文件,还需要我们自己在装配体中建立参考坐标系、参考轴以及指定轴的类型。如下图所示Joint axis的方向定义在Joint frame中,而Joint frame则相对于其父坐标系Parent frame定义:
下面我们以达芬奇手术机器人的一个臂为例子,将其Solidworks装配体导出成URDF文件并在rviz中显示。首先需要自己建立机器人的关节坐标系和关节参考轴,在装配体界面的参考几何体菜单中我们可以建立基准面、基准轴、坐标系、点等一系列参考几何体:
按照通常习惯我们以Z轴作为关节参考轴的方向,即如果是移动关节那么就沿着Z轴方向移动,如果是转动关节则按照右手定则绕Z轴转动。将参考坐标系frame0建立在第一个零件base_link上,frame1建立在link1上...那么整个运动链为:frame0/base_link→ joint1 →frame1/link1→ joint2 →frame2/link2→ joint3 →frame3/link3→ joint4 →frame4/link4
创建好参考坐标系和参考轴后打开SW2URDF插件,按顺序正确配置参数:
配置好运动链后点击Preview and Export按钮会弹出一个界面,现在需要配置关节的一些参数。需要注意的是Solidworks中建立的参考轴只有方向而没有正负,比如Axis=(0,0,1)则运动的正方向沿着Joint frame Z轴的正方,而如果是Axis=(0,0,-1)则运动的正方向沿着Joint frame Z轴的负方向,因此要注意正负号。
另外还需要注意如果选择prismatic或revolute这种非continuous类型的关节,需要在Limit中设定轴的运动范围,否则后面执行launch文件时会出错。下面就是没有设置关节运动范围的错误提示:
可以先看看生成的URDF文件中对关节1的描述,可以知道joint1是移动关节,父对象为base_link,子对象为link1。移动的正方向沿着joint1坐标系(frame1)的Z轴正方向,关节移动上限为5mm,下限为-415mm。origin标签中xyz表示frame1的原点在frame0中的位置,rpy表示frame1相对于frame0的姿态角。
<jointname="joint1"type="prismatic"><originxyz="0.415 0 0.046285"rpy="1.5708 9.2354E-16 1.5708" /><parentlink="base_link" /><childlink="link1" /><axisxyz="0 0 1" /><limitlower="-0.415"upper="0.05"effort="0"velocity="0" /> </joint>
在Solidworks中测量可知frame1相对于frame0的位置为(0.415, 0, 0.04629),用RPY角表示的姿态为(90°, 0, 90°),可见与URDF文件的描述一致。
关节参数配置好后点击Next进入连杆配置界面,可以在里面设置连杆质量、惯性张量、颜色、材质等属性:
配置好后点击Finish,将生成的文件夹保存到指定的目录下。我们指定的文件夹名为test,里面有一些子文件夹:urdf中包含了机器人的urdf文件,textures里面放着材质贴图,meshes中放着模型的STL文件,launch文件夹中有display.launch文件可以在rviz中查看机器人。
自动生成的文件中还存在一些问题需要修改。package.xml文件中的email是不合法的,只要改成合法的email就可以了
<maintainer email="me2email.com" /> <!-- 可以改为:me@email.com -->
另外display.launch文件里中gui参数要设为True,否则无法打开Joint State Publish工具
<arg name="gui" default="False" /> <!-- 将False改为True -->
还有查找urdf文件时要将路径中的robots改为urdf,或者直接将urdf文件夹重命名为robots
<param name="robot_description" textfile="$(find test)/robots/test.urdf" /> <!-- robots改为urdf -->
改完后将test文件夹移动到ROS工作目录下的源代码目录中(比如catkin_ws/src下),然后使用catkin工具编译一下。下面执行roslaunch test display.launch,在rviz中添加RobotModel,并将Fixed Frame设为base_link,此时机器人就能正确显示出来。这里需要注意Solidworks中建立的frame0坐标系的朝向会影响机器人在rviz中的初始姿态。另外,如果还想观察关节运动时坐标系的变化,可以点击Add按钮添加TF。
拖动Joint State Publisher界面上的滑块可以改变对应关节的位置,最左边是之前设定的lower limit,最右边是upper limit.
参考:
http://wiki.ros.org/sw_urdf_exporter
http://wiki.ros.org/sw_urdf_exporter/Tutorials
XML Robot Description Format (URDF)
rviz使用参考
WxPython教程
ROS专题----机器人模型urdf简明笔记
Python模块学习:threading 多线程控制和处理
Solidworks模型转化为URDF文件格式+三连杆机械臂示例+逆运动学
转载于:https://www.cnblogs.com/21207-iHome/p/7821269.html
Solidworks 2016中导出URDF文件相关推荐
- solidworks导出urdf文件并在ROS中显示
01 solidworks导出urdf文件 官网下载插件:http://wiki.ros.org/sw_urdf_exporter 然后到github上下载插件,虽然我是solidworks2022, ...
- ROS中对URDF文件检查时出现的问题及解决方式
ROS中对URDF文件检查时出现的问题及解决方式 最近在学习ROS,遇到了一个小问题,顺便记录一下加深印象,同时也为出现同样问题的伙伴们提供一些参考.由于是第一次写博客,所以显得有些简单,我相信只要有 ...
- 利用SW插件导出urdf文件
SW插件导出urdf文件 安装URDF插件 导出教程 安装URDF插件 插件下载链接:SW_URDF 下载插件后按照提示安装到一个文件夹路径下(任意). 然后打开SW------->进入模型或者 ...
- svga插件_【SVGA扩展】在AE或Animate中导出SVGA文件的设计师工具(mac+win)及安装教程...
SVGA扩展 – 在AE或Animate中导出SVGA文件的设计师工具 什么是SVGA SVGA 是一种全新的古文字体歌曲音乐swf转换,华为ipad华为ipad手机手机省电模式古风字体播放体验,SV ...
- Unity中导出apk文件
文章目录 一.JDK下载与配置 JDK下载 配置环境变量 二.Android SDK下载 一.通过Android Studio下载 二.直接下载Android SDK 三.导出APK文件 四.注意事项 ...
- Altium Designer中导出bxl文件
AD软件版本:18.1.9 首先我们需要去下载一个bxl文件,这里一般的芯片厂商都会提供封装让我们去下载,这里我们以Ti的OPA333为例进行讲解. 然后我们需要下载读取器软件Ultra Librar ...
- Java中导出pdf文件,pdf工具类demo
最近在做导出pdf文件的功能,参考了很多资料和demo,完成了转出pdf的功能,并适合项目的pdf工具类,现贴出具体的工具类和demo,如有不对的地方欢迎指正 1.pdf工具类PdfUtil.java ...
- macbook环境下从iphone微信中导出语音文件
What 手机微信不支持保存语音消息到本地,而微信中保存的音频格式aud基本上所有的播放器都没法直接播放,需要进一步处理 Why 想把微信里面的语音详细保存到本地,做进一步处理 How 主要是二步,先 ...
- GEE学习笔记:在Google Earth Engine(GEE)中导出shp文件
目前想到的需要导出shp文件的应用场景有如下: 1.在线处理矢量数据,将结果导出. 2.在GEE上选取样本点,导出到本地处理. 3.将得到的栅格结果转成矢量,再导出到本 ...
最新文章
- 表格(增加行号) http://www.blogjava.net/zeyuphoenix/archive/2010/04/19/318788.html
- [转]微软发布WF教程及大量示例
- php 删除xls文件,使用PHPExcel将xls文件转换为xlsx时出错
- 用iPhone给林徽因拍照会是啥样?这款“穿越相机”把老照片换成现代风
- 【POJ】【2975】Nim
- 即插即用的轻量注意力机制ECA--Net
- 异动分析技术解决方案—异动归因之指标拆解
- (转)使用Spring的注解方式实现AOP的细节
- 【Java后台】从零开始的Java后台开发(一)
- 从0开始的视频特效制作之路
- nrf uart for android,nRF Toolbox for BLE
- 流图(程序图)表示程序的控制流——McCabe方法度量程序空间复杂度
- omap android,德州仪器基于Android 移动平台演示OMAP
- 【FPGA教程案例78】通信案例4——基于FPGA的RLS自适应滤波算法实现
- 工业交换机的内部组成是什么?
- 功能测试的类型之Alpha和Beta测试
- 丘成桐中学科学奖计算机怎样,丘成桐中学科学奖是什么?
- ubuntu进去安全模式_win10和Ubuntu双系统,无法开机如何进入win10安全模式
- R语言实现LDA算法(鸢尾花)
- MacOS设置终端代理
热门文章
- 在城市之间“闪送”,同城即时速递的正确解法
- 移动网页唤起手机内 支付宝 微信支付
- java的两种比较器
- 闪讯利用openwrt路由器拨号教程(一)
- html5中还有div吗,关于html5中的section标签与div标签的区别(内有实例)
- 官宣丨“创客集结号”成功接入“广东省教育资源公共服务平台”!
- 网络安全—arp欺骗原理数据包分析
- opencv 显示中文字体
- R语言分时滞后模型时间序列分析在空气污染与健康领域的应用(2)
- python科研用哪个软件好_有哪些好的科研工具软件?