欢迎来到服务机器人课程!本课程将从零开始,带你系统掌握服务机器人的核心技术——从导航定位到语音交互,从任务规划到系统集成,最终完成实战项目。
| 阶段 | 课程 | 核心技能 |
|---|---|---|
| 🧭 导航基础 | 1-5 | SLAM建图、路径规划、避障、电梯交互 |
| 🗣️ 人机交互 | 6-10 | 语音识别、NLU、对话管理、情感计算 |
| 🎯 任务执行 | 11-15 | 任务规划、物体识别、抓取递送、人脸识别 |
| 🔧 系统集成 | 16-20 | ROS2、云端服务、远程监控、多机调度 |
| 🚀 实战项目 | 21-25 | 酒店/医院/商场/迎宾/毕业项目 |
服务机器人是指在非工业环境中为人类提供服务的自主或半自主机器人。与工业机器人不同,服务机器人需要面对开放、动态、非结构化的人居环境。
| 维度 | 工业机器人 | 服务机器人 |
|---|---|---|
| 环境 | 结构化、封闭 | 开放、动态 |
| 任务 | 重复、确定 | 多样、不确定 |
| 交互 | 少(与人隔离) | 频繁(服务于人) |
| 导航 | 固定轨道/示教 | 自主导航SLAM |
| 容错 | 停机即安全 | 需优雅降级 |
下面的代码模拟了服务机器人的基本架构:
import json, time, random
class ServiceRobot:
def __init__(self, name="ServiceBot-01"):
self.name = name
self.modules = {}
self.state = "idle"
self.battery = 100
self.position = {"x": 0.0, "y": 0.0, "floor": 1}
self.task_queue = []
self.log = []
def register_module(self, name, module):
self.modules[name] = module
self.log.append(f"[注册] 模块 {name} 已加载")
def execute_task(self, task):
self.state = "busy"
self.log.append(f"[执行] 任务: {task['type']}")
result = {"status": "success", "task_id": task.get("id", "T001")}
self.state = "idle"
self.battery = max(0, self.battery - random.uniform(0.5, 2.0))
return result
def get_status(self):
return {
"name": self.name, "state": self.state,
"battery": round(self.battery, 1),
"position": self.position,
"modules": list(self.modules.keys()),
"pending_tasks": len(self.task_queue)
}
robot = ServiceRobot("CloudBot-X1")
robot.register_module("navigation", {"version": "2.1", "mode": "laser_slam"})
robot.register_module("voice", {"version": "1.5", "lang": ["zh", "en"]})
robot.register_module("vision", {"version": "3.0", "models": ["yolov8", "mediapipe"]})
tasks = [
{"id": "T001", "type": "navigate", "target": "会议室A"},
{"id": "T002", "type": "greet", "person": "张总"},
{"id": "T003", "type": "deliver", "item": "咖啡", "to": "工位15"},
]
for t in tasks:
result = robot.execute_task(t)
print(f"任务 {t['id']} ({t['type']}): {result['status']}")
status = robot.get_status()
print(f"\n机器人状态: {json.dumps(status, ensure_ascii=False, indent=2)}")
服务机器人的软件架构通常采用模块化+消息总线的设计,类似于ROS的计算图模型:
┌─────────────────────────────────────┐
│ 应用层 (Application) │
│ 任务规划 │ 对话管理 │ 场景理解 │
├─────────────────────────────────────┤
│ 能力层 (Capability) │
│ 导航 │ 语音 │ 视觉 │ 操控 │ 情感 │
├─────────────────────────────────────┤
│ 通信层 (Communication) │
│ 消息总线 (Message Bus/ROS) │
├─────────────────────────────────────┤
│ 硬件层 (Hardware) │
│ 激光雷达 │ 摄像头 │ 麦克风 │ 电机 │
└─────────────────────────────────────┘模块间通过消息总线通信,实现松耦合:
import json, time
from collections import defaultdict
class MessageBus:
def __init__(self):
self.subscribers = defaultdict(list)
self.message_log = []
def publish(self, topic, message):
msg = {"topic": topic, "data": message, "timestamp": time.time()}
self.message_log.append(msg)
for callback in self.subscribers[topic]:
callback(msg)
def subscribe(self, topic, callback):
self.subscribers[topic].append(callback)
def get_log(self, topic=None):
if topic:
return [m for m in self.message_log if m["topic"] == topic]
return self.message_log
bus = MessageBus()
events = []
def on_nav(msg): events.append(f"导航→ 收到: {msg['data']}")
def on_voice(msg): events.append(f"语音→ 识别: {msg['data']}")
def on_vision(msg): events.append(f"视觉→ 检测: {msg['data']}")
bus.subscribe("/nav/command", on_nav)
bus.subscribe("/voice/command", on_voice)
bus.subscribe("/vision/detect", on_vision)
bus.publish("/voice/command", "去会议室A")
bus.publish("/nav/command", "路径: (0,0)→(5,3)")
bus.publish("/vision/detect", "行人 距离2.5m")
bus.publish("/nav/command", "避障: 左转15°")
for e in events:
print(e)
print(f"\n消息统计: 共 {len(bus.get_log())} 条")
robot_types = {
"配送机器人": {
"代表": ["Pudu BellaBot", "云迹润宝", "擎朗花生"],
"核心": ["室内导航", "动态避障", "电梯交互", "多机调度"],
"场景": ["酒店配送", "餐厅送餐", "医院运输"],
"市场": "约120亿(2024)"
},
"导诊机器人": {
"代表": ["晓医机器人", "科大讯飞智医助理"],
"核心": ["语音交互", "科室导航", "人脸识别", "知识问答"],
"场景": ["门诊导诊", "健康咨询", "自助挂号"],
"市场": "约80亿(2024)"
},
"迎宾机器人": {
"代表": ["优必选Cruzr", "康力优蓝Little U"],
"核心": ["人脸识别", "情感交互", "多模态对话", "主动问候"],
"场景": ["展厅接待", "商场指引", "前台服务"],
"市场": "约60亿(2024)"
},
"清洁机器人": {
"代表": ["高仙机器人", "奇勃科技"],
"核心": ["自主建图", "区域覆盖", "自动充电", "污渍检测"],
"场景": ["商场清洁", "医院消毒", "停车场清扫"],
"市场": "约150亿(2024)"
}
}
print("=" * 55)
print("服务机器人分类与应用场景")
print("=" * 55)
for rtype, info in robot_types.items():
print(f"\n🔹 {rtype}")
for k, v in info.items():
if isinstance(v, list):
print(f" {k}: {', '.join(v)}")
else:
print(f" {k}: {v}")
| 领域 | 关键技术 | 常用工具 |
|---|---|---|
| 导航定位 | SLAM、路径规划、定位 | Cartographer、Nav2、AMCL |
| 感知理解 | 物体检测、语义分割 | YOLOv8、SAM、MediaPipe |
| 语音交互 | ASR、TTS、NLU | Whisper、VITS、Rasa |
| 人机交互 | 人脸识别、情感计算 | ArcFace、FER、多模态融合 |
| 任务规划 | 行为树、状态机 | BehaviorTree.CPP、SMACH |
| 系统集成 | 中间件、云端、运维 | ROS2、Docker、K8s |
服务机器人典型交互遵循感知→理解→决策→执行→反馈循环:
用户: "帮我送咖啡到3楼会议室"
│
├─→ [语音识别] ASR: 音频→文字
├─→ [语义理解] NLU: 意图=配送, 目标=3楼会议室, 物品=咖啡
├─→ [任务规划] 规划: 取咖啡→等电梯→到3楼→进会议室
├─→ [导航执行] 导航到咖啡机→避障→电梯交互→到达
├─→ [交互反馈] "咖啡已送达,祝会议顺利!"
└─→ [状态更新] 任务完成→返回待命点扩展ServiceRobot类,添加charge()方法,当电量低于20%时自动导航到充电桩并充电至90%。模拟电量消耗和充电过程。
在MessageBus中实现service_call(topic, request)同步调用模式,支持请求-响应语义,超时3秒返回错误。
设计养老陪护机器人场景,定义模块、任务类型、交互流程,模拟5个典型任务执行。