Skip to content

附录1 — Yanshee Robot SDK API 使用说明

UBTEDU edited this page Jul 29, 2019 · 18 revisions

文档概述

本文档是开发优必选机器人(Yanshee)应用程序的用户使用指南。第三方开发者可以通过接入SDK控制机器人的各舵机转动和读传感器值,还集成人脸识别和手势识别等。本文主要描述SDK的使用方法,用于指导开发人员快速进行基于Python/JAVA/JS等语言的应用开发。

Yanshee API接口说明(Python版)

读取软件版本

名称:

def ubtGetSWVersion( Type, Version, VersionLen)

描述:

获取机器的硬件版本信息

参数:

【Type】

整型数值型: 0 为STM32 app版本;1~20为舵机版本;30:为SDK版本;31:为Raspberry APP版本

【Version】

字符串类型: 对应的版本信息字符串,最长为20Byte

【VersionLen】

整型数值型: 版本字符串长度,最大为20Byte

返回值:

整型数值型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 108--语音识别失败 109--语音识别语法错误 110--解码AIUI信息失败;

调用方式:

同步

读取机器状态

名称:

def ubtGetRobotStatus(Type, Status)

描述:

获取机器的状态信息

参数:

【Type】

整型数值型 1 为播放状态(Status:2 暂停, 1 播放,0空闲);2 为音量(Status:0—ff);3 为电量(Status:[0]是否充电(0否,1是),[1-2]电压值(mv,十六进制,高位在前),[3]电量百分比(取值范围0~100,十六进制)

【Status】

字符串类型: 返回含义见上面type说明

返回值:

整型数值型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

舵机控制

名称:

def ubtSetRobotServo(UBTEDU_ROBOTSERVO_T servoAngle, iTime);

描述:

控制 单个、多个、所有 舵机的运动

参数:

【servoAngle】

UBTEDU_ROBOTSERVO_T类型: 包含了1到17号舵机的0 – 180度对应角度。

【Time】

整型; 舵机运行时间,单位为20ms(最小大于10)

返回值:

整型数值型; 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

举例:

此接口举例向前请参考第四节例3部分。 另外,Yanshee机器人正面舵机分布说明图如下:

舵机分布图

舵机回读

名称:

def ubtGetRobotServo(UBTEDU_ROBOTSERVO_T servoAngle)

描述:

回读 单个、多个、所有舵机的角度,直接返回全部舵机角度值,通过类似下面结构来读取:

servoinfo = RobotApi.UBTEDU_ROBOTSERVO_T()
servoinfo.SERVO1_ANGLE
servoinfo.SERVO2_ANGLE
...........................
servoinfo.SERVO17_ANGLE

参数:

【servoAngle】 UBTEDU_ROBOTSERVO_T 类型。 0 - 180 对应舵机角度,值为255表示舵机无应答

返回值:

整型数值型; 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

举例:

详情请参考第四部分第4个例子:读取舵机举例。

音量调节

名称:

def ubtSetRobotVolume( Volume )

描述:

设置机器人音量

参数:

【Volume】整型,音量取值范围0~255

返回值:

整型数值型; 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

局部动作控制

名称:

def ubtSetRobotMotion(Type, direct, speed, repeat)

描述:

控制机器人做局部动作,例如:蹲下、举手、

参数:

【Type】

字符串类型: crouch蹲下、raise 举手、 stretch 伸手、come on招手、wave挥手、bend 弯曲、walk 走路、turn around 转身、head 转动头部、bow鞠躬;

【direct】

字符串类型: left 左、right右、both双手、front前、back后;

【speed】

整型: 1/2/3/4/5(五个速度等级,依次更快),默认为3;

【Repeat】

整型: 重复次数

返回值:

整型数值型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

读取传感器值

名称:

def ubtReadSensorValue( Type, Value, ValueLen)

描述:

读传感器值(默认读取一个低位地址)

参数:

【Type】

字符串类型: gryo 陀螺仪、environment环境、board板上、infrared红外、 ultrasonic超声波、touch触摸、color颜色、pressure压力、gas气体

【Value】

根据不同的类型传入不同的值。 返回传感器的值

【Valuelen】

整型类型: 返回值的长度,其中Type = gryo时Valuelen 值为 96 , environment 时为12,infrared时为4,ultrasonic时为4,touch时为4、pressure为4.

返回值:

整型数值型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

根据ID读取传感器值

名称:

def ubtReadSensorValueByAddr (Type, Addr, SensorValue, ValueLen )

描述:

读对应地址的传感器值

参数:

【Type】

字符串类型: gryo 陀螺仪、environment环境、infrared红外、 ultrasonic超声波、touch触摸、pressure压力

【Addr】

整型数值型 需要读取模块的传感器IIC地址

【SensorValue】

不同传感器不同类型(例如:gyro_sensor = api.UBTEDU_ROBOTGYRO_SENSOR_T()) 返回传感器的值

【Valuelen】

整型数值型: 返回值的长度,其中Type = gryo时Valuelen 值为 96 , environment 时为12,infrared时为4,ultrasonic为4,touch为4、pressure为4.

返回值:

整型数值型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

控制灯光

名称:

def ubtSetRobotLED( Type, Color, Mode)

描述:

设置 机器人LED灯

参数:

【Type】

字符串类型:可选如下三种:"button" "camera" "mic"

【color】

字符串类型: 灯颜色 white-白 red-红 green-绿 blue-蓝 yellow-黄 purple-紫 cyan-青绿;

【mode】

字符串类型: off-关on-常亮 flicker-频闪 breath-呼吸 alternation 轮流

返回值:

整型数值型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

按键事件检测

名称:

def ubtEventDetect( pcEventType, pcValue, iTimeout)

描述:

执行动作文件

参数:

【pcEventType】

字符类型: 要检测事件类型,目前默认只支持button类型;

【pcValue】

字符类型: 事件重复次数,0:没有发生 其它是实际发生次数;

【iTimeout】

整型数值型: 设置事件超时时间,最小10s,最大10min。

返回值:

整型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

异步

播放动作文件

名称:

def ubtStartRobotAction ( Name, repeat)

描述:

执行动作文件

参数:

【Name】

字符类型: 动作文件名,例如:push up(俯卧撑)、Victory(胜利)等。另外我们如果自己手机回读编辑了动作文件可以发送到Yanshee机器人来,默认动作文件存储目录为:/usr/local/recv 需要手动拷贝到这个目录下调用:/mnt/1xrobot/res/hts,然后我们就能调用我们自己编辑的动作了,当然也可以通过查看这个目录下所有文件来查看我们都默认内置了哪些动作文件。

【Repeat】

整型: 重复次数 0:连续执行 其它是实际次数

返回值:

整型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

异步

动作暂停

名称:

def ubtStopRobotAction ( )

描述:

停止执行动作文件

参数:空

返回值:

整型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

声音播放

名称:

def ubtPlayMusic( Type, Name)

描述:

执行声音文件,目前接口只支持wav格式。如果想播放MP3文件,可以直接命令行执行:mpg123 aaa.mp3

参数:

【Type】

字符串类型: 动作文件操作类型:play、pause、stop分别表示播放音乐、暂停音乐和停止音乐;

【Name】

字符串类型: 声音文件名:例如:alarm.wav; 默认wav文件存储目录为:/mnt/1xrobot/res/audio/blockly 举例: RobotApi.ubtPlayMusic(“play” , “alarm.wav”)

返回值:

整型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

异步

TTS播放

名称:

def ubtVoiceTTS ( isInterrputed, tts)

描述:

将文字转成声音播放

参数:

【isInterrputed】

整型: 0 不打断前面的语句 1 打断前面的语句

【tts】

字符串类型: 需要播报的文字信息

返回值:

整型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

异步

检测是否听到xxx

名称:

def ubtDetectVoiceMsg( buf, timeout)

描述:

检测是否听到

参数:

【buf】

字符串类型: 文字内容(utf-8编码)

【timeout】

整型: 检测超时时间,最小10s,最大10min;

返回值:

整型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

拍照

名称:

def ubtTakeAPhoto( Name, NameLen)

描述:

拍一张图片,拍完照图片会被保存到机器人/mnt/1xrobot/tmp目录下。

参数:

【Name】

字符类型: 图标名字,不带后缀(.jpg),如果为空则按照:img_yyyymmdd_hhmmss.jpg

【NameLen】

整型数值型: 图片名称长度

返回值:

整型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

视觉检测接口

名称:

def ubtVisionDetect ( Type, Value, Timeout)

描述:

检测是否看到人脸或者人手并返回人脸或人手个数。

参数:

【type】

字符串类型: 检测类型,取值:face 人脸,hand 手;

【value】

字符串类型: 返回检测到的人脸个数或者人手个数

【timeout】

整型: 检测超时时间,最小10s,最大10min;

返回值:

整型: 0 -- 操作成功 1-- 操作失败 2--资源缺失 3--发现失败 4--参数错误 5--忽略该返回值 100--网络socket错误 101--发消息为空 102--接收消息超时 103--编码消息失败 104--解码消息失败 105--编码消息错误 106--解码消息错误 107--发送消息超时 ;

调用方式:

同步

调用举例

Python调用举例

例1、这个例子通过调用局部动作控制接口来实现一个简单的控制Yanshee机器人的动作。

我们开发时候只需要修改虚线部分以内的代码即可。(如下图中红色方框部分)

附录code1

这句话的意思是让机器人举左手,速度为3,重复1次。请参考上一节局部动作控制API接口说明。 这里我们的Type填写的是raise,direct填的是left,speed写的3,Repeat写的1。 这样就实现了一个简单的机器人举左手一次的动作。

例2、这个例子通过SDK接口读取指定机器人的红外距离传感器数据,并将它打印出来。

#!/usr/bin/python
# _*_ coding: utf-8 -*-

import RobotApi
import time

#------------------------------Connect--------------------
RobotApi.ubtRobotInitialize()                                                                            
ret=RobotApi.ubtRobotConnect("sdk","1", "127.0.0.1")                                                                                                    
if (0 != ret):                                                                                         
	print ("Error --> ubtRobotConnect return value: %d" % ret)                                   
	exit(1)
#----------------------- block program start ----------------------

infrared_sensor = RobotApi.UBTEDU_ROBOTINFRARED_SENSOR_T()
ret = RobotApi.ubtReadSensorValue("infrared",infrared_sensor,4)
if ret != 0:
    print("Can not read Sensor value. Error code: %d" % (ret))  
else:
print("Read Sensor Value: %d" % (infrared_sensor.iValue))

#----------------------- block program end ----------------------
RobotApi.ubtRobotDisconnect("SDK","1","127.0.0.1")
RobotApi.ubtRobotDeinitialize()

例3、这个例子通过设置舵机角度API实现了舵机2为60度和舵机3为40度的过程:

#!/usr/bin/python
# -*- coding: utf-8 -*-                                                                                
                                                                                                         
import RobotApi
                                                               
RobotApi.ubtRobotInitialize()                                                                            
ret=RobotApi.ubtRobotConnect("sdk","1", "127.0.0.1")                                                                                                    
if (0 != ret):                                                                                         
	print ("Error --> ubtRobotConnect return value: %d" % ret)                                   
	exit(1)                                                                                  
                                                                                                                                                                                                 
#----------------------- block program start ----------------------                                                                                                                                           

servoinfo = RobotApi.UBTEDU_ROBOTSERVO_T()                                                                                                       
#set servo2 = 60°,servo3 = 40°                                                                                        
servoinfo.SERVO2_ANGLE = 60
servoinfo.SERVO3_ANGLE = 40
ret = RobotApi.ubtSetRobotServo(servoinfo, 20)                                                                  
                                                                                                                                                   
#----------------------- block program end ----------------------                                      
                                                                                                       
RobotApi.ubtRobotDisconnect("sdk", "1", "127.0.0.1")                                                                                            
RobotApi.ubtRobotDeinitialize()     

例4、通过这个例子实现了对所有舵机的读取:

#!/usr/bin/python
# -*- coding: utf-8 -*-                                                                                
                                                                                                         
import RobotApi
                                                               
RobotApi.ubtRobotInitialize()                                                                            
ret=RobotApi.ubtRobotConnect("sdk","1", "127.0.0.1")                                                                                                    
if (0 != ret):                                                                                         
	print ("Error --> ubtRobotConnect return value: %d" % ret)                                   
	exit(1)                                                                                  
                                                                                                                                                                                                 
#----------------------- block program start ----------------------                                                                                                                                           

servoinfo = RobotApi.UBTEDU_ROBOTSERVO_T()

ret = RobotApi.ubtGetRobotServo(servoinfo)
print "servoinfo.SERVO1_ANGLE = %d" %(servoinfo.SERVO1_ANGLE)
print "servoinfo.SERVO2_ANGLE = %d" %(servoinfo.SERVO2_ANGLE)
print "servoinfo.SERVO3_ANGLE = %d" %(servoinfo.SERVO3_ANGLE)
print "servoinfo.SERVO17_ANGLE = %d" %(servoinfo.SERVO17_ANGLE)
                                                                                                
#----------------------- block program end ----------------------                                      
                                                                                                       
RobotApi.ubtRobotDisconnect("sdk", "1", "127.0.0.1")                                                                                            
RobotApi.ubtRobotDeinitialize()     

执行python文件

将这个例1的python文件保存为SDKSampleAction1.py(当然这个文件名可以按照您的喜好任意命名)放到机器人的树莓派目录/home/pi下面,然后执行此文件。

在命令行敲入以下命令 sudo python SDKSampleAction1.py

然后就会看到Yanshee机器人做的相应的动作。如果您想让机器人做其它动作、说话、或者读取传感器数据等,只要您能想到的场景都可以试试调用相应的python接口,完成相应的功能。

注意事项

注意如果您在执行过程中遇到这个问题:

附录注意事项

请先执行下面命令:

export LD_LIBRARY_PATH=$LB_LIBRARY_PATH:/mnt/1xrobot/lib 然后再执行 python SDKSampleAction1.py

另外附上例1源代码(可直接复制粘贴):

#!/usr/bin/python
# -*- coding: utf-8 -*-                                                                                
                                                                                                         
import RobotApi
                                                               
RobotApi.ubtRobotInitialize()                                                                            
ret=RobotApi.ubtRobotConnect("sdk","1", "127.0.0.1")                                                                                                    
if (0 != ret):                                                                                         
	print ("Error --> ubtRobotConnect return value: %d" % ret)                                   
	exit(1)                                                                                                                                                                                                                                                                               
#----------------------- block program start ----------------------                                                                                                                                                                                                                                   
#raise_hand                                                                                              
RobotApi.ubtSetRobotMotion("raise", "left", 3, 1)                                                                                                                                                                                                                                                              
#----------------------- block program end ----------------------                                                                                                                                             
RobotApi.ubtRobotDisconnect("sdk", "1", "127.0.0.1")                                                                                            
RobotApi.ubtRobotDeinitialize()   

非常感谢您的阅读!

Clone this wiki locally