智元素背包可以通过编写python脚本控制机器人运动。
智元素背包与智元素机器人之间通过串口连接。
串口,也称串行接口或串行端口(Serial Port),是采用串行通信方式的扩展接口。以下是对串口的详细介绍:
串口的基本概念
定义:串口是一种用于数据通信的接口,它按位(bit)发送和接收字节,实现设备间的串行式逐位数据传输。
特点:串口通信线路简单,只需一对传输线即可完成双向通信,成本低但传送速度相对较慢。
分类:根据信息的传送方向,串口通信可以进一步分为单工、半双工和全双工三种方式。
串口的电气标准及协议
RS-232C:最常用的串行通信接口之一,采用标准25芯D型插头座(DB25),后简化为9芯D型插座(DB9)。其传输距离最大约为15米,最高速率为20kb/s,适合本地设备之间的通信。
RS-422:改进了RS-232的传输距离和速率问题,最大传输距离可达1200米,最大传输速度为10Mb/s。
RS-485:在RS-422的基础上增加了多点、双向通信能力,具备联网功能,其传输距离和速率与RS-422相同。
串口的应用领域
工业控制:PLC、工业机器人、传感器等设备之间的通信。
嵌入式系统:如ARM开发板、单片机等设备与其他设备的通信。
计算机串口通信:用于连接老旧设备,如打印机、扫描仪等。
网络设备:如路由器、交换机在出厂测试或配置阶段可能使用串口进行管理。
医疗设备:如心电监护仪、超声波设备等与计算机的通信。
通信设备:如电话交换机、信号灯等设备的控制。
汽车行业:汽车中的传感器和控制单元之间的数据交换。
数据采集和监控系统:远程监控和数据采集系统中的数据传输。
串口数据包组成
串口数据包通常由起始位、数据、校验位及停止位组成。这些部分共同确保了数据的准确传输和接收。
接下来我们来看看智元素移动控制的通讯协议,移动控制的通信协议是一个十四位的数组,数组值如下所示
位数 | 含义 |
---|---|
0 | 帧头第一字节,为0xF5 |
1 | 帧头第二字节,为0x5F |
2 | 设备号,移动指令为0x08 |
3 | 命令id,移动指令为0x02 |
4 | 命令数据长度,移动指令为0x08 |
5,6 | 平移角度2字节(正前方为0,逆时针360度),5为低8位,6为高8位 |
7,8 | 平移绝对速度2字节,7为低8位,8为高8位 |
9,10 | 自旋速度2字节(左正右负),9为低8位,10为高8位 |
11,12 | 运动持续时间,11为低8位,12为高8位 |
13 | 校验位,第2到第12位数据的总和然后取反 |
如上图所示,为智元素的平移角度示意图。
接下来我们根据这个指令协议控制智元素移动。
首先通过Nomachine或者Remote-SSH连接您的智元素机器人背包,然后在桌面新建一个文件夹up_move,文件夹内新建Python文件UPComBotCtrl.py,开始编写程序开发。
输入以下代码:
import serial #智元素机器人是通过串口与底盘连接的,因此要引入python串口库。
class UPComBotControll:
#初始化串口
def __init__(self):
self.ser = serial.Serial(
port="/dev/ttyS0", #选择设备,使用USB连接串行口
baudrate=115200, #设置波特率
bytesize=8, #设置位数
parity='E',
stopbits=1, #停止位
timeout=2
)
self.isOpen = True
#打开与机器人通讯的串口
def open(self):
self.ser.open()
if self.ser.isOpen():
self.isOpen = True
print("open")
else:
self.isOpen = False
#生成移动指令,angle代表移动方向,自身前方为0,方向逆时针,speed代表移动速度大小,turn代表自旋速度(大于0逆时针转,小于0顺时针转)
def setMoveAction(self, angle=0, speed=0, turn=0, time=500):
if self.isOpen:
data = [0] * 8
data[0] = angle & 0xFF
data[1] = (angle >> 8) & 0xFF
data[2] = speed & 0xFF
data[3] = (speed >> 8) & 0xFF
data[4] = turn & 0xFF
data[5] = (turn >> 8) & 0xFF
data[6] = time & 0xFF
data[7] = (time >> 8) & 0xFF
buffer, length = self.GenerateCmd(0x08, 0x02, 0x08, data)
self.ser.write(bytearray(buffer))
return True
return False
#生成通过串口下发的控制指令
def GenerateCmd(self, device, cmd, length, data):
buffer = [0] * (length + 6)
buffer[0] = 0xF5
buffer[1] = 0x5F
buffer[2] = device & 0xFF
check = buffer[2]
buffer[3] = cmd & 0xFF
check += buffer[3]
buffer[4] = length & 0xFF
check += buffer[4]
for i in range(length):
buffer[5 + i] = data[i]
check += buffer[5 + i]
buffer[length + 5] = (~check) & 0xFF
return buffer, length + 6
if __name__ == '__main__':
controll = UPComBotControll()
controll.open()
controll.setMoveAction(0, 0, 100)#给智元素速度赋值(0,0,100),平移绝对值为0,自旋速度为100
0xFF 是计算机十六进制的表示: 0x就是代表十六进制,A B C D E F 分别代表10 11 12 13 14 15 F就是15 一个F 代表4位二进制:可以看做 是 8 4 2 1。
除了直接根据串口协议写驱动,还可以使用我们封装好的库函数。
智元素背包支持Python二次开发与硬件通讯。
在智元素中,我们对与智元素的通讯进行了封装,可以通过一系列Python函数直接控制智元素。
这里,请同学们参考背包中up_zhiyuansu_demo文件夹中,uprobot_movement文件,里面封装了一系列硬件控制的接口,接口含义如下,也可以在实际demo中进行参考。
接口名称 | 接口描述 | 参数说明 |
---|---|---|
move_forward(speed=10,times=500) | 向前运动 | speed:运动速度 times: 运动时间,单位毫秒 |
move_left(speed=10, times=500) | 向左平移运动 | speed:运动速度 times: 运动时间,单位毫秒 |
move_right(speed=10, times=500) | 向右平移运动 | speed:运动速度 times: 运动时间,单位毫秒 |
move_backward(speed=10, times=500) | 向后平移运动 | speed:运动速度 times: 运动时间,单位毫秒 |
turn_left(speed=10, times=500) | 向左自旋 | speed:运动速度 times: 运动时间,单位毫秒 |
turn_right(speed=10, times=500) | 向右自旋 | speed:运动速度 times: 运动时间,单位毫秒 |
stop() | 停止运动 | 无 |
wave_hands() | 挥手 | 无 |
hit() | 击鼓 | 无 |
left_hand() | 举左手放下右手 | 无 |
right_hand() | 举右手放下左手 | 无 |
rise_hands() | 举起双手 | 无 |
set_volume(vol) | 设置音量 | vol:1~32,音量 |
play_sound(folder, track) | 播放音乐 | Folder:255 file name:‘1:刘备’、‘2:关羽’、‘3:张飞’、‘10:左转’、‘11:右转’、‘12:前进’、‘13:停止’ |
只需要import上面uprobot_movement.py文件,即可实现Python使用上述函数直接控制智元素,请同学们编写Python脚本测试以上函数。
需要注意的是,涉及到python文件的位置,使用库函数二次开发代码必须放在up_zhiyuansu_demo文件夹下,否则会出现找不到库文件的情况。