qidao123.com技术社区-IT企服评测·应用市场

标题: 基于ROS2/Gazebo的室内送餐呆板人体系开辟实战教程 [打印本页]

作者: 农妇山泉一亩田    时间: 23 小时前
标题: 基于ROS2/Gazebo的室内送餐呆板人体系开辟实战教程
1. 体系架构设计

1.1 功能需求分析

     1.2 技术栈选型

组件技术选型呆板人框架ROS2 Humble仿真情况Gazebo 11导航体系Nav2(Navigation2)建图算法SLAM Toolbox语音交互SpeechRecognition + PyAudio建模工具URDF + SolidWorks插件 2. 开辟情况搭建

2.1 体系依靠安装

  1. # Ubuntu 22.04环境准备
  2. sudo apt install -y \
  3.   ros-humble-desktop \
  4.   ros-humble-gazebo-* \
  5.   ros-humble-navigation2 \
  6.   ros-humble-nav2-bringup \
  7.   python3-pyaudio
复制代码
2.2 工作空间初始化

  1. mkdir -p ~/delivery_robot_ws/src
  2. cd ~/delivery_robot_ws/
  3. rosdep install -i --from-path src --rosdistro humble -y
  4. colcon build --symlink-install
复制代码
3. 呆板人URDF建模

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

  1. <?xml version="1.0"?>
  2. <robot name="delivery_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
  3.   <!-- 底座链接 -->
  4.   <link name="base_link">
  5.     <visual>
  6.       <geometry>
  7.         <cylinder radius="0.25" length="0.15"/>
  8.       </geometry>
  9.       <material name="blue">
  10.         <color rgba="0 0 1 1"/>
  11.       </material>
  12.     </visual>
  13.   </link>
  14.   <!-- 驱动轮宏 -->
  15.   <xacro:macro name="wheel" params="prefix reflect">
  16.     <link name="${prefix}_wheel_link">
  17.       <visual>
  18.         <geometry>
  19.           <cylinder radius="0.05" length="0.03"/>
  20.         </geometry>
  21.       </visual>
  22.     </link>
  23.    
  24.     <joint name="${prefix}_wheel_joint" type="continuous">
  25.       <origin xyz="0 ${reflect*0.15} -0.05" rpy="1.5708 0 0"/>
  26.       <parent link="base_link"/>
  27.       <child link="${prefix}_wheel_link"/>
  28.       <axis xyz="0 0 1"/>
  29.     </joint>
  30.   </xacro:macro>
  31.   <!-- 实例化左右轮 -->
  32.   <xacro:wheel prefix="left" reflect="1"/>
  33.   <xacro:wheel prefix="right" reflect="-1"/>
  34. </robot>
复制代码
3.2 传感器集成

  1. <!-- 激光雷达 -->
  2. <link name="lidar_link">
  3.   <visual>
  4.     <geometry>
  5.       <cylinder radius="0.05" length="0.1"/>
  6.     </geometry>
  7.   </visual>
  8. </link>
  9. <joint name="lidar_joint" type="fixed">
  10.   <origin xyz="0 0 0.2" rpy="0 0 0"/>
  11.   <parent link="base_link"/>
  12.   <child link="lidar_link"/>
  13. </joint>
  14. <!-- 深度相机 -->
  15. <gazebo reference="camera_link">
  16.   <sensor type="depth" name="camera">
  17.     <update_rate>30</update_rate>
  18.     <camera>
  19.       <horizontal_fov>1.047</horizontal_fov>
  20.       <image>
  21.         <width>640</width>
  22.         <height>480</height>
  23.       </image>
  24.     </camera>
  25.   </sensor>
  26. </gazebo>
复制代码
4. SLAM建图与定位

4.1 SLAM Toolbox配置

  1. # slam_params.yaml
  2. slam_toolbox:
  3.   ros__parameters:
  4.     base_frame: "base_link"
  5.     odom_frame: "odom"
  6.     map_frame: "map"
  7.     mode: "mapping"  # 或 "localization"
  8.    
  9.     # 激光雷达配置
  10.     scan_topic: "/scan"
  11.    
  12.     # 地图参数
  13.     map_resolution: 0.05
  14.     map_size: 204.8
复制代码
4.2 建图流程

  1. # 启动Gazebo仿真
  2. ros2 launch delivery_robot_gazebo simulation.launch.py
  3. # 启动SLAM节点
  4. ros2 launch delivery_robot_slam slam.launch.py
  5. # 启动键盘控制
  6. ros2 run teleop_twist_keyboard teleop_twist_keyboard
  7. # 保存地图
  8. ros2 run nav2_map_server map_saver_cli -f ~/maps/office_map
复制代码
5. Nav2导航体系配置

