array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 NAO机器人学习笔记(2) - 爱码网

5 电机
5.1 为了增加扭力,每种电机上都有减速箱,通过电机连接的微型齿轮降低转速。

5.2 转矩
  转矩是一种力矩,力矩=力*力臂 (N * m)
堵转转矩和标称转矩反应了电机在启动和政策工作状态下驱动力的大小。
堵转转矩是指当电机转速为0时的转矩,如膝关节电机在启动或维持半蹲状态都处于堵转状态。
额定转矩是电机可以长期稳定运行的转矩。
5.3 位置检测
  所有的关节都是伺服控制的结构,传输给电机的力或力矩指令都是根据检测到的关节位置与
期望位置之间的差值而给定的。每个关节都有位置传感器,直接安装在电机的轴上,根据电机
轴的位置可以计算得到真实的关节转角。
5.4 电流控制
  每个点击电路板上都有一个电流传感器,如果电流达到电流传感器最大值,通过控制电路的
反馈机制,能够减小电流直到返回到最大值以下。
NAO使用刚度控制电机电流,值为0~1.0

6 ALRobotPosture模块
6.1 主要方法
goToPosture(postureName, speed):
转到预定义姿势。阻塞调用。
getPosture():
返回当前姿势名称,如果当前姿势不是预定义姿势,返回unknow。阻塞调用。
getPostureList():
返回预定义姿势列表。阻塞调用。
applayPosture(postureName, speed):
将机器人关节设置为预定义姿势对应的状态(没有中间动作)。阻塞调用。
stopMove():
停止当前动作。

7 ALMotion模块
  包括与机器人动作相关的API,分为刚度控制、关节控制、运动控制等方面。
ALMotion运行频率是50HZ. 在ALMotion中,当调用API去执行一个动作时,要创建一个'运动任务'
处理这个任务,每隔20ms,这个’运动任务‘将计算基本命令(电机角度和刚度变化)执行这个动作,
设置角度或刚度变化时,time.sleep(1.0)。
7.1 刚度控制方法
Nao使用刚度控制电机最大电流。电机的转矩(驱动力)与电流相关,设置关节的刚度相当于设置电
机的转矩限制。
刚度为0.0,关节位置不受电机控制,关节是自由的。
刚度为1.0,关节使用最大转矩功率转到指定位置。
刚度为0.0~1.0,关节电机的转矩介于0与最大值直接(如果关节移动到目标位置所需要的转矩高于刚、
度的限制,关节不会到达目标位置)。
wakeUp():
唤醒机器人(启动电机
robotIsWakeUp():
机器人为唤醒状态返回Ture。
setStiffnesses(names, stiffnesses):
设置一个或多个关节刚度,names为关节名或关节组名。非阻塞调用。注:刚度设置结果略有误差, 误差范围约为0~2%)
rest():
转到休息姿势。
getStiffnesses(jointName):
获取关节或关节组刚度,返回为一个或多个刚度值,jointname为关节名
或关节组名。
stiffnessInterpolation(names,stiffnessLists,timeLists): 将一个或多个关节按时间序列设置刚度旭烈治,
names为关节名或关节组名,stiffnessLists为刚度列表,timeLists为时间列表。阻塞调用。
7.2 关节控制方法
关节运动与身体平衡:
当关节运动时,机器人的重心会发生变化,严重时机器人会摔倒。为保持身体平衡,不仅需要同时改变
多个关节的角度,通常还需要同时调节关节运动速度。
(1)插值方法,阻塞调用,类似于动画,在起始位置和终止位置间定时插入若干中间值。
(2)反应式方法,非阻塞式调用,通常在反应控制中多次调用。NAO可能得到一组相互矛盾的命令序列,
调用反应式方法可以保证运动平滑且速度连续。
angleInterpolation(names, angleLists, timelists, isAbsolution):
插值运动。name是关节名称,angleLists是角度、或二维角度列表,单位为弧度,timeLists是为达到目标
角度的时间、时间列表或二维时间列表,isAbsolute为Ture,代表绝对角度,为False,代表相对角度。阻塞调用。
angleInterpolationWithSpeed(names, targetAngles, maxSpeedFraction):
插值运动(带速度限制)。maxSpeedFraction为最大速度比。阻塞调用。
angleInterpolationBezier(joinNames, times, controlPoints):
贝塞尔角度插值。joinNames为关节名称列表,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。阻塞调用。
7.3 运动控制方法
在每一个ALMotion周期中采集来自传感器的实际关节位置信号,与位移和身体的倾斜角度等期望值进行比较后,利用
控制算法计算出控制量,驱动电机实现队关节的实时控制。
每步包括双脚支撑和单脚支撑两个阶段,其中,双脚支持时间占1/3.行走初始阶段和结束阶段双腿支撑时间为0.6。脚
运动轨迹是一条平滑曲线,利用初始速度和关键点,使用SE3插值方法计算出,脚部符合速度限制又能够保持平稳。
运动位置使用Pose2D类定义。在描述左脚时,以右脚为参照点。
7.3.1 步态参数
名称 含义 缺省 最小 最大 可修改
MaxStepX 沿X方向的最大向前平移(m) 0.040 0.001 0.080 是
MinStepX 沿X方向的最大向后平移(m) -0.040 否
MaxStepY 沿Y方向的最大平移绝对值(m) 0.140 0.101 0.160 是
MaxStepTheta 沿Z轴旋转角度最大绝对值(°) 0.349 0.001 0.524 是
MaxStepFrequency 最大步频 1.0 0.0 1.0 是
MinStepPeriod 最小步周期 0.42 否
MaxstepPeriod 最大步周期 0.6 否
StepHeight Z轴方向抬脚最大高度(m) 0.020 0.005 0.040 是
TorsoWx 躯干与X轴间最大角度(°) 0.000 -0.122 0.122 是
TorsoWy 躯干与Y轴间最大角度(°) 0.000 -0.122 0.122 是
FootSeparation Y方向两脚之间距离(m) 0.1 否
MinFootSeparation Y方向两脚之间最小距离(m) 0.088 否
7.3.2 Nao行走控制主要的三种方式
moveTo:
使机器人移动到指定位置,阻塞调用。
(1).moveTo(x, y, theta), 移动到指定位置。
(2)moveTo(x, y, theta, MoveConfig), 按给定的步态参数移动到指定位置。moveConfig为自定义步态参数列表,列表
中的内容为步态参数键值对。
(3)moveTo(controlPoints),沿控制点移动到指定位置,controlPoints为控制点列表。
(4)moveTo(controlPoints, moveConfig), movetoConfig为自定义步态参数列表。

