本文介绍了如何将SolidWorks生成的ROS1格式URDF模型转换为ROS2可用的格式。主要内容包括:

  1. 创建工作空间并放置SolidWorks生成的URDF文件夹
  2. 修改关键配置文件:
  • 将package.xml中的catkin依赖改为ament_cmake
  • 更新CMakeLists.txt内容
  • 检查URDF文件中的mesh路径
  1. 编写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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