☰
SolidWorks模型转URDF全攻略:以UR3机械臂坐标系与关节轴为例
2026/10/14 0:22:44 网站建设 项目流程

现在做机器人开发,绕不开ROS。可在ROS里让机械臂动起来,前提是拿到一份合格的URDF文件。我见过不少人手里只有一个SolidWorks装配体,于是卡在第一步:怎么把SW模型转成URDF?以最常见的UR3六轴机械臂为例,明明模型已经画得很逼真,转完用rviz打开却是各种飞、各种乱。这不是软件bug,而是转换过程中坐标系和关节轴的信息没有被正确表达。今天这篇就针对UR3机械臂的SW转URDF,把从模型准备、插件安装到导出配置、ROS接入、坑位排查的全流程捋一遍,适合正在做毕设、竞赛或者刚接触MoveIt的同学参考。

1. 为什么必须转URDF,以及三种转换方案怎么选

1.1 SolidWorks模型和URDF到底差在哪

SolidWorks模型本质上只是一堆几何体的集合,它把每个零件的形状、尺寸、材质和装配关系都画得清清楚楚,但它自己并不知道“这个零件该怎么转”。URDF则是ROS世界里的机器人口述说明书:每个零件叫什么名字、长什么样、重心在哪、绕哪个轴转、能转多大范围、碰撞体积是什么,全部要写清楚。

UR3这种六自由度串联机械臂,结构拆开就是基座加六段手臂,中间有六个旋转关节。在SolidWorks里,这六个关节可能只是普通的“同心配合”加“重合配合”,模型能手动拖拽旋转,但URDF需要的是更明确的信息:每个关节的旋转轴在父link坐标系下的方向向量、关节原点的位置、关节限位、质量与惯性参数。没有这些,MoveIt做不了运动规划,Gazebo做不了动力学仿真,rviz里也只能看到一个不能动的静态模型。

所以转换过程不只是换个文件格式这么简单,本质是把“设计模型”翻译成“仿真模型”。如果翻译错了,机器人看起来还是那个机器人,动起来却完全不是那回事。

1.2 插件导出、手写XML、第三方工具,我为什么推荐插件

目前把SolidWorks模型转成URDF,主流做法有三类。

第一类是使用SW2URDF插件,直接在SolidWorks里为每个link指定参考坐标系,逐个添加joint,插件自动生成URDF文件、STL/DAE网格以及质量属性。第二类是用第三方软件,比如Fusion360或Blender的URDF导出插件,适合模型原本不在SolidWorks里的情况。第三类是彻底手写URDF,自己把SW模型导出成STL,再用记事本一行行填link和joint标签。

我推荐第一类,也就是SW2URDF,理由很直接:坐标系和关节轴的信息在SolidWorks图形界面里用鼠标点选就能确定,比手写坐标换算直观得多。惯性张量也能让SolidWorks根据材料密度自动算出来,比自己拍脑袋填靠谱。手写URDF当然灵活,但UR3有6个joint、7个link,每个关节都要算父子坐标变换,手工操作不但费时,还极其容易把某个符号算反,排查起来相当痛苦。

如果手里只有STEP或者IGES这类中间格式,没法直接装插件,那就先用SolidWorks打开并另存为SLDASM,再走插件流程。实际项目里这招已经帮我在多个不同格式的模型上顺利转过,没什么可担心的。

2. 转换前必做的模型整理与坐标系定义

2.1 零件命名、单位设置和模型简化,动手前的三件套

转换前最容易被忽略的一件事,是检查零件命名。导出的URDF会把SolidWorks里的零部件名称直接带出来,如果零件还叫“零件1”“Sheet Metal1”之类的默认名字,后面写脚本、调MoveIt的时候全是坑。强烈建议在SolidWorks里把每个运动部件重命名成URDF风格的link名,比如:

  • base_link
  • shoulder_link
  • upper_arm_link
  • forearm_link
  • wrist_1_link
  • wrist_2_link
  • wrist_3_link

命名规则看起来简单,却能让后续所有工作省心。使用Snake Case命名还有一个好处:ROS的工具链普遍对下划线支持良好,中文和空格会在launch文件、路径引用时引发各种莫名其妙的问题。