5.1 导航参数配置

  1. # nav2_params.yaml
  2. nav2_costmap_2d:
  3.   global_costmap:
  4.     global_frame: "map"
  5.     robot_base_frame: "base_link"
  6.     resolution: 0.05
  7.    
  8.     plugins:
  9.       - {name: static_layer,    type: "nav2_costmap_2d::StaticLayer"}
  10.       - {name: obstacle_layer,  type: "nav2_costmap_2d::ObstacleLayer"}
  11.       - {name: inflation_layer, type: "nav2_costmap_2d::InflationLayer"}
  12.   local_costmap:
  13.     global_frame: "odom"
  14.     rolling_window: true
复制代码
5.2 路径规划算法

  1. # 导航目标发布节点
  2. import rclpy
  3. from geometry_msgs.msg import PoseStamped
  4. class NavGoalPublisher(rclpy.node.Node):
  5.     def __init__(self):
  6.         super().__init__('nav_goal_publisher')
  7.         self.publisher_ = self.create_publisher(PoseStamped, '/goal_pose', 10)
  8.         timer_period = 5.0  # 5秒发送一次新目标
  9.         self.timer = self.create_timer(timer_period, self.timer_callback)
  10.         self.count = 0
  11.     def timer_callback(self):
  12.         msg = PoseStamped()
  13.         msg.header.stamp = self.get_clock().now().to_msg()
  14.         msg.header.frame_id = 'map'
  15.         # 示例目标点(需根据实际地图坐标调整)
  16.         msg.pose.position.x = 2.0
  17.         msg.pose.position.y = 1.0
  18.         self.publisher_.publish(msg)
  19.         self.get_logger().info(f'Publishing: {msg}')
复制代码
6. 语音交互模块集成

6.1 语音辨认实现

  1. # voice_control.py
  2. import speech_recognition as sr
  3. import rclpy
  4. from std_msgs.msg import String
  5. class VoiceController(rclpy.node.Node):
  6.     def __init__(self):
  7.         super().__init__('voice_controller')
  8.         self.publisher_ = self.create_publisher(String, '/voice_command', 10)
  9.         self.recognizer = sr.Recognizer()
  10.         self.mic = sr.Microphone()
  11.     def listen(self):
  12.         with self.mic as source:
  13.             self.recognizer.adjust_for_ambient_noise(source)
  14.             audio = self.recognizer.listen(source)
  15.             
  16.         try:
  17.             command = self.recognizer.recognize_google(audio).lower()
  18.             self.publisher_.publish(String(data=command))
  19.             return command
  20.         except sr.UnknownValueError:
  21.             return ""
  22.         except sr.RequestError as e:
  23.             self.get_logger().error(f'Recognition error: {e}')
  24.             return ""
复制代码
6.2 命令解析逻辑

  1. # 命令处理回调
  2. def command_callback(self, msg):
  3.     cmd = msg.data
  4.     if '送餐' in cmd:
  5.         # 解析目标位置
  6.         target = self.parse_target(cmd)
  7.         self.send_navigation_goal(target)
  8.     elif '停止' in cmd:
  9.         self.cancel_navigation()
  10. def parse_target(self, cmd):
  11.     # 简单位置解析(实际项目需NLP处理)
  12.     locations = {
  13.         '前台': (2.0, 1.0),
  14.         '会议室': (5.0, -3.0),
  15.         '休息区': (-1.0, 4.0)
  16.     }
  17.     for loc, coord in locations.items():
  18.         if loc in cmd:
  19.             return coord
  20.     return None
复制代码
7. 体系集成与测试

7.1 完整启动流程

  1. # 终端1:启动仿真环境
  2. ros2 launch delivery_robot_gazebo full_system.launch.py
  3. # 终端2:启动导航系统
  4. ros2 launch delivery_robot_nav2 nav2.launch.py
  5. # 终端3:启动语音控制
  6. ros2 run delivery_robot_voice voice_control_node
  7. # 终端4:启动RViz可视化
  8. 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 代码结构

  1. delivery_robot_ws/
  2. ├── src/
  3. │   ├── delivery_robot_description/  # URDF模型
  4. │   ├── delivery_robot_gazebo/       # 仿真环境
  5. │   ├── delivery_robot_slam/         # SLAM配置
  6. │   ├── delivery_robot_nav2/         # 导航系统
  7. │   ├── delivery_robot_voice/        # 语音交互
  8. │   └── delivery_robot_bringup/     # 系统集成
复制代码
8.2 关键文件说明

8.3 运行要求


9. 扩展功能实现发起

   注:实际摆设时需根据详细场景调整传感器参数和导航配置,发起利用物理呆板人前在仿真情况中完成90%以上的功能验证。可通过修改URDF中的传感器插件参数适配不同硬件平台。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/) Powered by Discuz! X3.4