AI 3D建模工具: Tripo 3D | Meshy AI

在现代机器人技术中,"先仿真"是一条黄金法则。在切割一块金属或购买一个电机之前,机器人的生命始于数字孪生。这个虚拟原型允许在安全、经济高效的环境中进行快速迭代、算法测试和调试。机器人操作系统(ROS)2 与 Gazebo 等仿真器相结合,为此提供了强大的生态系统,但一个关键问题常常让工程师在开始之前就停下了脚步:如何将你独特的、自定义设计的机器人导入仿真环境?

从 3D 计算机辅助设计(CAD)模型到可移动、可交互的仿真模型的旅程看似令人生畏。本文是一个两部分系列文章的第一篇,将揭开这个过程的面纱。我们将介绍一个专业工作流程:将自定义机器人装配体从基于云的 CAD 平台 Onshape 转换为 ROS 标准的 统一机器人描述格式(URDF),并在 RViz 2 中进行可视化。你可以在指南中链接的完整项目文件中跟随操作。

1、蓝图:在Onshape中为仿真进行设计

每个伟大的机器人都有一个坚实的设计基础。在本教程中,我们将使用 Onshape,这是一个强大的基于浏览器的 CAD 工具。设计时要记住,这个模型不仅仅是为了美观;它是物理仿真的基础。在本教程中,我们创建了一个基本的移动机器人,配备了 LiDAR、相机、IMU 和轮式编码器等传感器。

以仿真为目标,设计过程涉及的不仅仅是几何形状。以下是构建仿真就绪模型时需要关注的重点:

  1. 创建你的装配体: 设计机器人的各个独立组件(连杆)并使用适当的约束(关节)将它们组装起来。
  2. 定义物理属性: 这是许多新手容易忽略的步骤。为了获得逼真的仿真效果,你必须为每个连杆分配准确的材料属性。然后 Onshape 可以自动计算关键的惯性属性,如质量质心转动惯量
  3. 采用命名规范: 要将你的 CAD 装配体转换为 ROS 能理解的运动学树,我们必须对关节遵循特定的命名方案。
关键命名规范: 你必须将每个代表自由度(例如旋转关节或平移关节)的配合重命名为 dof_<joint_name> 格式。例如,肩部关节的配合应命名为 dof_shoulder_joint。这是让 onshape-to-robot 转换器正确解析你的机器人结构的关键。

2、桥梁:将CAD转换为URDF

有了准备充分的 Onshape 模型,我们现在可以将其转换为 URDF 文件。URDF 是一个 XML 文件,描述了机器人的物理结构。我们将使用优秀的 onshape-to-robot 命令行工具来完成这项工作。

2.1 安装转换器

首先,从 PyPI 安装该包:

pip install onshape-to-robot

2.2 设置Onshape API访问

接下来,从你的 Onshape 账户的 Developer API Keys 部分提供 API 凭证。最常见的方法是将这些凭证添加到你的 .bashrc 文件中。

# 将这些行添加到 ~/.bashrc 文件中,替换占位符
export ONSHAPE_API="https://cad.onshape.com"
export ONSHAPE_ACCESS_KEY="Your_Access_Key_Here"
export ONSHAPE_SECRET_KEY="Your_Secret_Key_Here"

# 应用更改
source ~/.bashrc

2.3 配置和运行导出

现在你已准备好导出。创建一个新目录,在其中创建一个名为 config.json 的文件。这个文件告诉工具要导出什么。一个最小配置如下:

{
    "url": "https://cad.onshape.com/documents/YOUR_DOCUMENT_ID/w/YOUR_WORKSPACE_ID/e/YOUR_ELEMENT_ID",
    "output_format": "urdf"
}

配置文件就位后,从终端运行导出器:

onshape-to-robot <directory_name>

这个命令将生成一个 urdf 目录,包含你机器人的 URDF 文件及其关联的视觉网格文件(.stl 格式)。你可以在这里查看生成的 URDF,了解工具是如何将装配体转换为 XML 的。

3、工作空间:创建ROS 2描述包

在 ROS 中,所有资源都被组织成。现在我们将创建一个专门的描述包来存放我们机器人的文件。首先,创建工作空间和包:

# 创建并进入一个新的 ROS 2 工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

# 创建描述包
ros2 pkg create --build-type ament_python mobile_bot_description

mobile_bot_description 中,创建我们的标准文件夹结构:

cd mobile_bot_description
mkdir launch urdf meshes

