NAO机器人——运动控制(2)
目录
一、关节控制方法
1.1 控制关节
1.2 定时插值
1.3 反应控制
1.4 读关节角度
一、关节控制方法
关节控制通常要经历多个ALMotion周期(20ms)。为使关节平稳转动,每隔20ms,API需要重新计算电机电流和刚度变化。
控制关节或关节组有两种方式:
(1)插值方法,阻塞调用,类似于动画,在起始位置和终止位置间定时插入若干中间值。
(2)反应式方法,非阻塞调用,通常在反应控制中多次调用。例如在头部跟踪时,NAO可能得到一组相互矛盾的命令序列(如前一个命令是头部左转,后一个命令是右转),调用反应式方法可以保证运动平滑且速度连续。
方法名 |
说明 |
调用方式 |
angleInterpolation (names, angleLists, timeLists, isAbsolute) |
插值运动。names 是关节名称;angleLists是角度、角度列表或二维角度列表,单位为弧度;timeLists是为达到目标角度的时间、时间列表或二维时间列表;isAbsolute为True,代表绝对角度,为False,代表相对角度。 |
阻塞调用 |
angleInterpolationWithSpeed(names, targetAngles, maxSpeedFraction) |
插值运动(带速度限制)。names是关节名称;targetAngles为弧度表示的角度或角度列表,maxSpeedFraction为最大速度百分比 |
阻塞调用 |
angleInterpolationBezier(jointNames, times,controlPoints) |
贝塞尔角度插值。jointNames为关节名称列表,times为时间列表,controlPoints为控制点列表 |
阻塞调用 |
setAngles(names,angles, fractionMaxSpeed) |
设置关节角度。names是关节名称;angles为一个或多个角度;maxSpeedFraction为最大速度百分比 |
非阻塞调用 |
changeAngles(names,angles, fractionMaxSpeed) |
改变关节角度。names是关节名称;angles为一个或多个角度;maxSpeedFraction为最大速度百分比 |
非阻塞调用 |
getAngles(names, useSensors) |
获取关节角度。names为关节名;useSensors为True返回关节传感器角度,为False返回执行器角度 |
|
closeHand(handName) |
合上手掌。handName取值:LHand,RHand |
阻塞调用 |
openHand(handName) |
张开手掌。handName取值:LHand,RHand |
阻塞调用 |
1.1 控制关节
需要给出关节名称、以弧度为单位的目标角度和转到目标角度的速度。
almath是NAOqi系统提供的数学函数库,almath.TO_RAD为1度所对应的弧度数,在关节控制方法中,目标角度都以弧度为单位,本例及以后示例中,目标角度都用角度*1度对应弧度数形式表示。 setAngles()方法为非阻塞调用方法,本例中转头动作后面的语句将头部刚度设置为0,因此调用setAngles()方法时需要使用延时。
# 头部关节运动(头部左转30度)
import time
import almath
class MyClass(GeneratedClass):def __init__(self):GeneratedClass.__init__(self)self.motion=ALProxy("ALMotion")def onLoad(self):passdef onUnload(self):passdef onInput_onStart(self):self.motion.setStiffnesses("Head", 1.0)names = "HeadYaw"angles = 30.0*almath.TO_RADfractionMaxSpeed = 0.1 # HeadYaw joint at 10% max speedself.motion.setAngles(names,angles,fractionMaxSpeed)time.sleep(3.0)self.motion.setStiffnesses("Head", 0.0)passdef onInput_onStop(self):self.onUnload()self.onStopped()
1.2 定时插值
如果关节运动的轨迹是已知的,angleInterpolation()[阻塞调用]和angleInterpolationWithSpeed()方法可以在每个ALMotion周期中重新计算执行器(电机)参数,控制关节运动速度,使机器人运动平稳。关节插值运动方法可以对一个关节或多个关节指定运动角度,也可以指定角度序列及完成这些动作的时间序列。
# 头部插值运动
import almath
import timeclass MyClass(GeneratedClass):def __init__(self):GeneratedClass.__init__(self)self.motion=ALProxy("ALMotion")def onLoad(self):passdef onUnload(self):passdef onInput_onStart(self):self.motion.setStiffnesses("Head", 1.0)names = "HeadYaw"angleLists = 50.0*almath.TO_RADtimeLists = 1.0isAbsolute = Trueself.motion.angleInterpolation(names, angleLists, timeLists, isAbsolute)time.sleep(1.0)names= "HeadYaw"angleLists = [30.0*almath.TO_RAD, 0.0]timeLists = [1.0, 2.0]isAbsolute = Trueself.motion.angleInterpolation(names, angleLists, timeLists, isAbsolute)time.sleep(1.0)names = ["HeadYaw", "HeadPitch"]angleLists = [30.0*almath.TO_RAD, 30.0*almath.TO_RAD]timeLists = [1.0, 1.2]isAbsolute = Trueself.motion.angleInterpolation(names, angleLists, timeLists, isAbsolute)names = ["HeadYaw","HeadPitch"]angleLists=[[50.0*almath.TO_RAD, 0.0],[-30.0*almath.TO_RAD, 30.0*almath.TO_RAD, 0.0]]timeLists=[[1.0, 2.0], [ 1.0, 2.0, 3.0]]isAbsolute=Trueself.motion.angleInterpolation(names, angleLists, timeLists, isAbsolute)self.motion.setStiffnesses("Head", 0.0)passdef onInput_onStop(self):self.onUnload() self.onStopped()
1.3 反应控制
setAngles() 和changeAngles()方法为非阻塞调用方法,经常用于关节反应式控制,在前一个调用未完成前,可以执行下一个调用。
# 反应控制
import timeclass MyClass(GeneratedClass):def __init__(self):GeneratedClass.__init__(self)self.motion=ALProxy("ALMotion")def onLoad(self):passdef onUnload(self):passdef onInput_onStart(self):self.motion.setStiffnesses("Head", 1.0)names = "HeadYaw"angles = 0.3fractionMaxSpeed = 0.1self.motion.setAngles(names,angles,fractionMaxSpeed) time.sleep(0.5) # wait half a second angles = 0.0 # change targetself.motion.setAngles(names,angles,fractionMaxSpeed) time.sleep(0.5) # wait half a second angles = 0.1 # change targetself.motion.setAngles(names,angles,fractionMaxSpeed)time.sleep(3.0)self.motion.setStiffnesses("Head", 0.0)passdef onInput_onStop(self):self.onUnload()self.onStopped()
1.4 读关节角度
关节控制是通过调用API方法,将关节控制命令发送给相应的执行器(电机)完成的。命令执行完成后,关节角度应该与发给执行器的命令相一致(实际的机械结构执行过程中可能存在微小误差)。NAO在每个关节上安装了位置传感器测量关节角度。getAngles()方法即可以读取执行器角度,也可以读取传感器角度。
# 获取关节角度
import time
class MyClass(GeneratedClass):def __init__(self):GeneratedClass.__init__(self)self.motion=ALProxy("ALMotion")def onLoad(self):passdef onUnload(self):passdef onInput_onStop(self):self.onUnload() self.onStopped() def onInput_onStart(self):self.motion.setStiffnesses("Head", 1.0)names = "HeadYaw"angles = 0.3fractionMaxSpeed = 0.8self.motion.setAngles(names,angles,fractionMaxSpeed) time.sleep(1.5) names = "Head" #包括HeadYaw和HeadPitchuseSensors = FalsecommandAngles = self.motion.getAngles(names, useSensors) #读取执行器角度self.logger.info("Command angles:")self.logger.info(str(commandAngles))useSensors = TruesensorAngles = self.motion.getAngles(names, useSensors) #读取传感器角度self.logger.info("Sensor angles:")self.logger.info(str(sensorAngles))errors = []for i in range(0, len(commandAngles)):errors.append(commandAngles[i]-sensorAngles[i])self.logger.info("Errors")self.logger.info(errors)pass
NAO机器人——运动控制(2)相关推荐
- NAO机器人——运动控制(1)
目录 ALRobotPosture Motion 肩关节: 髋关节: 腿关节: 刚度设置1: 刚度设置2: 关节位置参考:NAO团队任务--运动控制(1)_云灵小镇的博客-CSDN博客 ALRobot ...
- NAO机器人——运动控制(3)
目录 一.关节运动与身体平衡 1.1 moveTo 1.2 move 1.3 moveToward 一.关节运动与身体平衡 步频:步数/秒 当关节运动时,机器人的重心会发生变化,严重时机器人会摔倒.为 ...
- 《NAO机器人程序设计》---第四章 运动控制
<NAO机器人程序设计>-第四章 运动控制 Nao机器人-Choregraphe 关节名 机器人边走边说话 moveInit():运动进程的初始化,检查机器人的当前状态,并选择一个正确的姿 ...
- [行业调研]NAO机器人相关
################## NAO机器人 ################## NAO机器人是Aldebaran Robotics公司研制的一款人工智能机器人.Nao是在学术领域世界范围内运 ...
- OpenCV NAO机器人辅助捡球丢球
文章目录 1. 概述 2. 相关技术 2.1 NAO机器人 2.2 Choregraphe 2.3 OpenCV 3. 总体设计与详细设计 3.1 系统模块划分 3.2 主要功能模块 4 遇到的问题 ...
- python控制nao机器人_python控制nao机器人身体动作实例详解
本文实例为大家分享了python控制nao机器人身体动作的具体代码,供大家参考,具体内容如下 今天读的代码,顺便写了出来,与文档的对比,差不多. import sys import motion im ...
- nao机器人行走速度_数计学院学子在2020世界机器人大赛总决赛中荣获佳绩!
12月3日至6日,2020世界机器人大赛总决赛在佛山潭州国际会展中心举行.由武汉纺织大学数学与计算机学院何儒汉教授指导,杨皓然.成振瑞.李幸阜.伏嘉豪.李创等5名本科生同学组成的参赛团队荣获 2020 ...
- 机器人运动控制-水下机器人
文章目录 1背景 2PCE体系结构 3感知层 3.1水下机器人动力学模型 3.2目标指令理解 4控制层 4.1神经网络搭建 5水下机器人执行层技术 6水下机器人运动控制系统 1背景 水下机器人运动控制 ...
- Nao机器人运行B-human代码之开始篇 1
申明:既然在网上有介绍安装B-human软件的,我就不写了,在此转载.原文地址:http://www.cnblogs.com/followyourheart/archive/2012/03/12/B- ...
最新文章
- Android 10 新增的功能
- 【POJ1113】Wall(凸包)
- 【Java并发编程】—–“J.U.C”:ConcurrentLinkedQueue
- 解决python安装第三方库速度很慢的问题(opencv为例)
- MySQL性能调优的14板斧
- java ftp 关闭连接_java - 使用Java Apache FTPClient进行FTP TLS获取“握手时远程主机关闭连接”[重复] - 堆栈内存溢出...
- 新的生活,新的工作,新的挑战
- redis统计用户日活量_【赵强老师】Redis案例分析:用setbit统计活跃用户
- Unity 3D 学习(一)——Roll a ball
- 《毫米波雷达运动人体目标建模与特征提取》---论文学习笔记
- UG与PROE哪个好用,主要看是用在哪里
- 笔记-Tukey Method发现outliers(离群点)
- Premiere 常用视频概念
- 谋定而后动,常怀敬畏之心--生产库DBA必备素质
- css最后一行省略号,CSS怎么实现单行、多行文本溢出显示省略号
- 关于过圣诞节的一段往事
- 易语言dd驱动模拟按键模块_DD虚拟键盘虚拟鼠标
- Jetty的安装、配置和使用(三种使用方式)
- Houdini 导出粒子替代物至Maya渲染
- Gephi简易学习[七]————通过Pyhthon编写程序来调用honglou.json生成.csv文件