第二个要检查的是单位。SolidWorks文档属性里的单位应该设为MMGS(毫米、克、秒),因为URDF的默认单位是米、千克、秒。SW2URDF插件一般会自动换算,但如果源模型当初是用英制或者厘米建的,导出的尺寸会差一个数量级,装到rviz里整个机械臂大得离谱或者小得看不见。这个检查只要一眼,却能避免后面返工一整天。

第三个是模型简化。螺钉、螺孔、倒角、圆角这些特征,在SolidWorks里是设计必要,但一旦导出成STL,都会变成几万甚至几十万个三角面片,导致URDF文件巨大、rviz卡顿、Gazebo物理更新缓慢。我习惯在导出前把对运动学无关的装饰特征压缩或抑制掉,只保留外壳主体和关键安装面。别舍不得,视觉效果以后再贴图补回来。

2.2 关节坐标系怎么建:旋转轴和原点一个都不能错

这是整篇文章最核心的部分,也是大多数模型在rviz里乱飞的根本原因。

URDF里每个joint的origin描述的是子link坐标系相对父link坐标系的位置和姿态,axis向量描述的是旋转轴在父link坐标系下的方向。如果这两个信息不准确,机器人的关节就会在错误的位置、绕着错误的轴旋转。问题在于,SolidWorks里每个零件默认坐标系的原点通常不在关节轴线上,直接拿来用会导致关节中心偏移。

正确做法是在SolidWorks里为每个关节单独建一个坐标系。坐标系的原点放在旋转轴线上,Z轴与旋转轴重合,X轴指向下一个臂段的伸展方向。以UR3为例,基座到肩部之间的腰部旋转关节,轴线是竖直的,坐标系Z轴就垂直向上;大臂俯仰关节,轴线是水平的,Z轴水平方向,X轴沿着大臂的长度方向。末端三个腕部关节的轴线互相垂直,更需要分别建立坐标系,千万别偷懒用一个坐标系套三个关节。

我建议给这些坐标系也赋予明确的名字,比如axis_shoulder、axis_upperarm、axis_forearm、axis_wrist1等。这样导出面板里选参考坐标系时,一眼就知道该选哪个。不要等到导出面板里弹出一堆“坐标系1、坐标系2”才开始懊恼。

还有一个经常踩的坑:装配体里关节的“同轴配合”虽然能让零件转动,但配合本身不一定保证旋转轴经过某个零件的默认原点。所以建立坐标系时一定要以装配体基准轴或者配合轴线作为参考,而不是从零件原点随便偏移出来。可以用SolidWorks的“参考几何体→基准轴”选择圆柱面,再基于这条轴建立坐标系,这样轴线的位置和方向都有据可查。

2.3 惯性参数和碰撞体:仿真真实感全靠它们

很多人转完URDF后第一个反应是“能动了,够用了”,结果一进Gazebo就出问题:关节疯狂振荡、机械臂垮塌、越转越飞。这些大概率是inertial标签没有好好填。

SW2URDF插件在导出时可以读取SolidWorks材料的密度,自动生成每个link的质量、质心位置和惯性张量。前提是零件必须设置了正确的材质,比如铝合金、钢或者自定义密度。如果零件没赋材料,SolidWorks会按默认值计算,导出的质量可能差到离谱。所以在导出前,给每个主要结构件都指定材料属性。

碰撞体同样要单独考虑。URDF里的collision标签对应碰撞检测使用的几何体,如果直接用高精度STL,Gazebo和MoveIt的碰撞检测计算量会成倍增加。对UR3这种机械臂,完全可以把每个link的碰撞体简化为圆柱体、长方体或者低面数的STL。视觉网格负责好看,碰撞体负责好用,两者分开处理,仿真性能立刻不一样。

3. Sw2URDF导出实操:从安装到ROS加载

3.1 插件安装与版本兼容

SW2URDF是一个开源免费的插件,在ROS Wiki的SW2URDF页面可以找到详细的说明和下载链接。它主要支持Windows版SolidWorks,比较老的版本也能跑,我自己在多个版本的SolidWorks环境中都装过。

安装过程不复杂。下载插件压缩包后解压,里面有安装说明和对应的bin、lib文件夹。通常是把这些文件夹的内容复制到SolidWorks安装目录的对应位置,再以管理员身份运行注册脚本,让SolidWorks加载插件。装好后重新打开SolidWorks,菜单栏的“工具”下会多出一个“SW2URDF”入口。如果看不到,到SolidWorks的“插件”面板里把SW2URDF相关项勾选上,有些版本需要手动启用COM加载项。

