目录

1 安装

1.1 直接启动gz sim

1.1.1 直接启动仿真环境

1.2 ros2 命令行启动 ros_gz_sim

1.3 Ros2 通过launch文件启动

2 urdf添加gz_plugin

1.1 修改urdf

1.1.1 运动控制相关

1.1.2 传感器相关

1.2 launch创建消息通道ros_gz_bridge

3 仿真运行

3.1 键盘控制

4 其它调试常用指令

4.1 ros2相关指令

4.1.1 查看话题列表

4.1.2 查看话题发布频率

4.1.3 打印一帧话题数据

4.1.4 查看tf树

4.2 gz 相关命令

 4.2.1 查看话题列表

4.2.2 打印一帧数据


官方网站:Use ROS 2 to interact with Gazebo — Gazebo jetty documentation的

demo:

1 安装

我使用的是jazzy版本的ros2,安装的gazebo版本和humble不同。使用的指令时gz而不是ign了,注意版本之间的差异

sudo apt install ros-jazzy-ros-gz

1.1 直接启动gz sim

重新启动一个终端:主要是为了重新加载环境。

执行命令gz sim启动虚拟环境。老版本的是ign gazebo

gz sim

1.1.1 直接启动仿真环境

可以在启动时打开环境,同时支持-r直接运行仿真环境。

gz sim -r empty.sdf

1.2 ros2 命令行启动 ros_gz_sim

使用launch文件的方式进行启动

ros2 launch ros_gz_sim gz_sim.launch.py

查看支持的参数arg

 ros2 launch ros_gz_sim gz_sim.launch.py --show-args
bzm@bzm-TUF-Gaming-FX505DT-FX95DT:~/Desktop/workspace$ ros2 launch ros_gz_sim gz_sim.launch.py --show-args
Arguments (pass arguments as '<name>:=<value>'):

    'gz_args':
        Arguments to be passed to Gazebo Sim
        (default: '')

    'gz_version':
        Gazebo Sim's major version
        (default: '8')

gz_args 可以将参数透传给gz sim

ros2 launch ros_gz_sim gz_sim.launch.py ign_args:="empty.sdf -r"

1.3 Ros2 通过launch文件启动

在自己的launch文件中引入gz的launch文件

    pkg_name = "pkg_robot"
    pkg_dir = get_package_share_directory(pkg_name) 

    sdf = pkg_dir + "/worlds/demo.sdf" 

    # ros2 launch ros_gz_sim gz_sim.launch.py
    gz = IncludeLaunchDescription(
        PythonLaunchDescriptionSource(
            os.path.join(get_package_share_directory('ros_gz_sim'),
            'launch', 'gz_sim.launch.py')
        ),
        launch_arguments={
            'gz_args':['-r ',sdf]
        }.items()
    )

修改setup文件

2 urdf添加gz_plugin

给urdf添加gz_plugin用于给urdf添加仿真属性。

官方网址:Gazebo : Tutorial : Gazebo plugins in ROS

1.1 修改urdf

可以在安装的worlds目录下找到sdf文件,然后在里面搜索插件即可。通常让ai帮写即可。

1.1.1 运动控制相关

需要两个插件,一个是jonit状态发布,一个是差速小车控制

注意:

1 关节发布插件(joint_state_publisher)中声明topic,这样就可以避免在launch文件中进行话题重映射。

<topic>joint_states</topic>

2 同样的,在差速控制插件中也声明里程计和运控的话题等

<topic>cmd_vel</topic> <!-- 订阅的速度控制话题 -->

<odom_topic>odom</odom_topic> <!-- 发布的里程计话题 -->

<frame_id>odom</frame_id> <!-- 里程计的全局参考系 -->

<child_frame_id>base_footprint</child_frame_id> <!-- 机器人的底盘参考系 -->

<!-- 运动控制相关 -->
  <gazebo>
    <plugin 
    filename="gz-sim-joint-state-publisher-system" 
    name="gz::sim::systems::JointStatePublisher">

    <!-- 声明jointstate发布的话题 -->
    <topic>joint_states</topic>
    </plugin>
  </gazebo>
  <gazebo>
    <plugin
    filename="gz-sim-diff-drive-system"
    name="gz::sim::systems::DiffDrive">
    <left_joint>left_wheel_joint</left_joint>
    <right_joint>right_wheel_joint</right_joint>
    <wheel_separation>0.6</wheel_separation>
    <wheel_radius>0.1</wheel_radius>
    <odom_publish_frequency>1</odom_publish_frequency>
    <max_linear_acceleration>1</max_linear_acceleration>
    <min_linear_acceleration>-1</min_linear_acceleration>
    <max_angular_acceleration>2</max_angular_acceleration>
    <min_angular_acceleration>-2</min_angular_acceleration>
    <max_linear_velocity>0.5</max_linear_velocity>
    <min_linear_velocity>-0.5</min_linear_velocity>
    <max_angular_velocity>1</max_angular_velocity>
    <min_angular_velocity>-1</min_angular_velocity>

    <!-- 话题与参考系配置 -->
    <topic>cmd_vel</topic>             <!-- 订阅的速度控制话题 -->
    <odom_topic>odom</odom_topic>      <!-- 发布的里程计话题 -->
    <frame_id>odom</frame_id>          <!-- tf使用的坐标系 -->
    <child_frame_id>base_footprint</child_frame_id> <!-- 机器人的底盘参考系 -->
  </plugin>
  </gazebo>

