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. Nav2导航系统配置
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 关键文件说明
urdf/delivery_robot.urdf.xacro
:机器人模型描述文件;config/nav2_params.yaml
:导航参数配置;scripts/voice_control.py
:语音交互主程序;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. 扩展功能实现建议
- 多机器人协同:通过ROS2的DDS实现机器人间通信;
- 电梯交互:添加数字IO接口控制电梯按钮;
- 任务调度系统:基于RCL动作接口实现任务队列管理;
- 云端监控:集成WebSocket实现远程状态查看。
注:实际部署时需根据具体场景调整传感器参数和导航配置,建议使用物理机器人前在仿真环境中完成90%以上的功能验证。可通过修改URDF中的传感器插件参数适配不同硬件平台。