ROS2学习(17)------ROS 2 Gazebo 三维物理仿真平台简介及举例使用

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11
  • ROS版本:2

ROS 2 Gazebo 三维物理仿真平台简介

Gazebo 是一个强大的三维机器人仿真环境,它能够模拟复杂的机器人系统和环境。结合 ROS 2,你可以使用 Gazebo 进行高级的机器人仿真,包括但不限于:

  • 物理仿真:重力、碰撞检测等。
  • 传感器仿真:激光雷达(LiDAR)、摄像头、IMU 等。
  • 动力学仿真:轮式移动、机械臂运动等。

在 ROS 2 中,通常通过 ros_gz_sim 包来集成 Gazebo 和 ROS 2 的功能。这使得你可以在 ROS 2 节点中发布和订阅话题,同时在 Gazebo 中进行实时的物理仿真。

示例:创建并运行一个简单的机器人模型

目标

我们将创建一个简单的机器人模型,包含一个圆柱体作为基座,并在其顶部添加一个小球。此外,我们还会为该模型添加一些基本的物理属性,如质量、惯性矩阵等,以便于在 Gazebo 中进行物理仿真。

步骤

  • 安装必要的软件包

    首先确保你的系统已经安装了 Gazebo 和相关的 ROS 2 包。对于 Ubuntu 22.04 和 ROS 2 Humble 版本,可以执行以下命令来安装:

sudo apt update && sudo apt install ros-humble-gazebo-ros-pkgs ros-humble-ros-gz-sim
  • 创建工作空间和包

创建一个新的 ROS 2 工作空间,并在一个新的包中存放我们的模型文件和启动脚本。

ros2 pkg create my_robot_description --build-type ament_python --dependencies launch_ros rclpy
mkdir -p ~/ros2_ws/src/my_robot_description/urdf
cd ~/ros2_ws/src/my_robot_description/
  • 编写 URDF 文件

在 ~/ros2_ws/src/my_robot_description/urdf/ 目录下创建一个名为 my_robot.urdf.xacro 的文件,并添加如下内容:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="simple_robot">
    <!-- Base Link -->
    <link name="base_link">
        <visual>
            <geometry>
                <cylinder radius="0.2" length="0.6"/>
            </geometry>
            <material name="blue">
                <color rgba="0 0 1 1"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="0.2" length="0.6"/>
            </geometry>
        </collision>
        <inertial>
            <mass value="1"/>
            <inertia ixx="0.01" ixy="0" ixz="0"
                     iyy="0.01" iyz="0"
                     izz="0.01"/>
        </inertial>
    </link>

    <!-- Top Link -->
    <link name="top_link">
        <visual>
            <geometry>
                <sphere radius="0.1"/>
            </geometry>
            <material name="red">
                <color rgba="1 0 0 1"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <sphere radius="0.1"/>
            </geometry>
        </collision>
        <inertial>
            <mass value="0.1"/>
            <inertia ixx="0.001" ixy="0" ixz="0"
                     iyy="0.001" iyz="0"
                     izz="0.001"/>
        </inertial>
    </link>

    <!-- Joints -->
    <joint name="fixed_joint" type="fixed">
        <parent link="base_link"/>
        <child link="top_link"/>
        <origin xyz="0 0 0.3" rpy="0 0 0"/>
    </joint>

    <!-- Gazebo Plugins -->
    <gazebo reference="base_link">
        <material>Gazebo/Blue</material>
    </gazebo>
    <gazebo reference="top_link">
        <material>Gazebo/Red</material>
    </gazebo>
</robot>
  • 创建 Launch 文件

在 ~/ros2_ws/src/my_robot_description/launch/ 目录下创建一个名为 display_gazebo.launch.py 的文件,并添加如下内容:

import os
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory

