尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Yanshee机器人开发实战:从Jupyter交互调试到YanAPI工程化

发布时间:2026/9/28 23:40:41

资讯中心
01
ARTICLE

Yanshee机器人开发实战:从Jupyter交互调试到YanAPI工程化

Yanshee机器人开发实战:从Jupyter交互调试到YanAPI工程化
“Yanshee”这名字玩机器人的朋友应该不陌生。优必选出品的人形机器人自带树莓派主控、一堆传感器和开源SDK在一众教育机器人里算是很能打的。我拿到手之后的开发路径非常典型先通过SSH连上去把Jupyter Notebook跑起来一行一行写Python验证动作然后再把这些散装代码收敛成用YanAPI写的正式工程。整个过程踩了不少坑也摸清了不少门道今天完整复盘一遍希望能给正在折腾Yanshee或者类似教育机器人的朋友指个方向。这篇文章不是什么官方教程就是一份实战记录覆盖从环境搭建、Jupyter交互式调试、YanAPI核心接口调用到后期工程化迁移的完整链路。适合三类人看刚入手Yanshee的新手、给学生上机器人课的讲师、以及想把机器人能力接入自己项目里做二次开发的创客。看过之后你能避开我走过的路直接照着能用的方案操作。1. 项目整体设计与思路拆解1.1 为什么选Yanshee作为开发平台先说选型。市场上可编程人形机器人不少但能在“开源程度、可玩性、开发门槛”三者之间找到平衡的Yanshee算一个。它的硬件结构是模块化的头部、手臂、腿部、腰部都有独立关节内部主控是树莓派跑的是Linux系统这意味着你可以直接在上面装Python库、跑OpenCV甚至部署简单的深度学习模型。更重要的是Yanshee的学习路径非常平滑。工业机器人那种示教器编程学习成本高而且环境封闭一些玩具机器人又过于封闭只能调用厂商封装好的接口很难深入到底层。Yanshee中间态把握得不错Python驱动优先面向教育和开发者社区所有控制都暴露成可编程接口从简单的舵机运动到复杂的视觉识别都能做。这个平台也适合团队分工——硬件调试、算法验证、服务后端可以并行推进因为它本质就是一台带着关节和传感器的Linux电脑。不过要提醒的是教育机器人平台的定位决定了它的负载能力和精度都不如工业级设备想拿Yanshee去干产线上那种高精度搬运活不现实它的价值在于把机器人开发的完整链路跑通让每个环节的知识都能动手练到。1.2 为什么先Jupyter再YanAPI这个项目标题叫“从Jupyter到YanAPI”本质上是我实际开发路径的浓缩。为什么会有这个先后顺序因为机器人开发天然适合“交互式调试”。你要控制机器人走半米停下说一句话再转身——这种多步动作如果每改一个参数就重新部署一次完整程序效率会低到让人崩溃。Jupyter Notebook的好处在于每个Cell里的代码都可以单独执行变量可以保留输出立即可见。你可以在一个Cell里让机器人向前走下个Cell里打印当前电量再下个Cell里让机器人说话全程无需重启进程所见即所得。这在初期验证“某个API到底怎么用”“某个参数对动作幅度的影响有多大”时特别顺手。但Jupyter也有明显短板——它不适合做工程化交付。Notebook文件本质是一堆Cell的集合运行依赖顺序不容易做错误处理和模块划分也很难做成开机自启的服务。等我把机器人动作、语音、表情这套逻辑全部调通之后就发现必须把核心代码抽出来写成一个规范的Python包再通过YanAPI提供的SDK去组织整体调用。这就是“先Jupyter、后YanAPI”的完整逻辑。两者不是替代关系是不同阶段各自合适的工具。1.3 整体技术链路梳理我最后整理的项目架构大概是这样底层Yanshee机器人树莓派主控Linux系统连接层SSH远程登录局域网通信交互调试层Jupyter Notebook跑在树莓派上浏览器访问接口层YanAPI Python SDK负责运动、语音、表情等控制应用层把核心逻辑封装成Python类提供定时执行和远程触发能力这条链路每一层都有各自容易踩的坑下面几个章节我按实操顺序一个个拆开讲。2. 环境准备把Yanshee和Jupyter跑起来2.1 机器人端网络与基础环境配置拿到Yanshee的第一件事不是写代码而是让机器人“联网”。Yanshee支持两种网络模式一种是自己开热点你电脑连它的热点另一种是让机器人连你实验室或家里的Wi-Fi然后电脑和机器人走同一局域网用SSH远程操作。我更推荐后者因为热点模式下机器人的网络对外不通后面装Python包会非常难受。机器人连上Wi-Fi之后查一下它的IP地址然后SSH登录。用户名和密码一般印在机器人底部或者说明书里默认情况下是开发者账号权限。登录之后我习惯先确认几件事python3 --version pip3 --version free -h df -h这几个命令分别看Python版本、pip版本、内存和磁盘剩余空间。树莓派主控的存储不算大如果之前跑过不少示例项目磁盘可能已经满了到时候pip装包会失败所以先看一眼心里有数。必要时可以在主目录下建一个虚拟环境把开发的依赖隔离起来避免跟系统自带的包冲突。python3 -m venv ~/yanshee_env source ~/yanshee_env/bin/activate这一步建议从一开始就做。我实际开发时最开始图省事直接在系统环境里装包后来发现有的包版本冲突不得不推倒重来。虚拟环境多花一分钟后面省一个小时。2.2 Jupyter安装与Notebook基础使用在虚拟环境里装Jupyter非常直接pip install jupyter装好之后启动方式要讲究。如果直接在SSH会话里执行jupyter notebook它会尝试在弹出的浏览器里打开但树莓派本身没有图形界面就会报错或者根本没反应。正确做法是jupyter notebook --ip0.0.0.0 --port8888 --no-browser --allow-root解释一下这几个参数--ip0.0.0.0允许所有网络接口访问这样你在自己电脑浏览器里就能打开--port8888指定端口避免和其他服务冲突--no-browser不尝试在树莓派本地打开浏览器--allow-root如果你用root登录就需要加这个参数启动之后终端会打印一个带token的URL类似http://127.0.0.1:8888/?tokenxxx。你把这个IP换成树莓派的IP在自己电脑浏览器里打开就行。如果觉得每次手动敲这串命令麻烦可以把启动命令写成一个start_jupyter.sh脚本放到/usr/local/bin下面加好执行权限以后SSH进去直接运行脚本就够了。2.3 解决Jupyter打不开浏览器和自动补齐问题“Jupyter弹不出浏览器”这个问题我在社区里看到无数人问过原因基本就三类一是你在远程SSH环境里启动Jupyter它想拉起浏览器但远程环境没有图形界面。这种情况加--no-browser参数就行。二是你虽然在自己电脑上启动Jupyter操作系统没有把Jupyter生成的URL和默认浏览器正确关联。这种情况手动复制URL到浏览器地址栏即可。三是端口被占用。启动Jupyter时如果报“port 8888 is already in use”可以用--port8890换一个端口或者先看谁占了端口lsof -i :8888找到了进程确认没用了再kill掉。代码自动补齐方面Jupyter默认的补全能力比较弱但安装一个扩展就好很多。在终端执行pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user然后重启Jupyter在打开的页面里找到Nbextensions标签勾选Hinterland这样写代码时就会出现类似IDE的下拉提示手写API参数的压力小很多。至于在Notebook里写说明文档时用的Markdown目录语法其实和标准Markdown一致#、##、###对应不同级别标题Jupyter会自动渲染。唯一要注意的是Cell编辑状态下要先按Esc再按M把Cell切换成Markdown格式否则你写了#它也只是代码注释。2.4 验证Yanshee与Jupyter的连接环境准备的最后一步是确认Jupyter里能直接控制机器人。打开Notebook先跑一个最简单的导入测试import socket print(socket.gethostname())如果输出的是树莓派的主机名说明Notebook内核就跑在树莓派上可以直接操作底层硬件。到这里基础环境就OK了下面进入核心API的使用环节。3. YanAPI核心开发实操3.1 安装与初始化核心SDKYanAPI是Yanshee的官方Python SDK本质上把机器人底层通信封装成了一组Python接口你不需要关心串口协议和网络报文格式直接调方法就行。安装很普通pip install yanapi但初始化方式要看你的开发场景。我在Jupyter里调试时Notebook和机器人是同一台机器所以直接初始化本地连接from yanapi.sdk import yanapi robot yanapi.Yanapi() robot.init() print(robot connected)如果你的代码跑在局域网内的另一台电脑上比如一台性能更好的PC跑视觉算法YanAPI也支持远程连接模式初始化时传入机器人的IP即可。不同固件版本接口风格会略有差异建议在初始化之前查看当前SDK版本import yanapi print(yanapi.__version__)这里有个重要提醒跑任何初始化代码之前保证机器人处于一个安全、平稳的地面周围至少留出半米空档。机器人重新上电之后可能会执行姿态自检关节会有一小段“抽搐”这是正常现象但如果你手放在关节附近容易被夹到别问我怎么知道的。3.2 运动控制走、转、停的核心逻辑运动控制是机器人开发的必修课。Yanshee的运动接口大致分为两类一类是“动作包”就是官方预置好的一组连贯动作比如跳舞、挥手、点头另一类是“运动指令”指定距离、速度、方向让机器人执行位移。我测试时先跑的是运动指令代码大致长这样# 让机器人向前走0.5米 robot.motion.move(instructionforward, distance0.5) # 原地右转90度 robot.motion.move(instructionturn_right, angle90) # 停止 robot.motion.move(instructionstop)注意不同固件版本的参数命名可能有差异有的把instruction叫action有的把angle叫degree以你手里的版本文档为准。Jupyter调试时我习惯一跑一个Cell就观察一下机器人实际动作再调整参数。运动控制里的几个通用经验第一速度和距离尽量不要一上来就给大值。我第一次测试给了1米距离、较高速度机器人走出去大概20厘米就明显偏转差点撞到桌腿。先在0.2米、低速度下验证坐标系再逐步放大。第二人形机器人走路天然会有方向偏差因为地面平整度、关节磨损、电池电量都会影响步态。如果发现同一段指令下机器人总是偏左可以考虑在代码里做一个静态补偿比如每次前进后额外转一个固定小角度或者用陀螺仪数据做实时纠正。第三电池电量低的时候运动表现会明显变差表现为动作迟缓、单步跨度变小。开发过程中保持电量在30%以上否则你会以为是参数的问题其实是电量的问题。3.3 表情、语音与交互让人形机器人“活”起来Yanshee最有辨识度的地方是它的眼睛——那块眼部的显示屏可以显示多种表情。通过YanAPI控制表情很简单# 显示开心表情 robot.expression.show_expression(namehappy) # 显示生气表情 robot.expression.show_expression(nameangry)官方SDK自带一组表情名称如果想自定义图案可以把表情当做图片资源更新到机器人上具体依赖固件支持。这部分在课堂演示场景特别实用学生看到机器人面容变化交互感和趣味性一下就上来了。语音也是核心功能。Yanshee支持语音合成和语音识别合成本质是TTS识别本质是ASR。常用代码路径# 让机器人说一句话 robot.tts.say(你好我是Yanshee) # 设置识别语言 robot.config.set_language(languagecn) # 开始监听并获取用户说话内容 result robot.asr.get_result()实测下来Yanshee的语音识别对安静的室内环境比较友好嘈杂环境中误识别率会明显上升。做交互项目时我会先让机器人TTS说话提示“请说出你的指令”然后再开启ASR监听这样用户自然会在安静状态下说话识别率会高很多。如果要在Jupyter里验证整个交互流程推荐先写一个简单循环for i in range(3): robot.tts.say(请说出一句话) user_input robot.asr.get_result() print(识别结果:, user_input) robot.tts.say(你说的是 user_input)这样每轮循环你可以看到识别结果打印在Notebook里同时机器人用语音复述。整个链路跑通之后就能在这个基础上增加命令解析逻辑实现“听指令做动作”。3.4 从Notebook迁移到正式工程Jupyter里调通只是第一步。做正式项目时你不能要求每次执行都人工打开Notebook点一遍Cell。我的做法是把散装代码整理成结构清晰的Python工程用YanAPI封装成核心服务再设计触发方式。整理后的目录大致是这样的yanshee_demo/ ├── main.py ├── requirements.txt ├── robot_service/ │ ├── __init__.py │ ├── action.py │ ├── speech.py │ └── config.py └── logs/action.py里把运动控制封装成一个类class RobotAction: def __init__(self, api_instance): self.api api_instance def walk_forward(self, meters: float): self.api.motion.move(instructionforward, distancemeters)speech.py里把语音封装成类class RobotSpeech: def __init__(self, api_instance): self.api api_instance def greeting(self, name: str): text 你好 name 欢迎来到机器人实验室 self.api.tts.say(text)main.py统一编排from yanapi.sdk import yanapi from robot_service.action import RobotAction from robot_service.speech import RobotSpeech def main(): robot yanapi.Yanapi() robot.init() action RobotAction(robot) speech RobotSpeech(robot) speech.greeting(同学) action.walk_forward(0.3) robot.expression.show_expression(namehappy) if __name__ __main__: main()写好之后就可以做开机自启或者定时触发。我这里用的是很朴素的systemd方案写一个service文件放到/etc/systemd/system/下让机器人上电后自动运行主程序。具体文件内容视系统版本而定核心就是让python进程在后台常驻同时把日志写到文件里以防出问题排查困难。这一步做完Yanshee就不再是一个“只能在浏览器里手动操作”的玩具而是一台能自己按脚本运行的服务化机器人。4. 常见问题与排查技巧实录4.1 高频问题速查表我把这个项目过程中遇到的高频问题整理成了表格按“现象—原因—解法”三个维度给出方便你直接检索现象常见原因解决思路Jupyter启动后浏览器打不开远程环境无图形界面/端口占用加--no-browser参数换--port手动复制URLJupyter代码没有自动补全提示扩展未启用安装并启用Hinterland扩展pip安装包卡住或报网络错误网络不稳定或PyPI访问异常检查网络连通性稍后重试确认虚拟环境已激活YanAPI初始化失败机器人网络未连上/端口占用先在机器上ping机器人IP确认Wi-Fi在线机器人运动方向偏离地面不平、电量低、关节磨损换平整地面保持电量增加方向补偿语音识别结果不准确环境噪声大/麦克风位置偏移在安静环境测试调整麦克风位置提示用户靠近机器人在执行动作时卡住电量不足或关节过载立即停止检查电量空转散热后再试Cell执行超过预期时间大段阻塞式等待/网络延迟拆成多个Cell逐步执行检查是否有等待事件阻塞重启后Jupyter服务消失前台进程随SSH断开退出用nohup或者配置成systemd服务常驻这张表看起来简单但每一个条目背后都是一次真实的排障过程。说句实在话多数问题不是API用法的问题而是环境和状态的问题优先排查“电量和网络”这两项能解决一半的奇怪现象。4.2 调试机器人的三条保命经验第一任何运动测试开始前把机器人放到开阔平地并且把远程SSH终端和机器人急停开关的位置都记清楚。真出现失控时远程执行停止指令不如物理断电来得快。这条经验听起来像废话但项目现场手忙脚乱的经历会告诉你它有多重要。第二在Jupyter里做长耗时任务时尽量把任务拆小。比如要测试10组运动参数的组合效果不要写一个大循环一口气跑完而是每跑一组就打印一组结果人工确认当前状态正常再继续。机器人不比普通代码出问题就是物理碰撞时间成本和经济成本都高。第三保存好每个能正常运行的Notebook副本。调试机器人时“上一版还是好的改了一处参数就不行”的情况太常见了。我习惯按v1_ok、v2_ok这样的方式归档可运行版本改代码之前先备份当前可用的版本恢复起来非常快。4.3 日志与状态追踪技巧正式工程里一定要考虑日志。开发时Jupyter能实时看到输出但部署成服务之后输出都去了哪这就是日志系统要解决的。我用的是Python标准库的logging把不同级别的内容分开记录import logging logging.basicConfig( filename/home/pi/yanshee_demo/logs/app.log, levellogging.INFO, format%(asctime)s %(levelname)s %(message)s ) logging.info(start move: forward 0.5m) logging.error(motion error: battery low)日志文件里记录了每次动作的开始时间、参数和结果后续分析“为什么机器人这次行为异常”会非常有用。说实话机器人开发排障的难度很大一部分在于“现象不是每次都能复现”。没有日志你连异常发生时的上下文都看不到排查等于盲人摸象。4.4 环境清理与资源占用树莓派的资源有限Jupyter跑时间长了累积的内核缓存、日志文件、临时文件都会占磁盘和内存。我有一段时间做语音识别测试特别频繁隔几天就发现机器人响应变慢df -h一看磁盘快满了才意识到是日志和历史Notebook文件堆出来的。定期做一次环境清理很有必要du -sh ~/* 2/dev/null | sort -h这个命令能按占用大小排序列出主目录的内容一眼定位到哪个目录在膨胀。特别是~/.local/share/jupyter下的内核缓存、.cache/pip下的下载缓存清理一下能释放不少空间。顺带说Jupyter的trust机制偶尔也会报“未受信任的Notebook”影响不太大但如果你遇到了在终端里对文件执行信任操作就能解决。5. 项目落地与后续扩展方向5.1 用Yanshee做教学演示项目如果你和我一样需要拿Yanshee来做教学演示我强烈建议把演示流程做成“脚本化一键启动”。课堂环境不稳定因素多电量和网络随时可能出幺蛾子提前把流程固定下来能救你一次是一次的。我的演示流程是这样设计的Yanshee上电后自检通过systemd自动启动主服务然后在固定时间间隔里执行一套演示动作包——先打招呼再走一个方形路径中间穿插几个表情变化最后做一次语音交互。整个过程不需要人工干预学生看到的是“机器人自己在那完整地跑流程”老师只需要在旁边讲解。相比现场一个个Cell手动跑这种全自动演示的稳定性和观赏性都高很多。5.2 接入视觉能力和语音服务Yanshee自带摄像头这意味着可以在它身上跑OpenCV甚至人脸识别。我后期做的一个方向就是让机器人先通过视觉识别到访客再联动语音打招呼和表情展示。这种多模态交互的体验感很强但代码复杂度也会上一个台阶。建议按“摄像头出图—简单图像处理—结构化判断—联动动作”的顺序逐步叠加。语音方面如果觉得官方ASR准确率不够可以把音频采集出来转交给云端语音服务做识别再把返回的指令作为动作触发的输入。整个链路会涉及HTTP调用和音频流处理但对整体架构能力是很好的锻炼。5.3 把机器人能力包装成Web服务另一个很有意思的方向是把Yanshee改造成一台“可被远程调用的机器人服务器”。核心思路是用Flask或者FastAPI写一个轻量后端把运动、语音、表情这些能力封装成HTTP接口其他设备通过局域网请求就能控制它。比如手机浏览器上点一个按钮机器人就向前走一步网页上输入一句话机器人就说出来。这个方向把机器人开发和Web开发串了起来正好对应“全栈开发”那个搜索热词。哪怕是做一个最小demoFlask监听5000端口定义/move和/speak两个路由分别调用YanAPI的方法就已经是一套能演示的完整项目了。如果后面再往上加权限校验、对话记忆、任务队列就是从“能用”到“好用”的进阶之路。5.4 关于ROS和更复杂系统的一点想法如果Yanshee玩透了下一步可以考虑往ROS、ROS2的方向去升级。机器人开发的底层知识是通用的你在Yanshee上学到的坐标变换、运动控制、传感器数据处理在ROS架构里依然是核心内容。把Yanshee当成本地实验台在上面跑一套完整的“感知—决策—控制”闭环做完之后再迁移到实际工业场景这个学习路径我个人觉得是通的。我在实际使用中最深的一点体会是Yanshee这类教育机器人最大的价值不是“机器人本身多强”而是它把你和真实机器人之间所有的抽象层都移除掉了。在这里你可以看到关节电机的控制逻辑可以看到语音识别的返回结果可以看到每一条指令对机器人姿态的影响。这些东西在工业黑盒设备里根本不会暴露给你。最后再分享一个小技巧无论你怎么扩展保持一套能独立运行的基础脚本。每次做新功能之前先跑一遍基础脚本确认机器人和环境状态正常再开始新代码。这个习惯帮我省下了大量无意义的排障时间希望你也能用上。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。