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

相关文章

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Spring定时任务之fixedRateString的实现示例

《Spring定时任务之fixedRateString的实现示例》本文主要介绍了Spring定时任务之fixedRateString的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录从毫秒到 Duration:为何要改变?核心:Java.time.Duration.parse

Oracle Scheduler任务故障诊断方法实战指南

《OracleScheduler任务故障诊断方法实战指南》Oracle数据库作为企业级应用中最常用的关系型数据库管理系统之一,偶尔会遇到各种故障和问题,:本文主要介绍OracleSchedul... 目录前言一、故障场景:当定时任务突然“消失”二、基础环境诊断:搭建“全局视角”1. 数据库实例与PDB状态2

使用Go调用第三方API的方法详解

《使用Go调用第三方API的方法详解》在现代应用开发中,调用第三方API是非常常见的场景,比如获取天气预报、翻译文本、发送短信等,Go作为一门高效并发的编程语言,拥有强大的标准库和丰富的第三方库,可以... 目录引言一、准备工作二、案例1:调用天气查询 API1. 注册并获取 API Key2. 代码实现3

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制