现在,将你用 onshape-to-robot 生成的文件移动到对应的新目录中(.urdf 文件放入 urdf/,所有 .stl 文件放入 meshes/)。

4、可视化:启动和理解ROS 2节点

现在机器人的描述包结构已经正确,最后一步是让它在虚拟环境中"活"起来。我们将使用 RViz 2——ROS 2 中主要的 3D 可视化工具。为此,我们不会逐个启动节点;相反,我们将创建一个启动文件来编排整个可视化系统的启动。

4.1 可视化的核心组件

我们的启动文件将启动三个协同工作的关键节点。理解它们各自的角色对于后续调试和扩展你的仿真至关重要。

  1. Robot State Publisher(机器人状态发布器): 这是机器人在 ROS 中的核心存在。它执行两个关键功能:
  • 首先,它读取我们的 URDF 文件并将其全部内容发布到 /robot_description 话题。任何其他需要了解机器人形状、质量或运动学结构的 ROS 节点都将订阅这个话题。它是机器人模型的中心信息源。
  • 其次,它订阅 /joint_states 话题以获取当前关节位置。利用这些信息和 URDF 中的运动学数据,它通过 tf2 变换系统计算并持续广播机器人每个连杆的 3D 位置和方向。
  1. Joint State Publisher GUI(关节状态发布器GUI): 如果不知道关节的位置(或状态),机器人模型就是静态的。这个节点提供了一个简单的图形窗口,包含机器人每个可动关节的滑块。当你移动滑块时,该节点将所有关节的当前位置作为消息发布到特定话题,默认为 /joint_states
  2. RViz 2: 可视化工具本身。RViz 同时订阅 /robot_description 话题(了解机器人的外观)和 tf2 变换(了解在哪里绘制每个连杆)。当 Joint State Publisher GUI 发送新的关节角度时,Robot State Publisher 更新 tf2 数据,RViz 几乎立即在新的铰接姿态下重新绘制机器人。

这种相互连接的流程——从 GUI 到关节状态到变换——正是让我们看到机器人运动的原因。

4.2 创建启动文件

现在,让我们创建将所有这些组件组合在一起的文件。在你的包的 launch 目录中,创建一个名为 rviz.launch.py 的文件。你可以在这里查看完整的启动文件。

启动文件包含以下定义和启动这三个节点的代码:

    # Node for Robot State Publisher
    robot_state_publisher_node = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        output='screen',
        parameters=[robot_description]
    )

    # Node for Joint State Publisher GUI
    joint_state_publisher_gui_node = Node(
        package='joint_state_publisher_gui',
        executable='joint_state_publisher_gui',
        name='joint_state_publisher_gui'
    )

    # Node for RViz2
    rviz_node = Node(
        package='rviz2',
        executable='rviz2',
        name='rviz2',
        output='screen'
    )

4.3 构建和启动

最后,我们需要构建新包并运行启动文件。导航到工作空间的根目录(~/ros2_ws),在终端中执行以下命令:

# 导航到工作空间根目录
cd ~/ros2_ws

# 仅构建我们的新包以节省时间
colcon build --packages-select mobile_bot_description

# 加载环境以使新包可用
source install/setup.bash

# 运行启动文件!
ros2 launch mobile_bot_description rviz.launch.py

如果一切配置正确,将出现两个窗口。在 RViz 窗口中,你可能需要进行一次性设置:点击左下角的"Add",选择"RobotModel",并确保 Global Options 中的"Fixed Frame"设置为你的机器人基座连杆(例如 base_link)。现在你应该能看到你的机器人了。使用 Joint State Publisher GUI 中的滑块,看着你的自定义 CAD 模型在屏幕上移动!

你已经让你的 CAD 模型"活"了起来……是吗?虽然模型能够铰接运动,但它的运动完全是人工的。我们是通过 GUI 滑块手动控制每个关节——就像一个数字提线木偶操纵者。这个模型没有重力、惯性或碰撞的概念。它不会倒下,它的部件可以像幽灵一样互相穿过。

这是关键的第一步,但它是一个运动学可视化,而不是动态仿真。要弥合这个差距,我们需要一个物理引擎。在本系列的下一部分中,我们将把机器人导入 Gazebo 仿真器,添加控制器,与物理世界交互,并朝着逼真的虚拟测试迈出关键的一步。


原文链接: From CAD to Kinematics: A Guide to Custom Robot Simulation in Gazebo with ROS2

BimAnt翻译整理,转载请标明出处