基于ROS2/Gazebo的室内送餐机器人系统开发实战教程

1. 系统架构设计

1.1 功能需求分析

用户下单 语音交互模块 订单处理 路径规划 运动控制 避障检测 目标送达 状态反馈

1.2 技术栈选型

组件 技术选型
机器人框架 ROS2 Humble
仿真环境 Gazebo 11
导航系统 Nav2(Navigation2)
建图算法 SLAM Toolbox
语音交互 SpeechRecognition + PyAudio
建模工具 URDF + SolidWorks插件

2. 开发环境搭建

2.1 系统依赖安装

bash 复制代码
# Ubuntu 22.04环境准备
sudo apt install -y \
  ros-humble-desktop \
  ros-humble-gazebo-* \
  ros-humble-navigation2 \
  ros-humble-nav2-bringup \
  python3-pyaudio

2.2 工作空间初始化

bash 复制代码
mkdir -p ~/delivery_robot_ws/src
cd ~/delivery_robot_ws/
rosdep install -i --from-path src --rosdistro humble -y
colcon build --symlink-install

3. 机器人URDF建模

3.1 基础结构定义(base.urdf.xacro)

xml 复制代码
<?xml version="1.0"?>
<robot name="delivery_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
  <!-- 底座链接 -->
  <link name="base_link">
    <visual>
      <geometry>
        <cylinder radius="0.25" length="0.15"/>
      </geometry>
      <material name="blue">
        <color rgba="0 0 1 1"/>
      </material>
    </visual>
  </link>
 
  <!-- 驱动轮宏 -->
  <xacro:macro name="wheel" params="prefix reflect">
    <link name="${prefix}_wheel_link">
      <visual>
        <geometry>
          <cylinder radius="0.05" length="0.03"/>
        </geometry>
      </visual>
    </link>
    
    <joint name="${prefix}_wheel_joint" type="continuous">
      <origin xyz="0 ${reflect*0.15} -0.05" rpy="1.5708 0 0"/>
      <parent link="base_link"/>
      <child link="${prefix}_wheel_link"/>
      <axis xyz="0 0 1"/>
    </joint>
  </xacro:macro>
 
  <!-- 实例化左右轮 -->
  <xacro:wheel prefix="left" reflect="1"/>
  <xacro:wheel prefix="right" reflect="-1"/>
</robot>

3.2 传感器集成

xml 复制代码
<!-- 激光雷达 -->
<link name="lidar_link">
  <visual>
    <geometry>
      <cylinder radius="0.05" length="0.1"/>
    </geometry>
  </visual>
</link>
 
<joint name="lidar_joint" type="fixed">
  <origin xyz="0 0 0.2" rpy="0 0 0"/>
  <parent link="base_link"/>
  <child link="lidar_link"/>
</joint>
 
<!-- 深度相机 -->
<gazebo reference="camera_link">
  <sensor type="depth" name="camera">
    <update_rate>30</update_rate>
    <camera>
      <horizontal_fov>1.047</horizontal_fov>
      <image>
        <width>640</width>
        <height>480</height>
      </image>
    </camera>
  </sensor>
</gazebo>

4. SLAM建图与定位

4.1 SLAM Toolbox配置

yaml 复制代码
# slam_params.yaml
slam_toolbox:
  ros__parameters:
    base_frame: "base_link"
    odom_frame: "odom"
    map_frame: "map"
    mode: "mapping"  # 或 "localization"
    
    # 激光雷达配置
    scan_topic: "/scan"
    
    # 地图参数
    map_resolution: 0.05
    map_size: 204.8

4.2 建图流程

bash 复制代码
# 启动Gazebo仿真
ros2 launch delivery_robot_gazebo simulation.launch.py
 
# 启动SLAM节点
ros2 launch delivery_robot_slam slam.launch.py
 
# 启动键盘控制
ros2 run teleop_twist_keyboard teleop_twist_keyboard
 
# 保存地图
ros2 run nav2_map_server map_saver_cli -f ~/maps/office_map

5.1 导航参数配置

yaml 复制代码
# nav2_params.yaml
nav2_costmap_2d:
  global_costmap:
    global_frame: "map"
    robot_base_frame: "base_link"
    resolution: 0.05
    
    plugins:
      - {name: static_layer,    type: "nav2_costmap_2d::StaticLayer"}
      - {name: obstacle_layer,  type: "nav2_costmap_2d::ObstacleLayer"}
      - {name: inflation_layer, type: "nav2_costmap_2d::InflationLayer"}
 
  local_costmap:
    global_frame: "odom"
    rolling_window: true

5.2 路径规划算法

python 复制代码
# 导航目标发布节点
import rclpy
from geometry_msgs.msg import PoseStamped
 
class NavGoalPublisher(rclpy.node.Node):
    def __init__(self):
        super().__init__('nav_goal_publisher')
        self.publisher_ = self.create_publisher(PoseStamped, '/goal_pose', 10)
        timer_period = 5.0  # 5秒发送一次新目标
        self.timer = self.create_timer(timer_period, self.timer_callback)
        self.count = 0
 
    def timer_callback(self):
        msg = PoseStamped()
        msg.header.stamp = self.get_clock().now().to_msg()
        msg.header.frame_id = 'map'
        # 示例目标点(需根据实际地图坐标调整)
        msg.pose.position.x = 2.0
        msg.pose.position.y = 1.0
        self.publisher_.publish(msg)
        self.get_logger().info(f'Publishing: {msg}')

6. 语音交互模块集成

6.1 语音识别实现

python 复制代码
# voice_control.py
import speech_recognition as sr
import rclpy
from std_msgs.msg import String
 
class VoiceController(rclpy.node.Node):
    def __init__(self):
        super().__init__('voice_controller')
        self.publisher_ = self.create_publisher(String, '/voice_command', 10)
        self.recognizer = sr.Recognizer()
        self.mic = sr.Microphone()
 
    def listen(self):
        with self.mic as source:
            self.recognizer.adjust_for_ambient_noise(source)
            audio = self.recognizer.listen(source)
            
        try:
            command = self.recognizer.recognize_google(audio).lower()
            self.publisher_.publish(String(data=command))
            return command
        except sr.UnknownValueError:
            return ""
        except sr.RequestError as e:
            self.get_logger().error(f'Recognition error: {e}')
            return ""

6.2 命令解析逻辑

python 复制代码
# 命令处理回调
def command_callback(self, msg):
    cmd = msg.data
    if '送餐' in cmd:
        # 解析目标位置
        target = self.parse_target(cmd)
        self.send_navigation_goal(target)
    elif '停止' in cmd:
        self.cancel_navigation()
 
def parse_target(self, cmd):
    # 简单位置解析(实际项目需NLP处理)
    locations = {
        '前台': (2.0, 1.0),
        '会议室': (5.0, -3.0),
        '休息区': (-1.0, 4.0)
    }
    for loc, coord in locations.items():
        if loc in cmd:
            return coord
    return None

7. 系统集成与测试

7.1 完整启动流程

bash 复制代码
# 终端1:启动仿真环境
ros2 launch delivery_robot_gazebo full_system.launch.py
 
# 终端2:启动导航系统
ros2 launch delivery_robot_nav2 nav2.launch.py
 
# 终端3:启动语音控制
ros2 run delivery_robot_voice voice_control_node
 
# 终端4:启动RViz可视化
ros2 run rviz2 rviz2 -d $(ros2 pkg prefix delivery_robot_bringup)/share/delivery_robot_bringup/rviz/nav2.rviz

7.2 测试用例设计

测试场景 预期结果 验证方法
空旷环境导航 规划平滑路径,准时到达 RViz路径显示 + 到达提示
动态障碍物避让 实时调整路径,保持安全距离 Gazebo添加移动障碍物
语音指令识别 正确解析位置指令并执行导航 口语化指令测试(带噪音环境)
低电量预警 自主返回充电桩 模拟电量下降阈值

8. 完整代码库说明

8.1 代码结构

复制代码
delivery_robot_ws/
├── src/
│   ├── delivery_robot_description/  # URDF模型
│   ├── delivery_robot_gazebo/       # 仿真环境
│   ├── delivery_robot_slam/         # SLAM配置
│   ├── delivery_robot_nav2/         # 导航系统
│   ├── delivery_robot_voice/        # 语音交互
│   └── delivery_robot_bringup/     # 系统集成

8.2 关键文件说明

  1. urdf/delivery_robot.urdf.xacro:机器人模型描述文件;
  2. config/nav2_params.yaml:导航参数配置;
  3. scripts/voice_control.py:语音交互主程序;
  4. launch/full_system.launch.py:完整系统启动文件。

8.3 运行要求

  • 硬件:建议配置i5-8代CPU + 16GB内存 + 独立显卡;
  • 软件:Ubuntu 22.04 + ROS2 Humble完全安装;
  • 依赖:需安装Gazebo经典模型库(sudo apt install ros-humble-gazebo-ros-pkgs)。

9. 扩展功能实现建议

  1. 多机器人协同:通过ROS2的DDS实现机器人间通信;
  2. 电梯交互:添加数字IO接口控制电梯按钮;
  3. 任务调度系统:基于RCL动作接口实现任务队列管理;
  4. 云端监控:集成WebSocket实现远程状态查看。

注:实际部署时需根据具体场景调整传感器参数和导航配置,建议使用物理机器人前在仿真环境中完成90%以上的功能验证。可通过修改URDF中的传感器插件参数适配不同硬件平台。

相关推荐
bing_feilong4 小时前
树莓派4B搭建Hector SLAM算法, ROS1 & ROS2?
算法·机器人
风虎云龙科研服务器11 小时前
从芯片互连到机器人革命:英伟达双线出击,NVLink开放生态+GR00T模型定义AI计算新时代
人工智能·机器人
新讯网15 小时前
LET 2025盛大开幕!数智工厂×智慧物流×机器人,一展get创新科技
科技·机器人
jndingxin15 小时前
ROS2学习(9)------ROS2动作
学习·机器人
科技宅说1 天前
AI炒菜机器人+一酱成菜构建万店一味的“风味引擎”
人工智能·机器人
Tipriest_1 天前
足式机器人经典控制常用的ROS库介绍
机器人·ros·介绍·足式机器人
qq_368019662 天前
Python结合ollama和stramlit开发聊天机器人
开发语言·python·机器人·streamlit·ollama
沫儿笙2 天前
Panasonic松下焊接机器人节气
机器人
遨博学院2 天前
机器人拖动示教控制
机器人