NAO学习第一周
1.目标
1.1掌握NAO的基础知识;
1.2看至少三篇论文,确立大概研究方向;
1.3练习Python,为算法做准备;
2.进展
2.1NAO的基础知识
2.1.1环境与构造
2.1.2其它
2.2论文研究成果
参考文献为:
基于NAO服务型机器人的二次开发_蔡浩
NAO机器人在自闭症干预中的应用_张婷
基于NAO机器人的手势和表情识别_深仕卿
2.3Python编程练习(关于NAO)
2.3.1安装与概述
2.3.1.1感谢大佬开路
电脑软件无法安装怎么办(来自菜逼的忧伤,安装时一直提示另一个程序正在安装,感谢度娘)
2.3.1.2Python概述
1)特色
a.决定动态数据形态
好处是可创造简易的一般化程序代码,如建立一个会将两个变量相加的函数,就不用考虑多种变量类型的组合,只需:
#coding:utf-8 #一定要用Python2,python3.7把我坑惨了
import math
a=input("请输入第一个数:")
b=input("请输入第二个数:")
def add(a,b): #冒号呀冒号,千万别忘记
return a+b
print add(a,b) (这个写得不好,看后面声明函数部分!!菜逼表示很自卑呜呜呜)
b.平*立语言——对操作系统无限制
c.清楚及简单的语法——仅使用缩排来区隔程序区块
d.内建数据结构——
字符串(string)——是一种数据类型,比较特殊的是还有一个编码问题。
列表(list)——是一种有序的集合,可以随时添加和删除其中的元素。
>>> week=['Monday','Wednesday','Thursday','Friday','Saturday']
>>> week
['Monday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
>>> type(week)
<type 'list'>
>>> week.append('Sunday') #添加
>>> week
['Monday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
>>> week.insert(1,'Thesday') #插入
>>> week
['Monday', 'Thesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
>>> week.index('Sunday') #索引函数
6
>>> week.count('Thursday') #计数函数
1
>>> week.sort() #排序函数,升序字母排列
>>> week
['Friday', 'Monday', 'Saturday', 'Sunday', 'Thesday', 'Thursday', 'Wednesday']
>>> week.reverse() #反向函数,降序字母顺序排列
>>> week
['Wednesday', 'Thursday', 'Thesday', 'Sunday', 'Saturday', 'Monday', 'Friday']
>>>
>>> a=['hello',23,['a','b','c']]
>>> a
['hello', 23, ['a', 'b', 'c']]
多元组(tuple)——tuple和list非常类似,但是tuple一旦初始化就不能修改
>>> a=('hello',23,('a','b','c'))
>>> a
('hello', 23, ('a', 'b', 'c'))
关联数组(dictionary)——字典
>>> score={'Bob': 66,'Tina': 88,'Tom': 99}
>>> score
{'Bob': 66, 'Tina': 88, 'Tom': 99}
>>> type(score)
<type 'dict'>
>>> score.items() #对象函数
[('Bob', 66), ('Tina', 88), ('Tom', 99)]
>>> score.keys() #键函数
['Bob', 'Tina', 'Tom']
>>> score.values() #数值函数
[66, 88, 99]
e.自动内存管理——根据需要的量自动提高或降低内存容量
g.可扩展性——兼容性好,可与其他语言相互调用模块
对NAO来说,Choregraphe安装时也安装了Python,可使用IDLE来进行测试。也可编辑一些Choregraphe模块。
2.3.2数据型态及操作数
2.3.2.1变量名称
可用文字,数字和下底线(_);第一个字母不能为数字且所有变量大小写敏感。
and | del | from | not | while |
as | elif | global | or | with |
assert | else | if | pass | yiled |
breay | except | import | ||
class | exec | in | raise | |
continue | finally | is | return | |
def | for | lambda | try |
2.3.2.2操作数,数字及字符串表示法
1)数据类型
长整型(long),浮点型(float),复数(complex)
>>> score = 100 #整型int
>>> type(score)
<type 'int'>
>>> 0b1010 #二进制转十进制
10
>>> 0o11 #八进制变十进制
9
>>> 0xa3 #十六进制变十进制
163
>>> bin(10) #十变二
'0b1010'
>>> oct(9) #十变八
'011'
>>> hex(163) #十变十六
'0xa3'
>>> pi = 3.14 #浮点数
>>> type(pi)
<type 'float'>
>>> pi
3.14 #没有出现3.1400000000000001的浮点数误差
>>> pi = 314e-2 #浮点数另一种表示方法
>>> type(pi)
<type 'float'>
>>> pi
3.14
>>> x=1+1j #复数
>>> type(x)
<type 'complex'>
>>> x.imag
1.0
>>> x.real
1.0
>>> x.conjugate()
(1-1j)
2)操作数
基本算术运算(+,-,*,/),取余数(%),指数(**),指数的优先权大于其余算术运算
2.3.3控制语句
2.3.3.1条件式
1)“if”语句
>>> score=77
>>> if 90<=score<=100:
print"A"
elif 80<=score<90:
print"B"
elif 70<=score<80:
print"C"
elif 60<=score<70:
print"D"
else:
print"不及格"
C
>>>
2) "while"语句
>>> sum = 0
>>> number = 0
>>> while number < 5:
number += 1
sum += number
print number,sum
1 1
2 3
3 6
4 10
5 15
2.3.3.2循环
1)"for"语句
>>> number = ['one','two','three','four','five']
>>> for i in number:
print i
one
two
three
four
five
2)range函数——创建不断重复数值的列表
>>> range(1,6,1) #range(起始值,终止值,增加值)
[1, 2, 3, 4, 5]
>>> sum = 0 #range + for =while
>>> for i in range(1,6):
sum += i
print i,sum
1 1
2 3
3 6
4 10
5 15
>>>
2.3.4类
2.3.4.1声明——同时定义数据(data)和方法(method)
>>> class firstclass: #可用“pass"语句来定义一个简单且没有任何内容的类
pass
>>> f1=firstclass() #对象创造
>>> type(f1)
<type 'instance'>
>>> #通用类(定义变量和方法和对象声明)
>>> import math #会声明且导入开根号(sqrt)函数的模块
>>> class Point:
x=0;y=0; #变量初始化
def distance(self):
return math.sqrt(self.x*self.x+self.y*self.y)
>>> p1=Point()
>>> p1.x=10;p1.y=20;
>>> p1.distance()
22.360679774997898
2.3.4.2类及对象间的关系
>>> class secondclass:
name = "hi"
>>> x1=secondclass()
>>> x2=secondclass()
>>> x1.name
'hi'
>>> x2.name
'hi'
>>> x2.name="hello"
>>> x1.name
'hi'
>>> x2.name
'hello'
>>> #独立的类对象
>>>
>>> x1.age=10
>>> print x1.name,x1.age
hi 10
>>> #可动态且独立的增加对象和类变量
>>>
>>> isinstance(x1,secondclass)
True
>>> p=10
>>> isinstance(p,secondclass)
False
>>> #使用'isinstance'方法可以了解类和对象之间的关系
2.3.4.3构造函数(创建一个类时的初始化,当创建一个对象时会自动声明)和析构函数(会在销毁对象时被自动声明)
>>> class conclass:
def __init__(self):
print"Constructor Called"
def __del__(self):
print"Destrutor Called"
>>> c1=conclass() #自动声明构造函数
Constructor Called
>>> c1=0 #通过"c1=0"来将连接对象改为 0 以检测是否有声明析构函数
Destrutor Called #此外,就算你使用"del()"函数来从内存 中删除对象,析构函数还是会被声明。
通常,构造函数与析构函数必须定义对象的初始化程序(例如,使用 NAO 来交换电子邮件时),它们会提供电子邮件地址与 IP 位置到对象中。
2.3.4.4静态方法(static method)——可声明外部的对象,而无须创造
>>> class staticclass:
def print_hello(): #静态函数,一般函数中有"self"作为第一个参数来指向它自己的对象,但静态方法不需要第一个参数
print"Hello World"
static_print=staticmethod(print_hello)
>>> staticclass.static_print()
Hello World
2.3.4.5操作数重载(Operator overloading)
>>> class TString: #运算符重载最典型的例子——增加字符串
def __init__(self,init):
self.string = init
def __add__(self,other):
return self.string[:]+other
>>> hello=TString("hello")
>>> hello+" hi"
'hello hi' #其他还有很多预定义方法
2.3.4.6继承
>>> class Robot:
def move(self): #'move'方法
pass
def operating(self): #'operating'方法
pass
>>> class Biped_Robot(Robot): #双足行走(Biped_Robot)
def __init__(self,leg):
self.leg=leg #代表一只腿的变量'leg'
>>> class Nao(Biped_Robot):
def __init__(self,leg):
self.company="aldebaran robotics"
self.os="embedded linux"
Biped_Robot,__init__(self,leg)
>>> issubclass(Nao,Robot) #`issubclass' 函数可以检查子类与父类之间的关系
True #存在父子关系
>>> class Hubo(Biped_Robot):#增加 Hubo 机器人来代替 NAO(使用继承关系去增加一个新类)
def __init__(self,leg):
self.company="vaist"
self.os="nothing,16bit microprocessor"
Biped_Robot,__init__(self,leg)
>>> class Hubo(Biped_Robot):# 函数重载
def move(self):
print "Hubo is moving"
>>> hubo = Hubo(2)
>>> hubo.move()
Hubo is moving
2.3.5模块(Module)——具有特定功能的函数组合
2.3.5.1使用——import
2.3.5.2创造——数据存在Lib文件夹中
2.3.6函数
2.3.6.1声明
>>> def add(a,b):
return a+b
>>> add(10,20)
30
>>> add("hello","LYF")
'helloLYF'
>>> 惊了!!!
2.3.6.2返回值——有"return"语句才有返回值(return value)
>>> def nothing():
return
>>> print nothing()
None
>>> #如何返回多个对象
>>> def cla(a,b):
return a+b,a-b,a*b,a/b
>>> cla(10,20)
(30, -10, 200, 0)
>>> a,b,c,d = cla(10,20)
>>> print a,b,c,d
30 -10 200 0
2.3.6.3参数——Python以引用的方式将参数传递至函数
>>> def add(a,b):
b = 10
return a+b
>>> def change(a):
a[0] = 'a'
>>> a = 20;b = 30
>>> add(a,b)
30
>>> print a,b
20 30 #可修改的类型
>>> a = ['b','b','b']
>>> change(a)
>>> print a
['a', 'b', 'b'] #不可修改的类型
2.3.6.4pass——是用来创造不进行任何操作的程序代码
"pass"语句在编写程序时的使用频率较高,举例来说,当编写一个临时函数(temporary function),模块(module),或类(class)时你可以只指派名称但不编写任何内容。
>>> def nothing():
pass
>>> nothing()
>>> print nothing()
None
3.感想
Naoqi和DCM还搞不懂是什么……其它要学的也好多呀!下周继续加油!争取实现一个深度对话功能!