1月20日-1月25日
我参加了河海大学和深圳优必选公司联合举办的训练营
作为机器人领域的龙头企业,优必选公司的产品Alpha曾经登陆过春晚进行表演,这次活动中他们的机器人产品Yanshee也非常厉害
在训练营的末尾,我们小组用了一天半的时间做了一个小型的项目,当作我们的结营汇报,以下为项目内容。
功能1-4:【项目回顾】基于Yanshee的AI服务型机器人(一)
功能5-8:【项目回顾】基于Yanshee的AI服务型机器人(二)
功能9-12:
- 进行预设好的语音交互
- 拍照识别摄像头内人脸个数,与先前录入的人脸进行匹配,相似的返回姓名 拍照识别摄像头内人脸个数,与先前录入的人脸进行匹配,相似的返回姓名
- 分析拍摄的照片中人脸的情绪,并根据不同的情绪元素做出不同的反馈分析拍摄的照片中人脸的情绪,并根据不同的情绪元素做出不同的反馈
- 集体跳舞(千手观音与卡路里)集体跳舞(千手观音与卡路里)
这篇文章将回顾项目的第9-12项功能
9:进行预设好的语音交互
import RobotApi
from time import sleep
def voice_special():
while True:
ret = 1
ret = RobotApi.ubtDetectVoiceMsg("你好",10)
if ret == 0:
RobotApi.ubtVoiceTTS(1,"你好")
time.sleep(1)
ret = RobotApi.ubtDetectVoiceMsg("名字",10)
if ret == 0:
RobotApi.ubtVoiceTTS(1,"我是 yanshee")
time.sleep(1)
ret = RobotApi.ubtDetectVoiceMsg("报菜名",10)
if ret == 0:
RobotApi.ubtVoiceTTS(1,"有蒸羊羔儿、蒸熊掌、蒸鹿尾儿、"
"烧花鸭、烧雏鸡、烧子鹅、卤猪、"
"卤鸭、酱鸡、腊肉、松花小肚儿、"
"晾肉、香肠儿、什锦苏盘儿、"
"熏鸡白肚儿、清蒸八宝猪")
time.sleep(2)
ret = RobotApi.ubtDetectVoiceMsg("再见",10)
if ret == 0:
RobotApi.ubtVoiceTTS(1,"再见")
time.sleep(1)
break
这个功能实现的并不是很好,主要的原因在于实现的思路,若是使用这段代码,就必须按顺序一条一条说出对应指令,并在适当的时候说出再见,不然程序就会反复运行,不停地按顺序检测是否听到对应的指令。
这一项功能除了语音识别意外,并不具有任何智能。
使用了RobotApi.ubtDetectVoiceMsg()这个方法,其使用介绍为
10:拍照识别摄像头内人脸个数,与先前录入的人脸进行匹配,相似的返回姓名 拍照识别摄像头内人脸个数,与先前录入的人脸进行匹配,相似的返回姓名
由于功能过多,所以在做的时候将各个功能分解进行实现
import RobotApi
import time
def vision_photo()
num="0"
RobotApi.ubtVisionDetect("face",num,5)
print(num)
time.sleep(0.5)
ret = RobotApi.ubtTakeAPhoto("vision.jpg",10)
time.sleep(0.5)
ss='0'
ret2 = RobotApi.ubtFaceCompare(10,ss)
time.sleep(0.5)
voice_resp.voice_special(ss)
若要实现这个功能,就要理解并且可以运用这三个函数
有了这三个函数,我们就可以进行照片的拍摄,人脸个数的识别并且可以将拍到的人脸和提前录入进机器的人脸进行比较,判断是否存在相似的结果,有的话还可以进行语音交互。
11:分析拍摄的照片中人脸的情绪,并根据不同的情绪元素做出不同的反馈分析拍摄的照片中人脸的情绪,并根据不同的情绪元素做出不同的反馈
首先通过机器人的分析读取当前表情,返回为表情占比,取其中的最大值存储为当前表情并且进行下一步的交互
def vision_Expression():
vision_Photo()
ss2=RobotApi.UBTEDU_FACEEXPRE_T()
RobotApi.ubtFaceExpression(5,ss2)
max0 = max_min(ss2.fHappinessValue,ss2.fSurpriseValue,ss2.fAngerValue,ss2.fSadnessValue,ss2.fNeutralValue,ss2.fDisgustValue,ss2.fFearValue)
result=0
if max0==ss2.fHappinessValue:
result="fHappinessValue"
if max0==ss2.fSurpriseValue:
result="fSurpriseValue"
if max0==ss2.fAngerValue:
result="fAngerValue"
if max0==ss2.fSadnessValue:
result="fSadnessValue"
if max0==ss2.fNeutralValue:
result="fNeutralValue"
if max0==ss2.fDisgustValue:
result="fDisgustValue"
if max0==ss2.fFearValue:
result="fFearValue"
print(result)
voice_resp.voice_special(result)
return result
这里要用到RobotApi.ubtFaceExpression()来读取表情参数
有了表情参数以后可以让机器人有针对性地进行反馈
由于只是示例,所以对应的反馈并没有全部写好
def playMusic(filename, loops=0, start=0.0, value=0.5):
"""
:param filename: 文件名
:param loops: 循环次数
:param start: 从多少秒开始播放
:param value: 设置播放的音量,音量value的范围为0.0到1.0
:return:
"""
flag = False # 是否播放过
pygame.mixer.init() # 音乐模块初始化
while 1:
if flag == 0:
pygame.mixer.music.load(filename)
# pygame.mixer.music.play(loops=0, start=0.0) loops和start分别代表重复的次数和开始播放的位置。
pygame.mixer.music.play(loops=loops, start=start)
pygame.mixer.music.set_volume(value) # 来设置播放的音量,音量value的范围为0.0到1.0。
if pygame.mixer.music.get_busy() == True:
flag = True
else:
if flag:
pygame.mixer.music.stop() # 停止播放
break
def voice_special(a):
if a == "C":
RobotApi.ubtVoiceTTS(1,"爸爸好")
time.sleep(1)
if a == "fSadnessValue":
RobotApi.ubtVoiceTTS(1,"主人,我看你有点不高兴,给你讲一个笑话吧,一天,你遇到狮子,故作镇定,用可怕的眼神瞪狮子,突然狮子双手合十并跪下来,你得意地说 知道厉害了吧,少倾,狮子幽幽的道,祷告完毕,可以用餐了!哈哈哈哈哈啊,主人,你觉得好笑吗")
if a == "fNeutralValue":
RobotApi.ubtVoiceTTS(1,"不悲不喜,来去从容,是生活最好的姿态,yanshee给你点赞,我们一起来听一首歌吧!")
if a == "fNeutralValue":
playMusic("xiaoyu.mp3")
if a == "fFearValue":
RobotApi.ubtVoiceTTS(1,"不悲不喜,来去从容,是生活最好的姿态,yanshee给你点赞,我们一起来听一首歌吧!")
playMusic("xiaoyu.mp3")
if a == "fSurpirseValue":
RobotApi.ubtVoiceTTS(1,"不悲不喜,来去从容,是生活最好的姿态,yanshee给你点赞,我们一起来听一首歌吧!")
playMusic("xiaoyu.mp3")
if a == "fAngerValue":
RobotApi.ubtVoiceTTS(1,"不悲不喜,来去从容,是生活最好的姿态,yanshee给你点赞,我们一起来听一首歌吧!")
playMusic("xiaoyu.mp3")
if a == "fDisgustValue":
RobotApi.ubtVoiceTTS(1,"不悲不喜,来去从容,是生活最好的姿态,yanshee给你点赞,我们一起来听一首歌吧!")
playMusic("xiaoyu.mp3")
playMusic("xiaoyu.mp3")
if a == "fHappinessValue":
RobotApi.ubtVoiceTTS(1,"主人,你这么高兴,能和我分享一下嘛!")
通过以上的程序,Yanshee机器人具备了在用户有着不同表情的时候采取不同策略的能力,更加地人性化和智能。
12:集体跳舞(千手观音与卡路里)集体跳舞(千手观音与卡路里)
(这里只介绍千手观音)
千手观音分为两部分,最前面的机器人和后方的机器人,所以用了两个函数来分别实现
import RobotApi
import time
def motion_InitAngle(servoAngle,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16,n17):
#set angel
servoAngle.SERVO1_ANGLE=n1
servoAngle.SERVO2_ANGLE=n2
servoAngle.SERVO3_ANGLE=n3
servoAngle.SERVO4_ANGLE=n4
servoAngle.SERVO5_ANGLE=n5
servoAngle.SERVO6_ANGLE=n6
servoAngle.SERVO7_ANGLE=n7
servoAngle.SERVO8_ANGLE=n8
servoAngle.SERVO9_ANGLE0=n9
servoAngle.SERVO10_ANGLE=n10
servoAngle.SERVO11_ANGLE=n11
servoAngle.SERVO12_ANGLE=n12
servoAngle.SERVO13_ANGLE=n13
servoAngle.SERVO14_ANGLE=n14
servoAngle.SERVO15_ANGLE=n15
servoAngle.SERVO16_ANGLE=n16
servoAngle.SERVO17_ANGLE=n17
def motion_setAngle(servoAngle,n2,n3,n5,n6):
#set angel
#2,3 right
#5,6 left
servoAngle.SERVO2_ANGLE=n2
servoAngle.SERVO3_ANGLE=n3
servoAngle.SERVO5_ANGLE=n5
servoAngle.SERVO6_ANGLE=n6
def motion_moreHands(RobotApi):
servoAngle=RobotApi.UBTEDU_ROBOTSERVO_T()
#First one
motion_InitAngle(servoAngle,90,0,90,90,0,90,90,59,75,110,90,90,120,104,70,90,90)
RobotApi.ubtSetRobotServo(servoAngle,20)
time.sleep(1)
motion_setAngle(servoAngle,30,89,30,90)
RobotApi.ubtSetRobotServo(servoAngle,20)
time.sleep(1)
motion_setAngle(servoAngle,75,89,75,90)
RobotApi.ubtSetRobotServo(servoAngle,20)
time.sleep(1)
motion_setAngle(servoAngle,120,89,120,90)
RobotApi.ubtSetRobotServo(servoAngle,20)
time.sleep(1)
motion_setAngle(servoAngle,165,89,165,90)
RobotApi.ubtSetRobotServo(servoAngle,20)
time.sleep(1)
RobotApi.ubtStopRobotAction()
以上就是这次项目的所有功能。
感谢阅读!