Solidworks 导出URDF文件在ROS2中的仿真
本文介绍了如何将SolidWorks生成的ROS1格式URDF模型转换为ROS2可用的格式。主要内容包括:
- 创建工作空间并放置SolidWorks生成的URDF文件夹
- 修改关键配置文件:
- 将package.xml中的catkin依赖改为ament_cmake
- 更新CMakeLists.txt内容
- 检查URDF文件中的mesh路径
- 编写ROS2启动文件:
- rsp.launch.py用于发布robot_description
- gazebo.launch.py用于启动Gazebo环境和生成机器人实体
此过程解决了ROS1到ROS2的格式转换问题,使SolidWorks设计的机器人模型能够在ROS2环境下使用。
第一步:建立工作空间并放置文件
1.创建工作空间:
打开终端(Ctrl+Alt+T),输入
mkdir -p ~/rob1_ws/src
cd ~/ros2_ws/src
2.放置URDF文件夹:
将 SolidWorks生成的整个文件夹(假设你的机器人名字叫 rob1复制到 ~/rob1_ws/src/ 下。
现在的目录结构有如下文件(注意后缀)
~/ros2_ws/src/rob1/ <-- SolidWorks生成的文件夹
├── package.xml
├── CMakeLists.txt
├── urdf/ <-- 里面有 .urdf 或 .xacro 文件
├── meshes/ <-- 里面有 .stl 文件
└── launch/ <-- (SW生成的launch文件通常无法在ROS2直接用)
第二步:修改配置文件 (关键步骤)
因为 SolidWorks 插件生成的是 ROS 1 格式,直接编译会报错,必须修改 package.xml 和 CMakeLists.txt。
1.修改 package.xml
修改构建工具:找到<buildtool_depend>catkin</buildtool_depend>,删除它,并改为:
<buildtool_depend>ament_cmake</buildtool_depend>
添加 ROS2依赖:在文件中间添加以下依赖(如果没有的话)
<depend>urdf</depend>
<depend>xacro</depend>
<depend>robot_state_publisher</depend>
替换后的代码如下(也可直接复制以下代码):
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>rob1</name>
<version>1.0.0</version>
<description>URDF Description package for rob1</description>
<maintainer email="TODO@email.com">TODO</maintainer>
<license>BSD</license>
<!-- 构建工具 -->
<buildtool_depend>ament_cmake</buildtool_depend>
<!-- 依赖项 (已更新为 ROS 2 的名称) -->
<exec_depend>joint_state_publisher_gui</exec_depend>
<exec_depend>robot_state_publisher</exec_depend>
<exec_depend>rviz2</exec_depend> <!-- ROS1是rviz, ROS2是rviz2 -->
<exec_depend>xacro</exec_depend>
<exec_depend>urdf</exec_depend>
<!-- 如果需要Gazebo -->
<exec_depend>gazebo_ros</exec_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
2.修改 CMakeLists.txt
删除里面的所有内容,直接复制下面的内容,完全覆盖 ~/ros2_ws/src/rob1/CMakeLists.txt。此版本修复了版本号错误,并添加了文件安装规则。
cmake_minimum_required(VERSION 3.8) # Ubuntu 22.04对应的 VERSION为VERSION 3.8
project(rob1)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
find_package(ament_cmake REQUIRED)
find_package(urdf REQUIRED)
find_package(xacro REQUIRED)
# 安装 launch, meshes, urdf 文件夹到 ROS 系统目录
install(
DIRECTORY launch meshes urdf
DESTINATION share/${PROJECT_NAME}
)
ament_package()
3.检查 URDF 文件中的路径
打开 urdf文件夹下的 .urdf 文件。搜索 filename 关键字。确保所有引用 .stl 文件的路径格式如下:
<mesh filename="package://my_robot/meshes/link_name.STL" />
第三步:编写 ROS 2 启动文件 (Launch File)
SolidWorks 生成的 display.launch 是 XML 格式(ROS 1),ROS 2 Humble 推荐使用Python格式。
创建 rsp.launch.py 文件。专门负责读取 URDF 模型并发布 robot_description(对应你参考案例中的第二个文件)。
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import Command, LaunchConfiguration
from launch_ros.actions import Node
# 1. 引入 ParameterValue
from launch_ros.parameter_descriptions import ParameterValue
def generate_launch_description():
pkg_name = 'rob1'
use_sim_time = LaunchConfiguration('use_sim_time', default='true')
default_model_path = os.path.join(get_package_share_directory(pkg_name), 'urdf', 'rob1.urdf')
robot_description_content = Command(['xacro ', default_model_path])
robot_description = ParameterValue(robot_description_content, value_type=str)
robot_state_publisher_node = Node(
package='robot_state_publisher',
executable='robot_state_publisher',
output='screen',
parameters=[{
'robot_description': robot_description, # 使用包裹后的变量
'use_sim_time': use_sim_time
}]
)
return LaunchDescription([
DeclareLaunchArgument(
'use_sim_time',
default_value='true',
description='Use sim time if true'),
robot_state_publisher_node,
])
创建 gazebo.launch.py ,负责启动 Gazebo 环境、调用上面的文件、并把机器人生成(Spawn)出来。复制粘贴以下代码:
import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription, RegisterEventHandler
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.event_handlers import OnProcessExit
from launch_ros.actions import Node
def generate_launch_description():
pkg_name = 'rob1' # 你的功能包名字
# 1. 包含我们刚才写的 rsp.launch.py
# 这会发布 /robot_description 话题,供 Gazebo 使用
rsp = IncludeLaunchDescription(
PythonLaunchDescriptionSource([os.path.join(
get_package_share_directory(pkg_name), 'launch', 'rsp.launch.py'
)]),
launch_arguments={'use_sim_time': 'true'}.items()
)
# 2. 启动 Gazebo (相当于 ROS1 的 empty_world.launch)
gazebo = IncludeLaunchDescription(
PythonLaunchDescriptionSource([os.path.join(
get_package_share_directory('gazebo_ros'), 'launch', 'gazebo.launch.py'
)]),
)
# 3. 生成实体 (Spawn Entity)
# 相当于 ROS1 的 <node pkg="gazebo_ros" type="spawn_model" ... />
spawn_entity = Node(
package='gazebo_ros',
executable='spawn_entity.py',
arguments=['-topic', 'robot_description', '-entity', 'rob1'],
output='screen'
)
# 4. 加载控制器 (Spawners)
# 如果你在 MoveIt Assistant 里配置了 ros2_control,你需要这里来启动控制器
# 这里只是示例,名字要和你 ros2_controllers.yaml 里的一致
# 关节状态广播器 (必须)
joint_state_broadcaster = Node(
package="controller_manager",
executable="spawner",
arguments=["joint_state_broadcaster"],
output="screen",
)
# 手臂控制器 (根据你之前的上下文,你应该叫 arm_controller)
arm_controller_spawner = Node(
package="controller_manager",
executable="spawner",
arguments=["arm_controller"], # 确保这个名字和你 yaml 文件里的一样
output="screen",
)
# 确保 spawn 完机器人后再加载控制器,否则会报错找不到硬件
return LaunchDescription([
rsp,
gazebo,
spawn_entity,
# 如果你还没配好 ros2_control,可以先注释掉下面这两行
# RegisterEventHandler(
# event_handler=OnProcessExit(
# target_action=spawn_entity,
# on_exit=[joint_state_broadcaster],
# )
# ),
# RegisterEventHandler(
# event_handler=OnProcessExit(
# target_action=joint_state_broadcaster,
# on_exit=[arm_controller_spawner],
# )
# ),
])
第四步:编译并运行
1.安装 Gazebo 相关依赖(防止缺少包):
ros2 launch ros_gz_sim gz_sim.launch.py
2.编译工作空间:
cd ~/rob1_ws
colcon build --packages-select rob1
source install/setup.bash
设置模型搜索路径 (将你的 install 目录加入 Gazebo 搜索路径)
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:~/rob1_ws/install/rob1/share #解决模型不显示问题
运行
ros2 launch rob1 gazebo.launch.py
注:配置好后,之后在次需要运行,则只需执行以下命令:
打开终端,输入:
cd ~/rob1_ws
colcon build --symlink-install
可以不运行colcon build --symlink-install。(colcon build:这是 ROS 2 的标准编译命令,会处理所有的 C++ 编译和 Python 包安装。symlink-install:这是一个非常有用的参数。它不会物理拷贝所有的配置文件(如 Python 脚本、URDF 模型文件、Launch 文件),而是创建软链接(符号链接)。
好处:如果你修改了Python代码或 Launch文件,不需要重新编译,修改会立即在运行中生效。如果之前编译过且没有修改 C++代码,就不必重新编译。)
source install/setup.bash # 刷新当前终端的环境变量。
ros2 launch rob1 gazebo.launch.py
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)