树莓派机器人云台摄像头搭建指南:从舵机控制到视觉追踪
1. 项目概述为树莓派机器人打造一双灵动的“眼睛”给树莓派机器人装上一个云台摄像头这听起来像是一个简单的硬件叠加但实际做下来你会发现这远不止是把两个模块拧在一起那么简单。这双“眼睛”赋予了机器人主动观察、追踪和与环境交互的能力是机器人从“能移动的盒子”升级为“有感知的智能体”的关键一步。无论是想做一个能跟着你跑的宠物机器人一个自动巡逻的安防小车还是一个能识别物体并做出反应的实验平台云台摄像头都是核心的感官部件。我自己在捣鼓机器人项目时无数次体会到固定视角的局限性——机器人稍微一动目标就出框了想观察侧面就得整个车身转过去笨重又低效。一个灵活的双轴Pan-Tilt云台水平Pan旋转和垂直Tilt俯仰的自由度让摄像头能独立于机器人底盘运动实现真正的“眼观六路”。这背后涉及硬件选型、机械结构、电机驱动、软件控制以及图像处理算法的整合是一个典型的机器人学交叉实践项目。今天我就把自己从零搭建一套稳定、响应快、易编程的树莓派机器人云台摄像头的完整过程、踩过的坑和优化心得毫无保留地分享出来。2. 核心硬件选型与设计思路拆解搭建云台摄像头第一步不是写代码而是搞清楚你需要什么以及为什么这么选。硬件是地基选错了后面全是坑。2.1 云台结构舵机 vs 步进电机 vs 直流电机云台的动力核心是电机常见选择有三种舵机Servo、步进电机Stepper Motor和带编码器的直流电机DC Motor with Encoder。舵机推荐入门及轻量应用这是最常见的选择尤其是SG90、MG90S这类微型舵机。它们内部集成了控制电路和电位器用于反馈位置你只需要发送一个PWM脉宽调制信号就能让它精确地转动到指定角度。优点是开箱即用、控制简单、成本低。树莓派GPIO可以直接生成PWM信号需注意电流驱动能力配合像RPi.GPIO或pigpio这样的库几行代码就能驱动。缺点是存在死区、有抖动、扭矩有限、无法连续旋转除非改装。对于负载不重如一个树莓派官方摄像头或轻量USB摄像头的云台两个舵机方案是快速上手的最佳选择。步进电机推荐精密控制如果需要更高的精度、更大的扭矩和连续旋转多圈无限位步进电机是更好的选择。它通过按序激励线圈来“步进”转动可以实现非常精细的角度控制。但控制比舵机复杂需要专门的驱动板如A4988、DRV8825并发送脉冲序列来控制转速和角度。优点是精度高、扭矩大、可连续旋转。缺点是控制系统更复杂、可能存在低速振动、需要额外驱动电路。如果你的摄像头很重或者需要非常平滑、精确的扫描运动可以考虑步进电机方案。直流电机编码器高性能闭环控制这是最灵活也是最高级的方案。直流电机提供动力编码器实时反馈电机轴的实际位置形成一个闭环控制系统。你可以实现高速、高精度、高动态响应的运动。但这需要额外的电机驱动板如TB6612FNG和编码器读数电路控制算法上也需实现PID控制等复杂度最高。我的选择与理由对于大多数树莓派机器人爱好者我强烈推荐从舵机云台套件开始。市面上有大量现成的双舵机云台支架通常包含两个SG90舵机和亚克力/塑料结构件价格在30-50元。它极大地降低了机械组装的门槛。我们先追求“动起来”再优化“动得好”。本文后续也将以舵机方案为基础进行详解。2.2 摄像头选型CSI接口 vs USB接口树莓派支持两种主要摄像头专用的CSI接口摄像头和通用的USB摄像头。树莓派官方CSI摄像头推荐这是亲儿子通过排线直接连接到树莓派的CSI接口。优点是功耗低、延迟极低、CPU占用率小、与系统集成度高。使用libcamera库可以获得最好的性能和最新的功能支持。对于需要实时图像处理如物体追踪的应用低延迟是至关重要的。缺点是线缆固定长度和布线灵活性稍差。USB摄像头通用灵活即插即用选择众多从普通的720p到高性能的4K网络摄像头都有。优点是即插即用、选择多样、易于更换、线缆更长更灵活。通常使用OpenCV的VideoCapture接口调用兼容性好。缺点是延迟相对较高、USB带宽和供电可能成为瓶颈尤其多个USB设备时、CPU占用率通常比CSI摄像头高。我的选择与理由如果你追求最低延迟和最高效率用于快速移动的机器人视觉请选择树莓派官方CSI摄像头模块如Camera Module 3它还有自动对焦和HDR功能。如果你的应用对实时性要求不是极端苛刻或者手头已有USB摄像头想快速验证USB方案是完全可行的。我自己的追踪机器人用的是Camera Module 3延迟感知明显优于我测试过的几款USB摄像头。2.3 供电与驱动别让小细节毁了系统这是最容易忽视却最容易出问题的地方。舵机供电隔离舵机尤其是MG90S这类金属齿轮舵机在启动和堵转时瞬间电流很大可达1A以上。绝对不要直接从树莓派的GPIO的5V或3.3V引脚取电这会导致树莓派电压不稳引发系统重启或损坏。正确做法是使用独立的外接电源如一块5V的锂电池组或稳压模块为舵机供电。只需将外接电源的“地”GND与树莓派的GND连接实现“共地”然后用外接电源的“正极”VCC给舵机供电树莓派GPIO只提供控制信号PWM。PWM信号质量树莓派GPIO产生的软件PWM如用RPi.GPIO可能因系统负载而产生抖动导致舵机轻微震颤。对于要求高的应用建议使用硬件PWM树莓派只有特定引脚支持如GPIO12、13、18、19或使用像pigpio这样的库它利用DMA直接内存访问产生更稳定的PWM效果显著改善。机械结构加固云台在快速启停时会有惯性。如果摄像头重心偏离转轴较远或者支架刚性不足会产生晃动影响图像稳定。可以在设计3D打印结构时增加加强筋或选择更结实的舵机如MG996R扭矩更大。3. 软件架构与控制逻辑实现硬件连接好后软件就是大脑。我们需要一个清晰、高效且易于扩展的控制架构。3.1 控制层PWM信号生成与舵机驱动首先我们需要一个可靠的舵机驱动模块。这里我使用pigpio库因为它提供了稳定、精准的PWM。# servo_controller.py import pigpio import time class PanTiltController: def __init__(self, pan_pin17, tilt_pin27, min_pulse500, max_pulse2500): 初始化云台控制器 :param pan_pin: 水平舵机连接的GPIO引脚 (BCM编号) :param tilt_pin: 垂直舵机连接的GPIO引脚 :param min_pulse: 舵机最小脉宽 (微秒) :param max_pulse: 舵机最大脉宽 (微秒) self.pi pigpio.pi() # 连接到本地pigpio守护进程 if not self.pi.connected: raise Exception(无法连接到pigpio守护进程请先运行 sudo pigpiod) self.pan_pin pan_pin self.tilt_pin tilt_pin self.min_pulse min_pulse self.max_pulse max_pulse # 设置引脚为输出模式 self.pi.set_mode(pan_pin, pigpio.OUTPUT) self.pi.set_mode(tilt_pin, pigpio.OUTPUT) # 初始位置设为中间 (通常对应1500us脉宽) self.pan_angle 90 self.tilt_angle 90 self._update_servo_position() def _angle_to_pulse(self, angle): 将角度(0-180)转换为PWM脉宽(微秒) # 限制角度范围 angle max(0, min(180, angle)) # 线性映射 pulse self.min_pulse (angle / 180.0) * (self.max_pulse - self.min_pulse) return int(pulse) def _update_servo_position(self): 根据当前角度更新舵机PWM信号 pan_pulse self._angle_to_pulse(self.pan_angle) tilt_pulse self._angle_to_pulse(self.tilt_angle) self.pi.set_servo_pulsewidth(self.pan_pin, pan_pulse) self.pi.set_servo_pulsewidth(self.tilt_pin, tilt_pulse) def set_angle(self, panNone, tiltNone): 设置云台角度 :param pan: 水平角度 (0-180) :param tilt: 垂直角度 (0-180) if pan is not None: self.pan_angle pan if tilt is not None: self.tilt_angle tilt self._update_servo_position() def smooth_move(self, target_pan, target_tilt, duration1.0, steps50): 平滑移动到目标位置 :param target_pan: 目标水平角 :param target_tilt: 目标垂直角 :param duration: 移动总时间(秒) :param steps: 移动步数 start_pan, start_tilt self.pan_angle, self.tilt_angle step_delay duration / steps for i in range(steps1): ratio i / steps current_pan start_pan (target_pan - start_pan) * ratio current_tilt start_tilt (target_tilt - start_tilt) * ratio self.set_angle(current_pan, current_tilt) time.sleep(step_delay) def cleanup(self): 清理资源关闭PWM信号 self.pi.set_servo_pulsewidth(self.pan_pin, 0) # 发送0脉宽停止信号 self.pi.set_servo_pulsewidth(self.tilt_pin, 0) self.pi.stop() # 使用示例 if __name__ __main__: controller PanTiltController() try: # 移动到预设位置 controller.set_angle(pan90, tilt90) # 归中 time.sleep(1) controller.smooth_move(pan45, tilt135, duration2.0) # 平滑移动到左上 time.sleep(1) controller.smooth_move(pan135, tilt45, duration2.0) # 平滑移动到右下 finally: controller.cleanup()关键点解析pigpio库需要先运行守护进程sudo pigpiod。它比RPi.GPIO的软件PWM稳定得多。set_servo_pulsewidth函数直接设置脉宽省去了自己计算占空比的麻烦。smooth_move函数实现了简单的点位插值让运动看起来更平滑而不是突兀地跳转这对于视频流观感很重要。cleanup方法至关重要它会在程序退出时停止发送PWM信号防止舵机因接收不到信号而“吱吱”叫并发热。3.2 视觉层图像采集与处理控制层让云台“能动”视觉层则告诉它“该往哪动”。这里我们用OpenCV实现一个简单的颜色追踪例子。# object_tracker.py import cv2 import numpy as np from servo_controller import PanTiltController # 导入我们刚才写的控制器 class ColorObjectTracker: def __init__(self, camera_index0, target_colorred): 初始化颜色追踪器 :param camera_index: 摄像头索引CSI摄像头可能是0USB摄像头可能是0或1 :param target_color: 要追踪的颜色 (red, green, blue) # 初始化摄像头 self.cap cv2.VideoCapture(camera_index) # 对于CSI摄像头可能需要特殊设置这里以通用USB为例 # 如果是Picamera2 (用于CSI摄像头)代码结构会不同 self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 初始化云台控制器 self.controller PanTiltController() # 设置目标颜色的HSV范围阈值 (Hue, Saturation, Value) self.color_ranges { red: ([0, 120, 70], [10, 255, 255]), # 红色范围1 (低Hue) red2: ([170, 120, 70], [180, 255, 255]), # 红色范围2 (高Hue因为HSV中红色在0和180附近) green: ([40, 40, 40], [80, 255, 255]), blue: ([100, 150, 0], [140, 255, 255]) } self.target_color target_color # PID控制器参数 (简单比例控制) self.pan_kp 0.5 # 水平比例系数 self.tilt_kp 0.5 # 垂直比例系数 self.frame_center_x 320 # 假设图像宽度640 self.frame_center_y 240 # 假设图像高度480 def get_color_mask(self, hsv_frame): 根据目标颜色获取掩膜 if self.target_color red: # 红色需要合并两个范围 lower1, upper1 self.color_ranges[red] lower2, upper2 self.color_ranges[red2] mask1 cv2.inRange(hsv_frame, np.array(lower1), np.array(upper1)) mask2 cv2.inRange(hsv_frame, np.array(lower2), np.array(upper2)) mask cv2.bitwise_or(mask1, mask2) else: lower, upper self.color_ranges[self.target_color] mask cv2.inRange(hsv_frame, np.array(lower), np.array(upper)) # 形态学操作去除噪声 kernel np.ones((5,5), np.uint8) mask cv2.erode(mask, kernel, iterations1) mask cv2.dilate(mask, kernel, iterations2) return mask def find_object_center(self, mask): 在掩膜中找到最大轮廓并返回其中心点坐标 contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: # 找到面积最大的轮廓 largest_contour max(contours, keycv2.contourArea) if cv2.contourArea(largest_contour) 500: # 忽略太小的噪点 # 计算轮廓的矩 M cv2.moments(largest_contour) if M[m00] ! 0: cx int(M[m10] / M[m00]) cy int(M[m01] / M[m00]) return (cx, cy), largest_contour return None, None def update_pan_tilt(self, obj_center): 根据目标中心点位置更新云台角度 (简单的P控制) if obj_center: cx, cy obj_center # 计算目标中心与图像中心的偏差 error_x cx - self.frame_center_x error_y cy - self.frame_center_y # 获取当前角度 current_pan self.controller.pan_angle current_tilt self.controller.tilt_angle # 计算新的角度 (比例控制) # 注意误差符号与角度增减方向相关可能需要根据你的舵机安装方向调整 new_pan current_pan - error_x * self.pan_kp / 100.0 new_tilt current_tilt error_y * self.tilt_kp / 100.0 # 通常Y轴误差与Tilt角度变化方向相反 # 限制角度范围 (0-180) new_pan max(0, min(180, new_pan)) new_tilt max(0, min(180, new_tilt)) # 更新云台位置 self.controller.set_angle(pannew_pan, tiltnew_tilt) return error_x, error_y return None, None def run(self): 主循环捕获图像、处理、追踪 print(开始颜色追踪按 q 键退出...) while True: ret, frame self.cap.read() if not ret: print(无法从摄像头读取帧) break # 水平翻转图像这样移动看起来更直观像镜子 frame cv2.flip(frame, 1) # 转换为HSV颜色空间更容易进行颜色分割 hsv cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 获取颜色掩膜 mask self.get_color_mask(hsv) # 找到目标物体中心 obj_center, contour self.find_object_center(mask) # 更新云台追踪 errors self.update_pan_tilt(obj_center) # 在图像上绘制 if obj_center and contour: cx, cy obj_center # 绘制轮廓和中心点 cv2.drawContours(frame, [contour], -1, (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 7, (0, 0, 255), -1) cv2.putText(frame, fTarget ({cx}, {cy}), (cx-20, cy-20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) # 绘制从中心到目标的线 cv2.line(frame, (self.frame_center_x, self.frame_center_y), (cx, cy), (255, 0, 0), 2) if errors: err_x, err_y errors cv2.putText(frame, fError X: {err_x:.1f}, Y: {err_y:.1f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 0), 2) # 显示图像 cv2.imshow(Pan-Tilt Tracking, frame) cv2.imshow(Color Mask, mask) # 按q退出 if cv2.waitKey(1) 0xFF ord(q): break # 清理 self.cap.release() cv2.destroyAllWindows() self.controller.cleanup() if __name__ __main__: # 追踪红色物体 tracker ColorObjectTracker(camera_index0, target_colorred) tracker.run()关键点解析颜色空间转换OpenCV默认使用BGR格式但HSV色相、饱和度、明度颜色空间对颜色变化更鲁棒更适合做颜色追踪。双范围红色在HSV中红色位于色相环的起点0°和终点180°附近因此需要两个阈值范围来完整捕捉红色。形态学操作erode腐蚀和dilate膨胀用于去除掩膜中的小噪点并填充空洞让目标区域更完整。轮廓分析cv2.findContours找到掩膜中的白色区域边界我们选取面积最大的那个作为目标。比例P控制这是最简单的反馈控制。误差目标位置与画面中心的距离乘以一个系数kp得到角度的调整量。kp值需要调试太小则追踪慢反应迟钝太大则容易振荡云台来回抖动。图像显示实时显示原画面和掩膜画面对于调试阈值参数和理解算法行为至关重要。4. 系统集成与机器人平台结合云台摄像头本身是一个子系统最终需要集成到更大的树莓派机器人平台上。这里涉及到通信、协同和资源管理。4.1 通信架构设计你的机器人可能还有其他部分比如电机驱动、传感器、主控逻辑。一个清晰的通信架构能避免代码变成一团乱麻。方案一单进程多线程在一个Python主程序中创建多个线程一个线程负责图像处理和追踪计算视觉线程一个线程负责云台控制执行线程一个线程负责底盘运动控制一个主线程协调。使用线程安全的队列queue.Queue在线程间传递数据如“目标在画面左侧”这个指令。这种方法简单直接但需要小心处理全局变量和线程同步。方案二多进程与进程间通信IPC由于Python的全局解释器锁GIL计算密集型的视觉处理可能会阻塞其他线程。可以将视觉处理放在一个独立的进程中通过Socket、Pipe或Redis等消息队列与其他进程通信。这样能更好地利用多核CPU提高系统响应性。方案三发布/订阅模型ROS/ROS2思想这是最机器人专业化的方式。你可以使用ROSRobot Operating System或更现代的ROS2。云台摄像头作为一个独立的“节点”Node发布Publish图像话题Topic和摄像头状态同时订阅Subscribe控制指令话题。底盘控制是另一个节点。它们通过ROS Master进行发现和通信。这种方式模块化程度最高易于扩展和复用但学习曲线较陡。我的建议对于初学者或中等复杂度的项目方案一多线程配合良好的设计就足够了。可以定义一个共享的RobotState类用线程锁保护关键数据。对于更复杂的、需要集成激光雷达、SLAM等模块的项目方案三ROS是行业标准值得投入时间学习。4.2 与底盘运动的协同当机器人底盘也在运动时云台的追踪会变得复杂。例如机器人向右转即使目标静止在摄像头画面中目标也会向左移动。这会导致云台向左转以补偿产生错误运动。解决方案传感器融合。如果机器人底盘装有编码器或惯性测量单元IMU可以估算出机器人自身的旋转速度。将这个信息反馈给云台控制器让云台进行反向补偿。例如检测到机器人正在以每秒10度的速度右转那么云台控制器就在其计算出的目标角度上额外增加一个每秒10度的左转速度。这需要更高级的状态估计和控制算法如扩展卡尔曼滤波。一个简化的实现思路是在update_pan_tilt函数中除了视觉误差再加入一个由底盘运动引起的补偿角速度。def update_pan_tilt(self, obj_center, chassis_rotation_speed0): 更新云台角度加入底盘旋转补偿 if obj_center: # ... 原有视觉误差计算 ... # 假设chassis_rotation_speed单位是 度/秒 dt是自上次调用以来的时间 compensation chassis_rotation_speed * self.dt # dt需要实际计算或估计 # 补偿方向与底盘旋转方向相反 new_pan current_pan - error_x * self.pan_kp / 100.0 compensation # ...4.3 性能优化与实战技巧在树莓派上跑OpenCV和实时控制优化是必须的。降低图像分辨率这是最有效的提速方法。从1080p降到640x480甚至320x240处理速度会成倍提升。对于追踪来说往往不需要太高分辨率。self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)跳帧处理如果不需要极高的帧率可以每处理2帧或3帧图像就跳过后面的。这能显著降低CPU负载。frame_skip 2 frame_count 0 while True: ret, frame self.cap.read() frame_count 1 if frame_count % frame_skip ! 0: continue # 跳过这帧只读取不处理 # ... 处理逻辑 ...区域兴趣ROI如果目标通常出现在画面中央区域可以只对图像的一部分进行处理而不是全图。height, width frame.shape[:2] roi frame[int(height*0.25):int(height*0.75), int(width*0.25):int(width*0.75)] # 只处理中间50%的区域使用硬件加速对于树莓派4B或更新型号确保OpenCV编译时启用了NEON和VFPv3优化。对于CSI摄像头使用picamera2库替代旧的picamera能获得最佳的硬件编码和解码性能。调整OpenCV函数有些OpenCV函数有更快的替代品。例如对于简单的颜色阈值分割直接使用NumPy的数组操作可能比cv2.inRange更快但可读性会下降。5. 常见问题排查与进阶调试在实际搭建中你几乎一定会遇到下面这些问题。5.1 舵机问题排查表现象可能原因解决方案舵机完全不转1. 供电不足或没接电。2. 信号线接错GPIO引脚。3. 舵机损坏。1. 检查外接电源电压5V-6V和电流1A确保共地。2. 用gpio readall命令确认引脚编号检查接线。3. 更换舵机测试。舵机转动角度不对如只能转90度PWM脉宽范围设置错误。舵机标准是500-2500us对应0-180度但有些舵机范围不同。调整min_pulse和max_pulse参数。尝试设置set_angle(0)和set_angle(180)观察实际角度反向校准脉宽。舵机抖动或吱吱叫1. PWM信号不稳定软件PWM通病。2. 机械负载过重或卡住。3. 程序结束后未发送停止信号。1. 换用pigpio库的硬件定时PWM。2. 减轻负载检查机械结构是否顺畅。3. 确保程序退出前调用cleanup()发送0脉宽。舵机发热严重1. 堵转舵机无法到达指令位置。2. 持续收到PWM信号但被机械限位。1. 检查机械结构是否阻碍运动适当增大max_pulse或减小min_pulse。2. 避免让舵机长时间处于极限位置受力。5.2 视觉追踪问题与调优追踪不稳定目标丢失检查HSV阈值这是最常见的问题。光线变化会极大影响HSV值。在程序运行时创建一个滑条动态调整HSV上下限找到当前环境下最稳定的值。OpenCV的cv2.createTrackbar可以很方便地实现。增加形态学操作强度增大腐蚀和膨胀的核大小或迭代次数可以更好地过滤噪点但可能会让目标区域变小。加入追踪预测在简单P控制的基础上加入微分D项可以抑制振荡加入积分I项可以消除静态误差。实现一个完整的PID控制器。或者使用更高级的追踪算法如OpenCV内置的cv2.TrackerKCF或cv2.TrackerCSRT它们对遮挡和形变更鲁棒。延迟太大云台反应慢降低图像处理频率如上文所述降低分辨率或跳帧。优化代码避免在循环中进行不必要的计算或内存分配。例如提前创建好核kernel和HSV转换用的空数组。检查控制周期确保你的主循环读图、处理、控制频率足够高。用time.time()测量循环一次的时间如果远低于摄像头帧率如30fps对应33ms说明处理是瓶颈。如何追踪非颜色特征形状匹配使用cv2.matchTemplate或轮廓特征如宽高比、面积、Hu矩来匹配特定形状。特征点检测使用SIFT、SURF、ORB等算法检测和匹配特征点适合追踪有纹理的物体。深度学习模型在树莓派上运行轻量级模型如MobileNet-SSD、YOLO-Tiny进行通用物体检测和追踪。这需要一定的模型部署知识但效果最好能追踪“人”、“杯子”、“狗”等语义对象。5.3 系统集成与稳定性树莓派重启或舵机乱动一定是电源问题。确保使用足额电流建议5V/3A以上的电源适配器为树莓派供电并且舵机使用独立电源。电机引起的电压骤降是树莓派不稳定的头号杀手。多线程/多进程数据不同步使用threading.Lock保护共享数据或者使用multiprocessing.Manager管理的共享变量。最简单的安全方法是使用queue.Queue传递消息它是线程安全的。开机自启动你需要让机器人上电后自动运行你的程序。可以编写一个systemd服务文件。例如创建/etc/systemd/system/pan_tilt_robot.service[Unit] DescriptionPan Tilt Robot Service Afternetwork.target [Service] Typesimple Userpi WorkingDirectory/home/pi/robot_project ExecStartPre/usr/bin/sudo /usr/bin/pigpiod # 先启动pigpio守护进程 ExecStart/usr/bin/python3 /home/pi/robot_project/main.py Restarton-failure RestartSec5 [Install] WantedBymulti-user.target然后运行sudo systemctl enable pan_tilt_robot.service启用即可。从选择零件、组装硬件到编写驱动、实现视觉算法再到集成调试、优化性能打造一个可用的树莓派机器人云台摄像头系统是一个充满挑战也极具成就感的工程实践。它几乎涵盖了嵌入式机器人开发的各个方面。最关键的是动手去做从最简单的舵机摆动开始逐步增加颜色追踪、人脸识别甚至深度学习目标检测。每解决一个实际问题你对机器人系统的理解就会加深一层。这个项目最大的魅力在于它是一个完美的起点可以由此扩展到更广阔的机器人技术世界。