1.1.2 传感器相关

1 需要添加传感器系统插件用于全局调度。

2 添加对应的传感器插件

3 添加<gz_frame_id>标签用于指明坐标系,不添加的话会导致tf存在问题

 <gazebo reference = "camera"> :指明对哪个link添加插件


 <!-- 传感器相关 -->
  <gazebo>
    <plugin
      filename="gz-sim-sensors-system"
      name="gz::sim::systems::Sensors">
      <render_engine>ogre2</render_engine>
    </plugin>
  </gazebo>

   <gazebo reference = "camera">
    <sensor name="camera" type="camera">
          <camera>
            <horizontal_fov>1.047</horizontal_fov>
            <image>
              <width>320</width>
              <height>240</height>
            </image>
            <clip>
              <near>0.1</near>
              <far>100</far>
            </clip>
          </camera>
          <always_on>1</always_on>
          <update_rate>30</update_rate>
          <visualize>true</visualize>
          <topic>camera</topic>
          <gz_frame_id>camera</gz_frame_id>
        </sensor>

    </gazebo>

  <gazebo reference = "lidar">
    <sensor name='gpu_lidar' type='gpu_lidar'>
      <topic>lidar</topic>
      <update_rate>1</update_rate>
      <lidar>
        <scan>
          <horizontal>
            <samples>640</samples>
            <resolution>1</resolution>
            <min_angle>-1.396263</min_angle>
            <max_angle>1.396263</max_angle>
          </horizontal>
          <vertical>
            <samples>16</samples>
            <resolution>1</resolution>
            <min_angle>-0.261799</min_angle>
            <max_angle>0.261799</max_angle>
          </vertical>
        </scan>
        <range>
          <min>0.08</min>
          <max>10.0</max>
          <resolution>0.01</resolution>
        </range>
      </lidar>
      <always_on>true</always_on>
      <visualize>true</visualize>
      <gz_frame_id>lidar</gz_frame_id>
    </sensor>
  </gazebo>

1.2 launch创建消息通道ros_gz_bridge

多数话题照搬就行

 gz_bridge_node = Node(
        package='ros_gz_bridge',
        executable='parameter_bridge',
        name='ros_gz_bridge',
        output='screen',
        arguments=[
            # 1. 桥接控制指令:ROS2 -> Gazebo (使用 ] 符号表示单向)
            '/cmd_vel@geometry_msgs/msg/Twist]gz.msgs.Twist',
            
            # 2. 桥接里程计:Gazebo -> ROS2 (使用 [ 符号表示单向)
            # '/model/my_robot/odom@nav_msgs/msg/Odometry[gz.msgs.Odometry',
            '/odom@nav_msgs/msg/Odometry[gz.msgs.Odometry',
            
            # 3. 桥接 TF 坐标变换:Gazebo -> ROS2 
            # 注意:如果你的机器人叫 my_robot,Gazebo 内部的话题通常是 /model/my_robot/tf
            '/model/my_robot/tf@tf2_msgs/msg/TFMessage[gz.msgs.Pose_V',

            # '/model/my_robot/joint_state@sensor_msgs/msg/JointState[gz.msgs.Model',
            '/joint_states@sensor_msgs/msg/JointState[gz.msgs.Model',

            # 3. 激光雷达数据 (Gazebo -> ROS2)
            '/lidar@sensor_msgs/msg/LaserScan@gz.msgs.LaserScan',
            '/lidar/points@sensor_msgs/msg/PointCloud2@gz.msgs.PointCloudPacked',
            
            # 4. 相机数据 (Gazebo -> ROS2)
            '/camera@sensor_msgs/msg/Image@gz.msgs.Image',
            '/camera_info@sensor_msgs/msg/CameraInfo@gz.msgs.CameraInfo',


            '/clock@rosgraph_msgs/msg/Clock[gz.msgs.Clock',


        ],
        # 将 Gazebo 内部带命名空间的 TF 话题,重映射为 ROS2 标准的 /tf 话题
        remappings=[
            ('/model/my_robot/tf', '/tf'),
            # ('/model/my_robot/joint_state', '/joint_states'),
            # ('/model/my_robot/odom', '/odom'),
        ]

        #ros2 run teleop_twist_keyboard teleop_twist_keyboard
    )

3 仿真运行

运行后,rviz2 添加组件就可以看到对应话题的消息

3.1 键盘控制

这里将/turtle1/cmd_vel的话题重映射为cmd_vel

ros2 run turtlesim turtle_teleop_key --ros-args -r /turtle1/cmd_vel:=/cmd_vel

4 其它调试常用指令

4.1 ros2相关指令

4.1.1 查看话题列表

ros2 topic list

4.1.2 查看话题发布频率

 ros2 topic hz /odom

4.1.3 打印一帧话题数据

ros2 topic echo /lidar --once

4.1.4 查看tf树

ros2 run tf2_tools view_frames

4.2 gz 相关命令

 4.2.1 查看话题列表

gz topic --list

4.2.2 打印一帧数据

gz topic -e -t /lidar/points -n 1

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