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 文件格式)如下:

<robot
  name="SarrusLink.SLDPRT">
  <link
    name="SarrusLink">
    <inertial>
      <origin
        xyz="-7.5253E-05 6.87439999999998E-20 -3.9011E-18"
        rpy="0 0 0" />
      <mass
        value="1.9715" />
      <inertia
        ixx="0.00294419345246927"
        ixy="-6.68772298538631E-19"
        ixz="-5.52225503571719E-19"
        iyy="0.0245212201140141"
        iyz="-3.65385697808336E-19"
        izz="0.0217833254619279" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 0"
        rpy="1.5707963267949 0 0" />
      <geometry>
        <mesh
          filename="package://SarrusLink/meshes/SarrusLink.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.52941 0.54902 0.54902 1" />
        <texture
          filename="package://SarrusLink/textures/timg.jpg" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="1.5707963267949 0 0" />
      <geometry>
        <mesh
          filename="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):

#!/usr/bin/env python

import rospy
import tf

import wx 
from math import pi
from threading import Thread

class Slider(wx.Frame): 

    def __init__(self, parent, title): 
        super(Slider, self).__init__(parent, title = title,size = (400,300))  
        self.InitUI() 
        self.roll = 0.0
        self.pitch = 0.0
        self.yaw = 0.0

    def 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.0
        id = event.GetId()
        if id == 1:
            self.roll = val
        elif id == 2:
            self.pitch = val
        elif id ==3 :
            self.yaw = val

        #print self.roll, self.pitch, self.yaw
        


    def OnClick(self, event): 
        self.slider1.SetValue(0)
        self.slider2.SetValue(0)
        self.slider3.SetValue(0)
        self.roll = 0.0
        self.pitch = 0.0
        self.yaw = 0.0




def 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文件:

<robot
  name="part">
  <link
    name="base_link">
    <inertial>
      <origin
        xyz="0 0 -0.025"
        rpy="0 0 0" />
      <mass
        value="0.125" />
      <inertia
        ixx="5.20833333333333E-05"
        ixy="0"
        ixz="0"
        iyy="5.20833333333333E-05"
        iyz="0"
        izz="5.20833333333333E-05" />
    </inertial>
    <visual>
      <origin
        xyz="0 0 -0.025"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="package://slider/meshes/part.STL" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.45294 0.75294 0.35294 1" />
        <texture
          filename="package://slider/textures/timg.jpg" />
      </material>
    </visual>
    <collision>
      <origin
        xyz="0 0 0"
        rpy="0 0 0" />
      <geometry>
        <mesh
          filename="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的姿態角。

<joint name="joint1" type="prismatic">
    <origin xyz="0.415 0 0.046285" rpy="1.5708 9.2354E-16 1.5708" />
    <parent link="base_link" />
    <child link="link1" />
    <axis xyz="0 0 1" />
    <limit lower="-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文件格式+三連桿機械臂示例+逆運動學


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM