NAO团队任务——阻塞和非阻塞调用

2023-12-27 05:20
文章标签 调用 阻塞 任务 团队 nao

本文主要是介绍NAO团队任务——阻塞和非阻塞调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NAO团队任务——阻塞和非阻塞调用

  • 机器人连接
  • 阻塞和非阻塞调用
  • 任务解析
    • 任务1.1
      • 题目:使虚拟机器人移动到正前方一米距离,并且在移动过程中每隔 0.5s 重复说一句话,说五遍,内容自定义。
      • 代码
    • 任务1.2
      • 题目:使虚拟机器人移动到右侧一米距离,并且在移动后说一句话,内容自定义。
      • 代码①
      • 代码②
  • 遇到过的BUG

机器人连接

示例:

from naoqi import ALProxy
motion = ALProxy('ALMotion', '127.0.0.1', 9559)

上述代码中,ALProxy类用于创建模块的代理对象。ALMotion是运动模块,‘127.0.0.1’, 9559分别为IP和端口号。
虚拟机器人的默认IP和端口号为’127.0.0.1’, 9559。
若是实体机器人,可以在choregrahe中查看:在这里插入图片描述
连接→连接至,就会出现窗口:在这里插入图片描述
选择固定IP地址连接时,端口号默认9559

同时,也可以选择固定端口号连接,端口号查询方法:
编辑→首选项→虚拟机器人
在这里插入图片描述
这里,端口号就是52552。

阻塞和非阻塞调用

NAOqi的方法从调用时间上看大体可以分为两类,如读传感器状态getData()方法(属于ALMemory模块)可以很快完成,而让机器人移动到某个位置的move()方法(属于ALMotion模块)要执行很长时间。在move()方法调用过程中,机器人可能还需要做其他的事,如用“眼睛”看,或者“说话”,因此,在调用move()方法时,还需要同时调用其他方法。NAOqi提供了如下两种调用方式。
(1)阻塞调用。阻塞调用是指调用结果返回之前,调用者回进入阻塞状态等待。只有在得到结果之后才会返回。也就是说,在顺序结构的程序中,只有在前一个调用结束后才能执行下一条语句。
所有的阻塞调用都可以引发异常,应该使用try-catch结构捕获异常。调用可以有返回值。
对于NAOqi任何阻塞调用方法,如果使用Proxy的post对象进行调用,将在并行线程中创建任务,这样可以同时执行后面的语句。

注:等于把阻塞调用变成了非阻塞调用。

(2)非阻塞调用。指在不能立刻得到结果之前,该方法不会阻塞当前线程,而会立刻返回。这样就可以继续执行下面的语句。

任务解析

任务1.1

题目:使虚拟机器人移动到正前方一米距离,并且在移动过程中每隔 0.5s 重复说一句话,说五遍,内容自定义。

代码

from naoqi import ALProxy
import time
motion = ALProxy("ALMotion","127.0.0.1",9559)
tts = ALProxy("ALTextToSpeech","127.0.0.1",9559)
#设定全身关节的刚度,刚度为0时关节做不了任何运动,非阻塞调用。
motion.setStiffnesses("Body",1.0)
time.sleep(1.0)
#阻塞调用方法,完成机器人行走前的准备动作。
motion.moveInit()
#moveTo()本身为阻塞调用方法,但使用post调用moveTo()方法
#将创建新的并行线程(即后面的“说话”进程)。这样就可以一边走一边说话了。
#如果用motion.moveTo(),会走完之后再说话。
motion.post.moveTo(1,0,0)
for i in range(5):tts.say("hello world")time.sleep(0.5)

任务1.2

题目:使虚拟机器人移动到右侧一米距离,并且在移动后说一句话,内容自定义。

代码①

from naoqi import ALProxy
import time
motion = ALProxy("ALMotion","127.0.0.1",9559)
tts = ALProxy("ALTextToSpeech","127.0.0.1",9559)
motion.setStiffnesses("Body",1.0)
time.sleep(1.0)
motion.moveInit()
motion.post.moveTo(0,1,0)
#等待,直到行走任务完成。用于阻塞程序向下运行直到行走任务结束
motion.waitUntilMoveIsFinished()
tts.say("I'm done")

代码②

from naoqi import ALProxy
import time
motion = ALProxy("ALMotion","127.0.0.1",9559)
tts = ALProxy("ALTextToSpeech","127.0.0.1",9559)
motion.setStiffnesses("Body",1.0)
time.sleep(1.0)
motion.moveInit()
#阻塞调用,只有在动作结束后才会进行下一步进程。
motion.moveTo(0,1,0)
tts.say("I'm done")

两种实现形式皆可。

遇到过的BUG

1.如果不将机器人停下来,就擅自关闭choregrahe程序,再次打开choregrahe,即使端口号和IP地址正确,Python依旧会报错,无法连接至机器人。
建议使用try-catch捕捉异常。

文:齐鲁工业大学 云灵未来人工智能协会 AIDC011

这篇关于NAO团队任务——阻塞和非阻塞调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542003

相关文章

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel