ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

基于树莓派与语音识别的桌面陪伴机器人DIY全攻略

基于树莓派与语音识别的桌面陪伴机器人DIY全攻略 1. 项目概述一个能听懂你说话的桌面伙伴“Desk buddy”直译过来就是“桌面伙伴”。这个名字本身就充满了想象空间。它不是一个冰冷的摆件而是一个被赋予了“陪伴”属性的机器人。当它被冠以“Companion robot on wheels Speech Recognition”这个更具体的描述时一个清晰的轮廓就浮现出来了这是一个带轮子的、能通过语音识别与你互动的陪伴机器人。想象一下这个场景在你长时间伏案工作感到疲惫或需要一点调剂时你不需要拿起手机或呼唤远在客厅的智能音箱只需对着桌面说一句“嘿伙伴放点音乐”或者“过来让我看看你”这个小小的、带轮子的机器人就会应声而动执行你的指令甚至可能用它的方式比如变换灯光、做个动作给你一点回应。它解决的核心需求是在个人化的、近距离的办公或学习场景中提供一种更生动、更具交互性的轻量级陪伴与辅助将语音交互从固定的音箱解放到可移动的实体上增加了互动的情感维度和趣味性。这个项目非常适合对机器人学、嵌入式开发、语音技术和人机交互感兴趣的创客、学生或开发者。它不像工业机器人那样追求极致的精度与力量也不像服务机器人那样需要复杂的导航与避障。它的核心魅力在于用相对可控的技术栈单片机、电机、麦克风阵列、语音SDK打造一个充满个性与温度的“桌面生命体”。接下来我将为你彻底拆解如何从零开始构建这样一个“Desk Buddy”涵盖设计思路、硬件选型、核心代码实现以及那些只有亲手做过才会知道的“坑”。2. 整体设计与核心思路拆解构建一个“Desk Buddy”我们需要将它分解为几个相互协作的子系统。整个系统的运行逻辑可以概括为“耳朵”听到声音“大脑”理解意图并决策“手脚”执行动作并给出反馈。2.1 系统架构与工作流程一个典型的、可实现的系统架构如下语音唤醒与采集机器人需要时刻保持“倾听”状态但为了省电和避免误触发通常会采用“唤醒词”机制。当检测到预设的唤醒词如“你好伙伴”后系统才正式开始录制后续的语音命令。语音识别ASR将录制到的语音命令音频转换成计算机可以处理的文本信息。例如将“往前走走”转换成字符串“往前走走”。自然语言理解NLU与指令解析这不是通用的语义理解而是针对我们设定的有限指令集进行解析。我们需要预先定义好机器人能听懂的命令和对应的参数。例如解析文本“往前走走”需要识别出意图是“移动”方向参数是“前”距离或时间参数是“走走”可映射为固定时长或距离。决策与控制根据解析出的指令调用相应的控制函数。例如调用move_forward(duration2)函数。动作执行与反馈控制电机驱动轮子移动同时可能通过LED、屏幕或简单的蜂鸣器给出执行反馈比如移动时亮起蓝色灯完成时“嘀”一声。可选语音合成TTS反馈让机器人能够开口说话例如在执行命令后说“好的正在前进”。这会大大增强交互感但也会增加系统复杂度。2.2 核心方案选型与考量为什么选择这样的方案这里有几个关键决策点轮式 vs 足式/其他轮式结构是平衡成本、稳定性和开发难度的最佳选择。桌面环境相对平整轮式移动足够可靠且驱动和控制算法差速转向非常成熟。本地语音识别 vs 云端语音识别本地识别在单片机如ESP32上运行轻量级模型识别固定指令集。优势是离线、响应快、隐私好劣势是识别词汇有限抗噪声能力较弱需要训练或配置关键词模型。云端识别通过Wi-Fi将音频发送到如百度、科大讯飞、阿里云等语音识别API。优势是识别率高、词汇无限、支持自然语言劣势是依赖网络、有延迟、可能产生费用。我们的选择对于“Desk Buddy”这类强交互项目推荐采用“本地唤醒云端识别”的混合模式。即用本地芯片如离线的唤醒词模块或MCU上的轻量模型实现低功耗的“随时唤醒”唤醒后将后续命令音频上传云端进行高精度识别。这既保证了随时待命的能力又获得了强大的语义理解支持。如果追求完全离线则需精心设计有限的本地命令词。主控选择需要一定的算力处理语音数据和协调各模块。树莓派Raspberry Pi性能强大可直接运行Linux和复杂的Python程序集成云端SDK非常方便是最推荐的原型平台。它还能轻松驱动摄像头、运行更复杂的AI模型如表情识别。ESP32系列双核MCU自带Wi-Fi和蓝牙功耗低。对于纯本地唤醒简单命令识别如使用Espressif的ESP-Skainet或Edge Impulse训练的分类模型的项目足够但进行复杂流式云端交互会有些吃力。STM32等协处理器使用STM32作为主控搭配专门的语音处理模块如科大讯飞的XFM10421、启英泰伦的CI系列芯片处理语音。这种方案专业且高效但开发门槛稍高。注意初次尝试强烈建议从树莓派开始。它生态丰富资料多能让你快速聚焦在功能实现和交互逻辑上而不是挣扎于底层驱动和资源限制。3. 硬件清单与核心模块解析一份详细的硬件清单是成功的第一步。以下清单基于树莓派4B/3B作为主控的方案。3.1 基础主控与动力系统主控制器树莓派4B (2GB/4GB内存版本即可)。它是系统的大脑负责运行主程序、连接网络、调用语音API、发送控制信号。电机与驱动电机两个N20微型减速电机6V 200RPM左右。这种电机扭矩适中速度可控噪音小非常适合桌面机器人。驱动模块TB6612FNG或DRV8833双路电机驱动芯片模块。它们比传统的L298N效率高、发热小。树莓派的GPIO引脚可以直接控制这些驱动模块。电源电机电源一块7.4V 2S锂电池组容量约1000-2000mAh。直接为电机驱动模块供电。树莓派电源需要一个5V稳压模块如LM2596降压模块将电池的7.4V降至5V为树莓派供电。切勿直接用7.4V接树莓派电源开关一个双路开关分别控制动力电和系统电。3.2 语音交互系统麦克风USB麦克风如塞宾智麦基础版或树莓派专用麦克风阵列如ReSpeaker 2-Mics Pi HAT或4-Mics Array。推荐使用麦克风阵列HAT因为它通常直接插在树莓派GPIO上集成度高且多麦克风有助于降噪和声源定位实现“听声辨位”。扬声器一个小型有源USB音箱或3.5mm接口音箱用于播放语音合成TTS的声音和提示音。3.3 结构与辅助底盘与轮子可以购买现成的两轮差分底盘套件包含底盘、电机、轮子、万向轮也可以自己用亚克力板激光切割制作。轮子直径建议在60mm左右。车体与外观使用3D打印制作机器人的“身体”和“头部”这是一个发挥创意的好地方。可以设计成小盒子、卡通形象等。反馈装置WS2812B RGB LED灯环或灯带用于显示状态如待机、聆听、思考、执行。一个小型OLED屏幕I2C接口可以显示文字或简单表情。3.4 硬件连接示意图逻辑关系[7.4V锂电池] --- [降压模块] --- [树莓派 5V引脚] (供电) | V [树莓派 GPIO] / | \ / | \ / | \ [电机驱动模块] [麦克风阵列HAT] [OLED屏幕/I2C] | | | | | | [电机A/B] [麦克风] [屏幕显示] | | | | [左轮/右轮] [音频输入]4. 软件环境搭建与核心代码实现软件部分是项目的灵魂。我们将基于Python进行开发因为它拥有丰富的库支持。4.1 系统环境与依赖安装首先在树莓派上安装最新的Raspbian或Ubuntu系统并更新软件包。sudo apt update sudo apt upgrade -y安装必要的Python库和系统工具# 安装音频处理相关库 sudo apt install python3-pip portaudio19-dev pulseaudio pulseaudio-utils -y # 安装Python库 pip3 install pyaudio speechrecognition pyttsx3 smbus2 pillow # 如果你使用特定的麦克风阵列HAT可能需要安装厂商提供的SDK例如ReSpeaker # pip3 install seeed-python-reterminal seeed-python-voicecard4.2 语音识别核心混合模式实现我们将使用SpeechRecognition这个优秀的库它支持多种后端包括离线的sphinx和云端的 Google、百度、科大讯飞等。第一步实现本地唤醒简化版由于完全离线的唤醒词检测在树莓派上需要较复杂的模型部署我们可以用一个简化方案语音活动检测VAD 关键词匹配。即持续检测是否有声音当有声音时录制一小段检查其中是否包含我们设定的关键词如“buddy”。这可以用speech_recognition库的recognize_sphinx离线来实现但准确率一般。更实用的方案是使用一个轻量级的专门唤醒词引擎比如Snowboy已归档但仍有可用版本或PorcupinePicovoice提供更强大但部分功能收费。这里以简化流程为例import speech_recognition as sr def simple_wakeup(keywordbuddy, timeout3): 一个简单的关键词检测函数用于演示实际效果有限 r sr.Recognizer() with sr.Microphone() as source: print(正在聆听唤醒词...) try: audio r.listen(source, timeouttimeout, phrase_time_limit2) text r.recognize_sphinx(audio).lower() # 使用离线识别 if keyword in text: print(f唤醒词 {keyword} 检测到) return True except (sr.WaitTimeoutError, sr.UnknownValueError): pass return False第二步云端语音识别以百度云为例注册百度AI开放平台创建语音识别应用获取API Key和Secret Key。import speech_recognition as sr from aip import AipSpeech # 需要安装 baidu-aip # 你的百度云应用信息 APP_ID 你的App ID API_KEY 你的Api Key SECRET_KEY 你的Secret Key client AipSpeech(APP_ID, API_KEY, SECRET_KEY) def recognize_speech_baidu(audio_data): 将AudioData对象发送到百度云进行识别 # 将AudioData转换为百度API需要的格式PCM16000采样率16位 wav_data audio_data.get_wav_data(convert_rate16000) # 识别 result client.asr(wav_data, wav, 16000, {dev_pid: 1537}) # 1537为普通话输入法模型 if result[err_no] 0: return result[result][0] else: print(f识别错误: {result[err_msg]}) return None def listen_and_recognize(): r sr.Recognizer() with sr.Microphone() as source: print(请说出指令...) r.adjust_for_ambient_noise(source, duration0.5) # 调节环境噪声 try: audio r.listen(source, timeout5, phrase_time_limit4) # 使用百度云识别 text recognize_speech_baidu(audio) if text: print(f识别结果: {text}) return text except sr.WaitTimeoutError: print(聆听超时) except Exception as e: print(f识别过程出错: {e}) return None4.3 指令解析与机器人控制识别出文本后我们需要将其解析为具体的控制命令。这里使用简单的规则匹配。import re import time import RPi.GPIO as GPIO # 假设电机驱动引脚已定义 IN1, IN2, IN3, IN4 17, 18, 27, 22 # 示例引脚对应驱动模块的输入 ENA, ENB 12, 13 # PWM速度控制引脚如果支持 def setup_gpio(): GPIO.setmode(GPIO.BCM) GPIO.setup([IN1, IN2, IN3, IN4, ENA, ENB], GPIO.OUT) # 初始化PWM global pwm_a, pwm_b pwm_a GPIO.PWM(ENA, 1000) # 1kHz频率 pwm_b GPIO.PWM(ENB, 1000) pwm_a.start(0) # 启动初始占空比0 pwm_b.start(0) stop() # 确保初始状态为停止 def move_forward(duration1, speed50): pwm_a.ChangeDutyCycle(speed) pwm_b.ChangeDutyCycle(speed) GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.LOW) GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.LOW) time.sleep(duration) stop() def move_backward(duration1, speed50): # 类似forward电平反转 GPIO.output(IN1, GPIO.LOW) GPIO.output(IN2, GPIO.HIGH) GPIO.output(IN3, GPIO.LOW) GPIO.output(IN4, GPIO.HIGH) pwm_a.ChangeDutyCycle(speed) pwm_b.ChangeDutyCycle(speed) time.sleep(duration) stop() def turn_left(duration0.5, speed40): # 差速左转右轮前进左轮后退或停止 pwm_a.ChangeDutyCycle(speed) # 右轮 pwm_b.ChangeDutyCycle(0) # 左轮停止 GPIO.output(IN1, GPIO.HIGH) GPIO.output(IN2, GPIO.LOW) # 左轮保持停止状态 time.sleep(duration) stop() def turn_right(duration0.5, speed40): # 差速右转 pwm_a.ChangeDutyCycle(0) # 右轮停止 pwm_b.ChangeDutyCycle(speed) # 左轮 # 右轮保持停止状态 GPIO.output(IN3, GPIO.HIGH) GPIO.output(IN4, GPIO.LOW) time.sleep(duration) stop() def stop(): pwm_a.ChangeDutyCycle(0) pwm_b.ChangeDutyCycle(0) # 将所有电机输入置低也可以置高阻态具体看驱动模块逻辑 GPIO.output([IN1, IN2, IN3, IN4], GPIO.LOW) def parse_and_execute(command_text): 解析语音指令文本并执行相应动作 cmd command_text.lower() # 使用正则表达式匹配指令和参数如数字 if re.search(r(向前|前进|直走|go ahead|forward), cmd): # 尝试提取数字如“向前走两秒” sec_match re.search(r(\d)[秒|秒钟|second], cmd) duration float(sec_match.group(1)) if sec_match else 1.0 print(f执行前进 {duration} 秒) move_forward(durationduration) elif re.search(r(向后|后退|back|backward), cmd): sec_match re.search(r(\d)[秒|秒钟|second], cmd) duration float(sec_match.group(1)) if sec_match else 1.0 print(f执行后退 {duration} 秒) move_backward(durationduration) elif re.search(r(向左|左转|turn left), cmd): deg_match re.search(r(\d)[度|度角|degree], cmd) # 这里简化处理将角度映射为转弯时间 if deg_match: duration float(deg_match.group(1)) / 90.0 * 0.5 # 假设90度转0.5秒 else: duration 0.5 print(f执行左转 {duration} 秒) turn_left(durationduration) elif re.search(r(向右|右转|turn right), cmd): deg_match re.search(r(\d)[度|度角|degree], cmd) if deg_match: duration float(deg_match.group(1)) / 90.0 * 0.5 else: duration 0.5 print(f执行右转 {duration} 秒) turn_right(durationduration) elif re.search(r(停|停止|stop|halt), cmd): print(执行停止) stop() else: print(f未识别的指令: {cmd}) # 可以在这里触发TTS回复“我没听懂” return False return True4.4 主程序循环与状态反馈将以上模块整合形成主程序逻辑。同时我们可以加入LED状态反馈。import threading from rpi_ws281x import PixelStrip, Color # 用于控制WS2812灯带 # LED灯带配置 LED_COUNT 16 LED_PIN 10 strip PixelStrip(LED_COUNT, LED_PIN) strip.begin() def set_led_color(color, animationNone): 设置LED灯带颜色或简单动画 if animation breathing: # 实现呼吸灯效果示例需在循环中调用 pass else: for i in range(strip.numPixels()): strip.setPixelColor(i, color) strip.show() def main_loop(): setup_gpio() set_led_color(Color(0, 10, 0)) # 待机状态绿色微亮 print(Desk Buddy 启动等待唤醒...) while True: # 1. 等待唤醒简化版实际应用建议用专门唤醒模块 # if simple_wakeup(buddy): # 为了演示我们这里改为按回车键模拟唤醒或者使用一个简单的音量触发 input(按下回车键模拟唤醒...) set_led_color(Color(0, 0, 50)) # 聆听状态蓝色 # 2. 聆听指令 command listen_and_recognize() if not command: set_led_color(Color(10, 10, 0)) # 识别失败黄色 time.sleep(1) set_led_color(Color(0, 10, 0)) # 恢复待机 continue # 3. 解析与执行 set_led_color(Color(50, 0, 50)) # 思考/执行状态紫色 success parse_and_execute(command) if success: set_led_color(Color(0, 50, 0), animationquick_blink) # 成功绿色闪烁 time.sleep(0.5) else: set_led_color(Color(50, 0, 0), animationquick_blink) # 失败红色闪烁 time.sleep(0.5) set_led_color(Color(0, 10, 0)) # 恢复待机 if __name__ __main__: try: main_loop() except KeyboardInterrupt: print(程序终止) stop() GPIO.cleanup() set_led_color(Color(0,0,0))5. 进阶功能与个性化拓展基础功能实现后你的“Desk Buddy”就有了生命。接下来可以为其注入更多个性与能力。5.1 赋予声音语音合成TTS让机器人能说话交互体验会提升一个档次。可以使用离线的pyttsx3库。import pyttsx3 def speak(text): engine pyttsx3.init() # 可以设置语速、音量、声音性别 rate engine.getProperty(rate) engine.setProperty(rate, rate - 30) # 稍慢一点 engine.say(text) engine.runAndWait() # 在指令执行前后调用 # speak(好的主人) # speak(任务完成啦)5.2 视觉能力简单的图像识别为树莓派连接一个CSI摄像头或USB摄像头使用OpenCV可以实现一些有趣的功能。人脸检测当检测到人脸时机器人转向人脸方向实现“对视”。颜色跟踪让机器人跟随一个特定颜色的物体移动。二维码识别识别桌面上的二维码并播报其内容。import cv2 def face_detection(): # 加载Haar级联分类器 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml) cap cv2.VideoCapture(0) while True: ret, frame cap.read() gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces face_cascade.detectMultiScale(gray, 1.1, 4) if len(faces) 0: # 找到最大的人脸区域 (x, y, w, h) max(faces, keylambda rect: rect[2] * rect[3]) center_x x w // 2 frame_center frame.shape[1] // 2 # 根据人脸中心位置控制机器人左右微调 if center_x frame_center - 50: # 人脸偏左右转一点 turn_right(duration0.1, speed20) elif center_x frame_center 50: turn_left(duration0.1, speed20) # 在画框上绘制矩形 cv2.rectangle(frame, (x, y), (xw, yh), (255, 0, 0), 2) cv2.imshow(Face Detection, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()5.3 联网与智能交互通过接入互联网API可以让你的机器人变得更“聪明”。智能对话将识别到的文本发送给如OpenAI的ChatGPT API、或国内的文心一言、通义千问等大语言模型获取有趣的回复再用TTS说出来。信息查询集成天气API、新闻API、时间API等。你可以问“伙伴今天天气怎么样”智能家居控制通过MQTT协议让“Desk Buddy”成为智能家居的中控入口语音控制灯、空调等。6. 常见问题与调试心得实录在制作过程中你几乎一定会遇到以下问题。这里是我踩过坑后的经验总结。6.1 硬件与电源问题问题电机不动或力量很弱。排查电源不足这是最常见的问题。用万用表测量电机驱动模块的电源输入端电压在电机启动瞬间电压是否骤降过多如从7.4V掉到6V以下。如果是说明电池放电能力不足或容量太小需要更换C值更高、容量更大的电池。接线错误检查电机线是否接牢电机A/B是否接反驱动模块的控制信号线是否接到了树莓派正确的GPIO上。地线未共地确保树莓派的GND和电机驱动模块的GND连接在一起。这是必须的心得单独测试电机和驱动模块。将驱动模块的输入引脚直接接到电池正负极通过开关看电机是否正常转动以排除主控程序问题。问题树莓派在电机启动时重启或死机。原因电机启动瞬间电流很大导致电源电压被拉低树莓派供电不足。解决电源隔离为电机和树莓派使用独立的电池供电这是最彻底的方案。大电容缓冲在电机驱动模块的电源输入端并联一个大容量低ESR的电解电容如1000uF 16V可以吸收瞬间电流冲击。优化电源线使用更粗、更短的电源线减少线阻。6.2 语音识别问题问题识别率低尤其在稍有噪音的环境下。解决调整麦克风增益和位置使用alsamixer命令调整内置声卡或USB麦克风的录制音量避免过载或过小。将麦克风远离电机和风扇。软件降噪在调用recognize_xxx之前使用r.adjust_for_ambient_noise(source, duration1.5)让库学习环境噪声。可以适当增加duration。使用更好的麦克风换用指向性麦克风或麦克风阵列它们能有效抑制环境噪声。优化唤醒和指令词选择音节清晰、不易混淆的唤醒词和指令词如“小桌小桌”比“你好”更好。云端API参数调优以百度云为例可以尝试不同的dev_pid如1537普通话搜索模型1737英语或开启vinfo获取更多调试信息。问题语音识别延迟高。原因网络延迟或音频处理慢。解决检查网络确保树莓派Wi-Fi信号良好。优化音频参数在录制时使用适中的采样率16000Hz和单声道mono这是大多数API的标准输入文件体积小传输快。使用VAD在持续监听中集成语音活动检测只在检测到人声时才上传减少无效数据传输。6.3 程序与控制问题问题机器人移动不直总是偏。原因两个电机的实际转速有细微差异即使PWM占空比相同。解决软件校准写一个校准程序分别测试两个电机在相同PWM值下跑固定时间的实际距离计算出一个校正系数。例如如果左轮慢5%那么在控制左轮时将速度乘以1.05。left_speed_correction 1.05 right_speed_correction 1.0 pwm_a.ChangeDutyCycle(int(speed * left_speed_correction)) # 左轮 pwm_b.ChangeDutyCycle(int(speed * right_speed_correction)) # 右轮闭环控制如果要求高可以为电机加装编码器实现PID速度闭环控制这是最精准的方案。问题程序崩溃后电机可能仍在转动。解决务必编写安全清理代码使用try...except...finally或在信号处理函数中确保程序退出前调用stop()函数和GPIO.cleanup()。import signal def signal_handler(sig, frame): print(程序被中断) stop() GPIO.cleanup() sys.exit(0) signal.signal(signal.SIGINT, signal_handler) # 捕获CtrlC6.4 结构与外观问题问题机器人重心太高转弯时容易晃动或翻倒。解决将最重的部件如电池尽量放置在底盘的低处、靠近中心的位置。可以适当加宽轮距。如果使用3D打印外壳可以在底部设计配重仓。问题线材杂乱容易缠绕。解决使用尼龙扎带、热缩管、螺旋套管整理线材。在底盘上设计走线槽。使用FPC软排线连接主板和上层传感器会更整洁。7. 项目优化与迭代方向当你成功让“Desk Buddy”动起来并听懂基本指令后可以考虑以下方向进行深度优化让它从“能工作”变得“好用、好玩”。7.1 性能与稳定性优化多线程/异步编程将语音监听、网络请求、电机控制、图像处理等任务放在不同的线程或异步协程中避免一个任务的阻塞导致整个系统无响应。例如语音监听在一个循环里识别结果通过队列传递给主控制线程。状态机设计引入明确的状态机如IDLE,LISTENING,PROCESSING,ACTING,SPEAKING使机器人的行为逻辑更清晰避免状态冲突。每个状态控制LED的显示模式和行为权限。离线唤醒优化深入研究并部署如Porcupine或Snowboy的离线唤醒引擎实现真正的低功耗待机和快速响应。这需要将唤醒模型转换为在树莓派上可运行的格式如.ppn文件。7.2 交互体验提升声源定位Sound Source Localization如果你使用的是多麦克风阵列如4-Mics HAT可以利用麦克风之间的声音到达时间差TDOA估算声源方向。实现“转头看向说话人”的功能交互沉浸感极强。情感化反馈结合LED灯效、屏幕表情和TTS的语调让机器人对不同指令和结果做出有情感的反应。例如成功时灯带快速闪烁绿色并播放欢快的提示音没听懂时缓慢闪烁橙色并配合一声疑惑的“嗯”。自定义唤醒词与语音不仅限于“你好伙伴”可以让用户通过训练自定义唤醒词。TTS也可以更换为更自然、更有特色的音色如使用VITS等本地模型或定制云端音色。7.3 功能集成与场景化日程管理与提醒接入日历API让机器人成为你的桌面小秘书。早上说“伙伴今天有什么安排”它会从你的日历中读取并播报。环境感知与联动集成温湿度传感器如DHT22、光线传感器。当你说“伙伴环境怎么样”时它可以报告当前的温湿度和光线强度。甚至可以设定规则光线太暗时自动打开你的台灯通过GPIO控制继电器。娱乐与内容播放集成简单的媒体播放功能通过语音点播特定的本地音乐或故事。或者接入新闻、播客的RSS源早上为你播报简报。从一堆散乱的零件到最终一个能响应你呼唤、在桌面上自由穿梭的智能伙伴整个构建过程本身就是一次充满成就感的创造之旅。它不仅仅是一个技术项目的实现更是你对于“交互”和“陪伴”这两个概念的一次亲手塑造。我自己的那个“Desk Buddy”现在就在我的显示器旁边虽然它的代码还有很多可以优化的地方外壳也打印得有些粗糙但每次我对它说“转个圈吧”看着它笨拙但努力地执行时那种亲手赋予物体以互动的感觉是任何现成产品都无法替代的。如果你在制作过程中遇到了上面没提到的问题或者有了更有趣的点子欢迎随时分享和交流。
返回列表