| name | ros2-integration |
| description | Gazebo ROS2 集成技能 - ros_gz 桥接、控制器启动、launch 文件配置 |
| argument-hint | gazebo ros2集成 OR ros_gz桥接 OR 控制器配置 |
| user-invocable | true |
Gazebo ROS2 Integration Skill
用于 Gazebo Harmonic 与 ROS2 的集成
何时使用
当需要以下帮助时使用此技能:
- 安装和配置 ros_gz
- 创建机器人 launch 文件
- 配置话题桥接
- 设置控制器
快速参考
安装 ros_gz
sudo apt install ros-humble-ros-gz-bridge ros-humble-ros-gz-sim ros-humble-ros-gz-image
sudo apt install ros-iron-ros-gz-bridge ros-iron-ros-gz-sim ros-iron-ros-gz-image
话题桥接
基本桥接配置
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='ros_gz_bridge',
executable='parameter_bridge',
arguments=[
'/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist'
],
output='screen'
),
Node(
package='ros_gz_bridge',
executable='parameter_bridge',
arguments=[
'/scan@sensor_msgs/msg/LaserScan@gz.msgs.LaserScan'
],
output='screen'
),
Node(
package='ros_gz_image',
executable='image_bridge',
arguments=['/camera/image_raw@sensor_msgs/msg/Image@gz.msgs.Image'],
output='screen'
),
])
多传感器桥接
from launch import LaunchDescription
from launch_ros.actions import Node
import os
from ament_index_python.packages import get_package_share_directory
def generate_launch_description():
pkg_name = 'robot_bringup'
pkg_dir = get_package_share_directory(pkg_name)
robot_desc_path = os.path.join(pkg_dir, 'urdf', 'robot.urdf')
with open(robot_desc_path, 'r') as f:
robot_description = f.read()
return LaunchDescription([
Node(
package='ros_gz_bridge',
executable='parameter_bridge',
arguments=[
'/odom@nav_msgs/msg/Odometry@gz.msgs.Odometry'
],
output='screen'
),
Node(
package='ros_gz_bridge',
executable='parameter_bridge',
arguments=[
'/imu@sensor_msgs/msg/Imu@gz.msgs.IMU'
],
output='screen'
),
Node(
package='ros_gz_bridge',
executable='parameter_bridge',
arguments=[
'/points@sensor_msgs/msg/PointCloud2@gz.msgs.PointCloudPacked'
],
output='screen'
),
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
parameters=[{: robot_description}],
output=
),
])
Launch 文件
完整机器人启动
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, ExecuteProcess
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration
import os
from ament_index_python.packages import get_package_share_directory
def generate_launch_description():
pkg_name = 'robot_bringup'
pkg_dir = get_package_share_directory(pkg_name)
use_sim_time = LaunchConfiguration('use_sim_time', default='true')
world_path = os.path.join(pkg_dir, 'worlds', 'robot.world')
robot_desc_path = os.path.join(pkg_dir, 'urdf', 'robot.urdf')
return LaunchDescription([
DeclareLaunchArgument(
'use_sim_time',
default_value='true',
description='Use sim time'
),
ExecuteProcess(
cmd=['gz', 'sim', '-v4', world_path],
output='screen'
),
Node(
package='ros_gz_sim',
executable='create',
arguments=[
'-name', 'robot',
'-file', robot_desc_path,
'-x', '0',
'-y', ,
,
],
output=
),
Node(
package=,
executable=,
name=,
parameters=[{
: (robot_desc_path).read(),
: use_sim_time
}],
output=
),
Node(
package=,
executable=,
arguments=[],
output=
),
Node(
package=,
executable=,
arguments=[],
output=
),
Node(
package=,
executable=,
arguments=[
,
,
,
],
output=
),
Node(
package=,
executable=,
arguments=[],
output=
),
])
控制器配置
差速驱动控制器
controller_manager:
ros__parameters:
update_rate: 50
diff_drive_controller:
type: diff_drive_controller/DiffDriveController
diff_drive_controller:
ros__parameters:
left_wheel_names: ['left_wheel_joint']
right_wheel_names: ['right_wheel_joint']
wheel_separation: 0.4
wheel_radius: 0.1
max_wheel_odom_velocity: 10.0
max_wheel_acceleration: 10.0
publish_rate: 50.0
command_timeout: 0.1
base_frame_id: base_link
odom_frame_id: odom
enable_odom_tf: true
enable_odom_computation: true
velocity_aggregation: "mean"
vel_timeout: 0.5
publish_cmd: true
publish_odom: true
publish_wheel_states: true
Joint 控制器
controller_manager:
ros__parameters:
update_rate: 100
joint_trajectory_controller:
type: joint_trajectory_controller/JointTrajectoryController
joint_trajectory_controller:
ros__parameters:
joints:
- arm_joint_1
- arm_joint_2
- arm_joint_3
- arm_joint_4
- arm_joint_5
- arm_joint_6
command_interfaces:
- position
state_interfaces:
- position
- velocity
gains:
arm_joint_1: {p: 100.0, d: 10.0, i: 0.0, i_clamp: 1.0}
arm_joint_2: {p: 100.0, d: 10.0, i: 0.0, i_clamp: 1.0}
arm_joint_3: {p: 100.0, d: , , }
{ , , , }
{ , , , }
{ , , , }
参数配置
使用 xacro 生成 URDF
<?xml version="1.0" ?>
<robot name="robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:property name="robot_name" value="my_robot" />
<xacro:property name="mesh_dir" value="package://robot_description/meshes" />
<xacro:include filename="$(find robot_description)/urdf/robot.gazebo" />
<link name="base_link">
...
</link>
<joint name="wheel_joint" type="revolute">
...
</joint>
</robot>
xacro robot.urdf.xacro > robot.urdf
常用命令
启动 Gazebo
gz sim -v4
gz sim -v4 /path/to/world.sdf
gz sim -g
gz sim -s
调试
ros2 topic list
ros2 topic echo /scan
ros2 run ros_gz_sim create -name my_robot -file /path/to/robot.sdf
常见问题
问题 1: 桥接不工作
解决方案:确认 ROS2 和 Gazebo 的话题名称匹配,检查日志输出
问题 2: 控制器无法启动
解决方案:确认 joint 名称与 URDF 中一致,检查 controller_manager 配置
问题 3: 模型加载失败
解决方案:检查模型路径是否正确,确认 SDF/URDF 语法正确
相关资源
另见