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团队任务——阻塞和非阻塞调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_52848957/article/details/114258424
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/542003

相关文章

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir