当前位置: 首页 > news >正文

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

1. 系统架构设计

1.1 功能需求分析

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

1.2 技术栈选型

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

2. 开发环境搭建

2.1 系统依赖安装

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

2.2 工作空间初始化

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 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 传感器集成

<!-- 激光雷达 -->
<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配置

# 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.05map_size: 204.8

4.2 建图流程

# 启动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. Nav2导航系统配置

5.1 导航参数配置

# nav2_params.yaml
nav2_costmap_2d:global_costmap:global_frame: "map"robot_base_frame: "base_link"resolution: 0.05plugins:- {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 路径规划算法

# 导航目标发布节点
import rclpy
from geometry_msgs.msg import PoseStampedclass 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 = 0def timer_callback(self):msg = PoseStamped()msg.header.stamp = self.get_clock().now().to_msg()msg.header.frame_id = 'map'# 示例目标点(需根据实际地图坐标调整)msg.pose.position.x = 2.0msg.pose.position.y = 1.0self.publisher_.publish(msg)self.get_logger().info(f'Publishing: {msg}')

6. 语音交互模块集成

6.1 语音识别实现

# voice_control.py
import speech_recognition as sr
import rclpy
from std_msgs.msg import Stringclass 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 commandexcept sr.UnknownValueError:return ""except sr.RequestError as e:self.get_logger().error(f'Recognition error: {e}')return ""

6.2 命令解析逻辑

# 命令处理回调
def command_callback(self, msg):cmd = msg.dataif '送餐' 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 coordreturn None

7. 系统集成与测试

7.1 完整启动流程

# 终端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中的传感器插件参数适配不同硬件平台。

相关文章:

  • 生产消费者模型 读写者模型
  • 监控易一体化运维:采集集群管理,构建稳健运维基石
  • 【SPIN】高级时序规范(SPIN学习系列--6)
  • 什么是物联网 (IoT):2024 年物联网概述
  • Fiddler 指定链接断点
  • Python Selenium 使用指南
  • 公网ip能绑定什么?
  • 30天自制操作系统day5(vram和显存)(GDT和IDT)(c语言结构体)(汇编-c)(ai辅助整理)
  • 基于大模型预测的闭合性髌骨骨折诊疗全流程研究报告
  • Tractor S--二维转一维,然后最小生成树
  • 如何看待镍钯金PCB在当代工业制造中的地位和应用?
  • AI大模型应对挑战,使用winform实现小球在旋转五边形内的舞蹈
  • 深入理解 Python 中的几种方法:实例方法、类方法、静态方法与特殊方法
  • 强化学习_置信域算法RL
  • 波峰波谷策略
  • BACnet协议详解:架构、应用、挑战与未来发展
  • jsmpeg+java+ffmpeg 调用摄像头RTSP流播放
  • C++23 容器从其他兼容范围的可构造性与可赋值性 (P1206R7)
  • Semaphore解决高并发场景下的有限资源的并发访问问题
  • 深入解析前端 JSBridge:现代混合开发的通信基石与架构艺术
  • 演员朱媛媛去世,其丈夫辛柏青发讣告
  • 福州市委副书记、福州新区党工委书记陈云水转任三明市政协党组书记
  • 中国华能:1-4月新能源装机突破1亿千瓦,利润总额再创新高
  • 上海电视节发布海报、宣传片:三十而励,光影新程
  • 住建部:2019年至2024年,全国累计开工改造老旧小区28万个
  • 红星控股重整期间实控人被留置后续:重整草案不会修改,涉车建兴职责已调整