版本兼容这件事确实存在,老插件在特别新的SolidWorks版本里偶尔会有界面刷不出来、导出按钮置灰的情况。遇到这种情况先确认插件版本和SolidWorks版本是否匹配,不要盲目装最新的插件,有时候老版反而更稳定。如果插件确实不可用,备选方案是手写URDF,流程大概就是导出STL→人工填XML→用check_urdf纠错。但既然选择插件路线,还是先花点时间把环境调通。

3.2 导出面板逐项配置,照着填就行

打开SW2URDF后,界面会引导你完成URDF的生成。这里把关键步骤和每个字段的填写思路过一遍。

第一步是设置包名和保存路径。包名会成为URDF里package://路径的根目录,建议叫ur3_description,符合ROS社区的习惯。

第二步是在“Link”区域逐个添加link。每添加一个link,要选择一个SolidWorks零件,并指定该link使用的参考坐标系。这里的选择特别关键:参考坐标系应该选2.2节建立的关节坐标系,而不是零件默认坐标系。选好之后,插件会把该零件的网格几何输出为STL,保存到meshes目录里。

第三步是添加joint。每个joint需要指定:

  • 类型:UR3六个关节都是revolute,也就是旋转关节。
  • 父link和子link:比如shoulder_pan_joint的父link是base_link,子link是shoulder_link。
  • 参考坐标系:选该关节旋转轴线对应的那个坐标系。
  • 关节轴方向:插件会根据参考坐标系的Z轴自动给出向量值。正常情况是(0,0,1),如果Z轴方向反了,就改成(0,0,-1)或者干脆回到SolidWorks里翻转坐标系。
  • limit:填入关节旋转的上下限。这些值可以从SolidWorks装配体里的角度配合限位查到,也可以参考机器人的官方规格书。
  • effort和velocity:表示最大力矩和最大速度。Gazebo仿真时如果要加控制器,这两个值必须填真实值。

第四步是查看插件自动计算的质量属性。如果发现质量数值明显不对,比如某段手臂只有0.0001公斤,就回到SolidWorks检查材料密度,重新计算后再导出。

最后点击“Export URDF and Meshes”,插件会生成一个文件夹,里面包含urdf文件、meshes目录和配置文件。导出完成后,建议先别急着关SolidWorks,打开urdf文件夹检查一下STL文件是否齐全,缺漏说明导出过程有零件没选上,回去补选。

3.3 把生成的URDF接入ROS包并加载到rviz验证

导出生成的文件夹已经具备ROS包的基本结构,但还不够完整。一个标准的ROS包至少要有package.xml,还需要放到工作空间的src目录下,并用catkin_make或colcon编译一次。

典型目录结构是这样:

ur3_description/ ├── package.xml ├── CMakeLists.txt ├── urdf/ │ ├── ur3.urdf │ └── ur3_gazebo.urdf ├── meshes/ │ ├── visual/ │ └── collision/ ├── config/ └── launch/

在urdf目录下用终端跑检查命令:

check_urdf ur3.urdf

这段命令会在终端输出link和joint的树状结构,看到base_link下面依次挂着shoulder、upper_arm、forearm等节点,说明结构基本正确。

再跑一下依赖图工具:

urdf_to_graphiz ur3.urdf

这个命令会生成一个pdf文件,展示所有link和joint的父子关系。只要输出的树形图与预期结构一致,运动学链条就通了一半。

接下来写一个launch文件把模型加载到rviz。我用的是这样的模板:

<launch> <param name="robot_description" textfile="$(find ur3_description)/urdf/ur3.urdf" /> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /> <node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" /> <node name="rviz" pkg="rviz" type="rviz" /> </launch>

启动后,在rviz左侧面板把Fixed Frame设置成base_link,再添加RobotModel显示插件。此时应该能看到一个完整的UR3模型。拖动joint_state_publisher_gui窗口里的滑杆,每个关节都能独立旋转,并且模型不会出现断裂、错位、平移。

如果某个关节拖动后整个手臂飞出去,先检查该关节的origin是否偏离正确位置。飞出去的本质是关节原点定义在了距离真实旋转轴很远的地方,导致子link在错误的位置旋转。回到SolidWorks重新调整参考坐标系,这个问题就会消失。

4. 导出后最常见的坑与排查方法

4.1 报错速查表:一个现象一条对策

我整理了一份常见问题速查表,都是实际中高频出现的状况。表格里只给现象和对策,具体排查思路放在后面段落详细展开。

现象可能原因解决方案
rviz里模型缺失或不显示mesh路径错误确认URDF里的mesh filename使用package://ur3_description/meshes/...格式
模型整体飞离原点base_link坐标系不在世界原点让base_link的visual原点落在机器人安装底面中心
某个关节旋转方向反了axis向量正负填错把axis的x/y/z值取反,例如(0,0,1)改成(0,0,-1)
关节旋转中心错位参考坐标系没有建在旋转轴线上回到SolidWorks检查坐标系原点和轴线方向
Gazebo里模型垮塌、抖动inertial参数不合理或未设置给所有link设置正确质量、质心位置和惯性张量
打开URDF后没有颜色纹理STL不携带材质信息使用DAE格式网格,或在URDF里添加material标签
导出文件巨大、rviz卡顿STL面数太多简化SolidWorks模型,抑制装饰特征

4.2 调试流程和个人踩坑记录

排查URDF问题,我有一套固定的调试顺序,可以帮你快速定位问题所在。

第一步是在rviz里打开RobotModel面板,把所有link的显示都取消勾选,然后从base_link开始逐个勾选。每勾选一个link,观察它是否出现在预期位置。哪个link的位置不对,就是哪个joint的origin或坐标系出了问题。这种逐link排查的方式比直接看整机崩溃要高效得多。

第二步是用tf工具验证坐标变换。在终端跑:

rosrun tf tf_echo base_link upper_arm_link

可以直接输出两个link之间的平移和旋转。如果输出的值与你在SolidWorks里测量的距离不一致,说明joint origin的xyz或rpy填写有误。这个办法很多时候能直接定位到错误的关节。

我在之前做一个模拟项目X的时候,遇到过非常典型的问题:UR3模型在rviz里一切正常,但进了Gazebo之后大臂启动没有多久就疯狂抖动。排查后发现导出时插件自动计算的惯性张量出现了数量级问题,因为大臂零件当时没有赋材料密度,SolidWorks默认按1.0填充,导出的质量几乎可以忽略不计。这个教训让我学乖了:每次导出前先给所有结构件指定铝合金材料,再把质量属性截图记录下来,至少心里有数。

还有一次是导出后STL网格呈现半透明状态,外观非常别扭。原因是STL格式本身不携带材质和颜色信息,URDF里又没有定义material。解决方法是把网格文件保留STL用于碰撞检测,单独为视觉部分导出DAE格式,并在URDF的visual标签里定义color或引用纹理文件。这个细节不解决不影响运动学,但严重影响调试心情。

另一个值得单独提的坑是URDF文件编码。SolidWorks插件生成的文件在某些系统里默认带BOM的UTF-8编码,ROS的XML解析器虽然大多可以容忍,但偶尔会遇到从底料出现的解析失败。如果check_urdf提示无法解析,用任意文本编辑器把文件另存为无BOM的UTF-8格式再试一次,往往立刻解决。这个坑非常隐蔽,尤其是在Windows下导出、Linux下编译的流程里。

调试到最后,别忘了检查launch文件里的文件名是不是和实际目录一致。很多人改了URDF文件名却忘记更新launch文件,导致只有resource not found。看起来是ROS配置问题,其实只是手滑。

还有一个小技巧:把URDF里的mesh路径统一改成package://格式前,先确认meshes目录确实包含所有STL文件。不要从SolidWorks导出后直接手动拖拽文件到其他位置,以免路径不对。插件生成的文件夹结构已经很规范,尽量直接作为包根目录使用。

最后分享一个我自己的体会。我前后转换过好几版UR3模型,最深的感觉是,转换工作里八成时间花在规划坐标系和检查模型结构上,真正的“点击导出”其实只要几分钟。很多同学一上来就装插件,急着看结果,结果反而被坐标系错误折磨到怀疑人生。磨刀不误砍柴工,把SolidWorks模型整理干净、关节坐标系建到位、材料属性赋完整,导出过程基本一次通过,后续接入MoveIt、Gazebo也会顺畅很多。之后你还可以把末端夹爪、摄像头模型一起加进URDF,配合MoveIt做运动规划或者Gazebo做动力学实验,整个项目就能真正跑起来。希望这篇能帮你少踩几个坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询