def generate_launch_description():
    # Path to the world file
    world_file = os.path.join(get_package_share_directory('my_robot_description'), 'worlds', 'empty.world')

    # Launch Gazebo with the empty world
    gazebo = IncludeLaunchDescription(
        PythonLaunchDescriptionSource([os.path.join(
            get_package_share_directory('ros_gz_sim'),
            'launch',
            'gz_sim.launch.py'
        )]),
        launch_arguments={'gz_args': '-r ' + world_file}.items()
    )

    # Load the URDF into the /robot_description topic
    urdf_path = os.path.join(get_package_share_directory('my_robot_description'), 'urdf', 'my_robot.urdf.xacro')
    robot_state_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        parameters=[{'robot_description': open(urdf_path).read()}]
    )

    # Spawn the robot in Gazebo
    spawn_entity = Node(
        package='ros_gz_sim',
        executable='create',
        arguments=['-topic', 'robot_description', '-name', 'my_robot'],
        output='screen'
    )

    return LaunchDescription([
        gazebo,
        robot_state_publisher,
        spawn_entity
    ])
  • 创建世界文件

在 ~/ros2_ws/src/my_robot_description/worlds/ 目录下创建一个名为 empty.world 的文件,并添加如下内容:

  • 构建工作空间

回到工作空间根目录并构建:

cd ~/ros2_ws
colcon build --packages-select my_robot_description
source install/setup.bash
  • 运行仿真

使用以下命令启动仿真:

bash
深色版本

ros2 launch my_robot_description display_gazebo.launch.py

你应该可以看到 Gazebo 启动,并且加载了一个空的世界,接着会看到你的简单机器人模型被放置在这个虚拟环境中。

在这里插入图片描述

### ROS可视化工具及其实现方式 #### 常见的ROS可视化工具 RViz 是 ROS 中最常用的三维可视化工具之一,能够帮助开发者直观地展示机器人的状态、传感器数据以及环境信息[^1]。它支持多种数据类型的显示,例如点云、激光扫描、路径规划结果等。 除了 RViz 外,`rqt` 工具箱也提供了丰富的插件来满足不同的需求。例如 `rqt_plot` 能够实时绘制来自 ROS topic 的数值变化趋势[^3]。对于日志管理,`rqt_console` 提供了一个图形化的界面用来查看由节点发布的消息,并允许用户设置过滤条件以便快速定位特定的日志内容[^4]。 当涉及到仿真时,Gazebo 成为了首选方案。作为一款强大的物理引擎驱动下的模拟平台,不仅限于视觉上的呈现效果,在其中还可以调整诸如重力加速度这样的参数影响整个场景的行为模式[^5]。其右侧控制面板让用户轻松完成对物体属性编辑或是相机视角切换等功能操作。 #### 实现方式举例说明 下面给出一段简单的 Python 代码片段演示如何利用 rospy 发布话题让 rqt_plot 显示图表: ```python import rospy from std_msgs.msg import Float64 def publisher(): pub = rospy.Publisher('chatter', Float64, queue_size=10) rospy.init_node('talker', anonymous=True) rate = rospy.Rate(1) # Hz count = 0.0 while not rospy.is_shutdown(): msg = Float64() msg.data = count pub.publish(msg) count += 1.0 rate.sleep() if __name__ == '__main__': try: publisher() except rospy.ROSInterruptException: pass ``` 上述脚本启动后会在名为 `/chatter` 的主题上连续发送浮点数序列给订阅者端接收处理,之后只需运行命令行指令 `$ rosrun rqt_plot rqt_plot /chatter` 即可观察到动态更新折线图样貌。 另外针对复杂项目可能还需要借助 Multiplot 插件同步对比多组实验所得曲线差异情况;或者运用 DataStreaming 功能在线捕获远程设备传回信号强度波动状况等等。 #### 总结 综上所述,无论是基础教学还是工业级研发阶段,围绕着这些高效便捷又灵活易扩展特性的可视化手段总能找到适合当前任务的最佳实践途径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值