nao机器人编程实例如何入门?

99ANYc3cd6 机器人 1

准备工作:Nao开发环境

在开始编程之前,你需要准备好以下环境:

  1. 一台Nao机器人:最好是Nao V5或V6。
  2. 一台电脑:用于编写代码和控制机器人。
  3. 网络连接:确保你的电脑和Nao机器人在同一个局域网内。
  4. Naoqi SDK:这是Nao的软件开发工具包,包含了所有必要的库、文档和工具。
    • 你可以从SoftBank Robotics的官方网站下载。
    • 安装后,你会得到naoqi SDK(用于C++)和pynaoqi(用于Python)。
  5. Python IDE:推荐使用PyCharm或VS Code,并安装pynaoqi-python2pynaoqi-python3包。
  6. Choregraphe:Nao的图形化编程软件,非常适合初学者和快速原型开发。

使用Choregraphe(图形化编程)- 让Nao说你好并挥手

这是最简单的入门实例,无需编写任何代码。

目标:当Nao被触摸头顶传感器时,它会说“你好,世界!”,然后抬起右手挥手。

步骤

  1. 打开Choregraphe:在你的电脑上启动Choregraphe软件。
  2. 创建一个行为:在左侧的“图”视图中,你会看到一个默认的“开始”和“结束”盒子。
  3. 添加“说”的盒子
    • 从右侧的“盒子”库中,找到“Say”盒子,拖拽到“开始”和“结束”之间。
    • 双击“Say”盒子,在弹出的窗口中输入文字:“你好,世界!”。
  4. 添加“挥手”的盒子
    • 从“盒子”库中,找到“Animations”或“Move”类别,找到一个“挥手”的动画(例如animations/Stand/Greetings/Hello),拖拽到“Say”盒子的后面。
  5. 添加“触摸传感器”作为触发器
    • 从“盒子”库中,找到“Tactile”类别,找到“Head/Touch/Front”盒子(头顶传感器),拖拽到“Say”盒子的前面。
    • 将“Head/Touch/Front”盒子的输出端口连接到“Say”盒子的输入端口。
  6. 连接和测试
    • 将所有盒子按顺序连接起来:Head/Touch/Front -> Say -> Hello Animation -> End
    • 点击Choregraphe工具栏上的“连接”按钮,连接到你的Nao机器人。
    • 点击“模拟”或“在机器人上运行”按钮,然后去触摸Nao的头顶,它就会执行你设计的动作序列。

代码生成:完成这个流程图后,你可以点击“文件” -> “Python代码”,Choregraphe会自动为你生成相应的Python代码,让你了解底层逻辑。


使用Python(文本编程)- 让Nao跟随红色物体

这个实例展示了如何使用Python与Nao的传感器(摄像头)和执行器(运动)进行交互。

目标:Nao通过摄像头观察,如果视野中出现红色的物体,它会转动头部去追踪该物体。

原理

  1. 从Nao的摄像头获取图像。
  2. 在图像上检测红色的像素点。
  3. 计算红色物体在图像中的中心位置。
  4. 根据中心位置与图像中心的偏差,控制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])

如何运行

  1. 将上述代码保存为 red_tracker.py
  2. 确保你的电脑和Nao在同一网络,并修改代码中的 NAO_IP
  3. 在电脑的终端中运行:python red_tracker.py <Nao的IP地址>
  4. 拿一个红色的物体(比如红色笔、红色杯子)在Nao面前晃动,观察它的头部是否跟随。

使用Python - 自定义行为并语音交互

这个实例结合了语音识别和自定义动作,创建一个简单的交互程序。

目标:Nao待机时,如果听到“跳舞”这个词,就会播放一个跳舞动画。

步骤

  1. 创建舞蹈动画(使用Choregraphe)

    • 打开Choregraphe,创建一个新行为。
    • 从“动画库”中拖拽几个跳舞相关的动作(例如animations/Stand/Gestures/...)到时间线上,组合成一个简单的舞蹈序列。
    • 将这个行为保存为 my_dance.choregraph,并导出为.py文件(例如my_dance.py),这个文件会包含一个 Dance 类。
  2. 编写主程序 (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()

如何运行

  1. 用Choregraphe创建并导出你的舞蹈模块 my_dance.py
  2. my_dance.pydance_interaction.py 放在同一目录下。
  3. 运行主程序:python dance_interaction.py <Nao的IP地址>
  4. 对Nao说“跳舞”,它就会开始跳舞。

总结与进阶

  • 基础:从 Choregraphe 开始,理解Nao的“行为”概念,学会拖拽和连接逻辑模块。
  • 核心:掌握 Python 编程,这是Nao开发的主流,你需要熟悉 ALProxy 来调用Nao的各种服务(运动、视觉、语音等)。
  • 关键服务
    • ALMotion:控制全身所有关节的运动。
    • ALVideoDevice:获取摄像头数据。
    • ALTextToSpeech / ALSpeechRecognition:语音输出和输入。
    • ALMemory:Nao的“大脑”,用于存储数据和订阅/发布事件,是实现模块化交互的关键。
  • 进阶方向
    1. SLAM与导航:使用 ALNavigation 服务,结合激光雷达和摄像头,实现自主地图构建和路径规划。
    2. 机器学习:将TensorFlow或PyTorch模型部署到Nao上,用于更复杂的物体识别、人脸识别或手势识别。
    3. ROS (Robot Operating System):对于更复杂的机器人项目,可以将Nao集成到ROS生态中,利用ROS强大的通信和工具链。

希望这些实例能帮助你开启Nao机器人的编程之旅!

标签: nao机器人编程入门教程 nao机器人编程实例零基础 nao机器人编程学习路径

上一篇机器人无码下载 下载

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!