准备工作:Nao开发环境
在开始编程之前,你需要准备好以下环境:
- 一台Nao机器人:最好是Nao V5或V6。
- 一台电脑:用于编写代码和控制机器人。
- 网络连接:确保你的电脑和Nao机器人在同一个局域网内。
- Naoqi SDK:这是Nao的软件开发工具包,包含了所有必要的库、文档和工具。
- 你可以从SoftBank Robotics的官方网站下载。
- 安装后,你会得到
naoqiSDK(用于C++)和pynaoqi(用于Python)。
- Python IDE:推荐使用PyCharm或VS Code,并安装
pynaoqi-python2或pynaoqi-python3包。 - Choregraphe:Nao的图形化编程软件,非常适合初学者和快速原型开发。
使用Choregraphe(图形化编程)- 让Nao说你好并挥手
这是最简单的入门实例,无需编写任何代码。
目标:当Nao被触摸头顶传感器时,它会说“你好,世界!”,然后抬起右手挥手。
步骤:
- 打开Choregraphe:在你的电脑上启动Choregraphe软件。
- 创建一个行为:在左侧的“图”视图中,你会看到一个默认的“开始”和“结束”盒子。
- 添加“说”的盒子:
- 从右侧的“盒子”库中,找到“Say”盒子,拖拽到“开始”和“结束”之间。
- 双击“Say”盒子,在弹出的窗口中输入文字:“你好,世界!”。
- 添加“挥手”的盒子:
- 从“盒子”库中,找到“Animations”或“Move”类别,找到一个“挥手”的动画(例如
animations/Stand/Greetings/Hello),拖拽到“Say”盒子的后面。
- 从“盒子”库中,找到“Animations”或“Move”类别,找到一个“挥手”的动画(例如
- 添加“触摸传感器”作为触发器:
- 从“盒子”库中,找到“Tactile”类别,找到“Head/Touch/Front”盒子(头顶传感器),拖拽到“Say”盒子的前面。
- 将“Head/Touch/Front”盒子的输出端口连接到“Say”盒子的输入端口。
- 连接和测试:
- 将所有盒子按顺序连接起来:
Head/Touch/Front->Say->Hello Animation->End。 - 点击Choregraphe工具栏上的“连接”按钮,连接到你的Nao机器人。
- 点击“模拟”或“在机器人上运行”按钮,然后去触摸Nao的头顶,它就会执行你设计的动作序列。
- 将所有盒子按顺序连接起来:
代码生成:完成这个流程图后,你可以点击“文件” -> “Python代码”,Choregraphe会自动为你生成相应的Python代码,让你了解底层逻辑。
使用Python(文本编程)- 让Nao跟随红色物体
这个实例展示了如何使用Python与Nao的传感器(摄像头)和执行器(运动)进行交互。
目标:Nao通过摄像头观察,如果视野中出现红色的物体,它会转动头部去追踪该物体。
原理:
- 从Nao的摄像头获取图像。
- 在图像上检测红色的像素点。
- 计算红色物体在图像中的中心位置。
- 根据中心位置与图像中心的偏差,控制Nao的头部转动进行追踪。
Python代码 (red_tracker.py):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import time
from naoqi import ALProxy
# Nao的IP地址,请根据你的网络修改
NAO_IP = "192.168.1.100"
class RedTracker:
def __init__(self, ip):
# 创建与Nao服务的代理
self.motionProxy = ALProxy("ALMotion", ip, 9559)
self.videoProxy = ALProxy("ALVideoDevice", ip, 9559)
self.tts = ALProxy("ALTextToSpeech", ip, 9559)
# 设置摄像头参数
self.resolution = 2 # VGA (640x480)
self.colorSpace = 13 # RGB
self.fps = 30
# 注册一个名为"python_client"的图像客户端
self.clientId = self.videoProxy.subscribeCamera("python_client", 0, self.resolution, self.colorSpace, self.fps)
# 设置头部运动的 stiffness,使其可以运动
self.motionProxy.setStiffnesses("Head", 1.0)
# 获取头部关节的名称
self.jointNames = ["HeadYaw", "HeadPitch"]
# 运行追踪
self.run()
def run(self):
print("开始追踪红色物体...")
self.tts.say("开始追踪红色物体。")
try:
while True:
# 获取一帧图像
naoImage = self.videoProxy.getImageRemote(self.clientId)
if naoImage is not None:
# 图像数据是一个一维数组,宽度,高度
imgWidth = naoImage[0]
imgHeight = naoImage[1]
imgData = naoImage[6]
# 将字节数据转换为numpy数组以便处理 (需要安装numpy库)
# 如果你没有numpy,可以用内置的array模块,但处理起来更慢
import numpy as np
img_array = np.frombuffer(imgData, dtype=np.uint8).reshape((imgHeight, imgWidth, 3))
# 检测红色 (R > G, R > B, 且 R值较高)
red_pixels = np.where(
(img_array[:, :, 0] > img_array[:, :, 1]) &
(img_array[:, :, 0] > img_array[:, :, 2]) &
(img_array[:, :, 0] > 150) # 过滤掉暗红色
)
if len(red_pixels[0]) > 0: # 如果找到了红色像素
# 计算红色区域的中心坐标
center_y = np.mean(red_pixels[0])
center_x = np.mean(red_pixels[1])
# 计算与图像中心的偏差
img_center_x = imgWidth / 2
img_center_y = imgHeight / 2
error_x = center_x - img_center_x
error_y = center_y - img_center_y
# 将像素偏差转换为头部角度 (需要校准)
# 这是一个简单的线性映射,实际中可能需要更复杂的模型
max_angle = 60.0 # 头部最大转动角度
angle_x = (error_x / img_center_x) * max_angle
angle_y = (error_y / img_center_y) * max_angle
# 限制角度范围
angle_x = max(min(angle_x, max_angle), -max_angle)
angle_y = max(min(angle_y, max_angle), -max_angle)
# 让头部转动去追踪
# 使用绝对角度,并叠加一个小的增量
current_angles = self.motionProxy.getAngles(self.jointNames, True)
target_yaw = current_angles[0] + angle_x * 0.05 # 乘以一个系数,使运动平滑
target_pitch = current_angles[1] - angle_y * 0.05 # 注意:图像Y轴与HeadPitch方向相反
self.motionProxy.setAngles(self.jointNames, [target_yaw, target_pitch], 0.1)
# 可选:在图像上画一个框
# cv2.rectangle(img_array, (int(center_x-20), int(center_y-20)), (int(center_x+20), int(center_y+20)), (0, 255, 0), 2)
# cv2.imshow('Red Tracker', img_array)
# cv2.waitKey(1)
time.sleep(0.05) # 短暂休眠,避免CPU占用过高
except KeyboardInterrupt:
print("停止追踪。")
self.tts.say("停止追踪。")
finally:
# 确保在程序结束时取消订阅摄像头和恢复头部 stiffness
self.videoProxy.unsubscribe(self.clientId)
self.motionProxy.setStiffnesses("Head", 0.0)
print("资源已释放。")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python red_tracker.py <NAO_IP>")
sys.exit(1)
tracker = RedTracker(sys.argv[1])
如何运行:
- 将上述代码保存为
red_tracker.py。 - 确保你的电脑和Nao在同一网络,并修改代码中的
NAO_IP。 - 在电脑的终端中运行:
python red_tracker.py <Nao的IP地址>。 - 拿一个红色的物体(比如红色笔、红色杯子)在Nao面前晃动,观察它的头部是否跟随。
使用Python - 自定义行为并语音交互
这个实例结合了语音识别和自定义动作,创建一个简单的交互程序。
目标:Nao待机时,如果听到“跳舞”这个词,就会播放一个跳舞动画。
步骤:
-
创建舞蹈动画(使用Choregraphe):
- 打开Choregraphe,创建一个新行为。
- 从“动画库”中拖拽几个跳舞相关的动作(例如
animations/Stand/Gestures/...)到时间线上,组合成一个简单的舞蹈序列。 - 将这个行为保存为
my_dance.choregraph,并导出为.py文件(例如my_dance.py),这个文件会包含一个Dance类。
-
编写主程序 (
dance_interaction.py):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import time
from naoqi import ALProxy
# 导入你刚才生成的舞蹈模块
# 假设 my_dance.py 和本脚本在同一目录
from my_dance import Dance
class DanceInteraction:
def __init__(self, ip):
self.tts = ALProxy("ALTextToSpeech", ip, 9559)
self.asr = ALProxy("ALSpeechRecognition", ip, 9559)
self.memory = ALProxy("ALMemory", ip, 9559)
# 初始化语音识别
self.tts.say("你好,我是Nao,我说'跳舞',我就为你跳舞。")
# 设置词汇表
vocabulary = ["跳舞", "停止"]
self.asr.setVocabulary(vocabulary, False) # False表示动态词汇表
# 创建一个舞蹈实例
self.dance_instance = Dance(ip)
# 订阅语音识别事件
self.memory.subscribeToEvent("WordRecognized", "dance_interaction.py", "onWordRecognized")
def onWordRecognized(self, key, value, message):
"""
当识别到词语时被调用的回调函数
value 是一个元组,格式为: [(word, confidence), ...]
"""
print("识别到词语:", value)
if value and value[0][0] == "跳舞" and value[0][1] > 0.5: # 置信度大于0.5
print("开始跳舞...")
self.tts.say("好的,我来跳舞!")
# 调用舞蹈模块中的方法开始跳舞
self.dance_instance.start() # 假设你的舞蹈类有一个start方法
elif value and value[0][0] == "停止" and value[0][1] > 0.5:
print("停止跳舞。")
self.tts.say("好的,我停下了。")
self.dance_instance.stop() # 假设有一个stop方法
def run(self):
print("等待指令...")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print("程序结束。")
finally:
self.memory.unsubscribeToEvent("WordRecognized", "dance_interaction.py")
self.tts.say("再见。")
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: python dance_interaction.py <NAO_IP>")
sys.exit(1)
interaction = DanceInteraction(sys.argv[1])
interaction.run()
如何运行:
- 用Choregraphe创建并导出你的舞蹈模块
my_dance.py。 - 将
my_dance.py和dance_interaction.py放在同一目录下。 - 运行主程序:
python dance_interaction.py <Nao的IP地址>。 - 对Nao说“跳舞”,它就会开始跳舞。
总结与进阶
- 基础:从 Choregraphe 开始,理解Nao的“行为”概念,学会拖拽和连接逻辑模块。
- 核心:掌握 Python 编程,这是Nao开发的主流,你需要熟悉
ALProxy来调用Nao的各种服务(运动、视觉、语音等)。 - 关键服务:
ALMotion:控制全身所有关节的运动。ALVideoDevice:获取摄像头数据。ALTextToSpeech/ALSpeechRecognition:语音输出和输入。ALMemory:Nao的“大脑”,用于存储数据和订阅/发布事件,是实现模块化交互的关键。
- 进阶方向:
- SLAM与导航:使用
ALNavigation服务,结合激光雷达和摄像头,实现自主地图构建和路径规划。 - 机器学习:将TensorFlow或PyTorch模型部署到Nao上,用于更复杂的物体识别、人脸识别或手势识别。
- ROS (Robot Operating System):对于更复杂的机器人项目,可以将Nao集成到ROS生态中,利用ROS强大的通信和工具链。
- SLAM与导航:使用
希望这些实例能帮助你开启Nao机器人的编程之旅!
标签: nao机器人编程入门教程 nao机器人编程实例零基础 nao机器人编程学习路径
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。