move:
move方法是机器人按指定速度行走,非阻塞调用。
(1)move(x, y, theta), 按指定速度行走,x为绕X方向速度(m/s), theta为绕Z轴旋转角速度(rad/s), 负数表示顺时针
转动。非阻塞调用方法,需要time.sleep()延时,延时时间除了行走过程时间外,应还包括机器人走过程的初始化阶段和终止阶段。
(2)move(x, y, theata, moveConfig), 按给定的步态参数和指定速度行走。其中x为X方向,moveConfig为自定义步态参数列表
可以分别设置左脚和右脚的步态参数。

moveToward:
moveToward()方法是机器人按指定速度行走,非阻塞调用方法。
(1)moveToward(x, y, theta), 按指定速度行走,其中x为X方向速度,取值范围[-1, 1], theta为绕Z轴旋转速度。
(2)moveToward(x, y, moveConfig), 按给定的步态参数、指定速度行走。
7.3.3 运动控制的几个关键问题
(1)初始化问题,在NAO启动行走进程前,NAO首先要执行初始化过程,goToPosture("StandInit", 0.5)。
(2)同步问题,moveTo()方法为阻塞调用,执行完成后,与原线程同步可以使用如下两种方法:
1)waitUntilMoveIsFinished:
  self.motion.post.moveTo(1.0, 0.0, 0.0)
  self.motion.waitUntilMoveIsFinished()
2)moveIsActive
  self.motion.post.moveTo(1.0, 0.0, 0.0)
    while self.motion.moveIsActivate():
    time.sleep(1)
(3)步态控制问题

  通过步态规划可以独立地控制NAO行走的每一步,实现步态规划有如下两种方式,
  1)setFootSteps, 非阻塞调用,setFootSteps()方法设置每一步发生的时间。
  2)setFootStepsWithSpeed,阻塞调用,setFootStepsWithSpeed()方法使用标准化的步态速度。

                                   运动控制方法

 NAO机器人学习笔记(2)

NAO机器人学习笔记(2)

 

相关文章: