UGV02系列产品是一款具备超强的越野通过能力和抗震性能、开源全部代码可二次开发的六轮四驱移动机器人底盘。支持扩展多种上位机(树莓派、Jetson Nano、地平线旭日X3等),上位机通过串口与ESP32下位机进行通信。
内置3S 18650锂电池UPS供电模块(3节18650锂电池串联),为机器人提供持续能量来源的同时支持边充电边放电。内置多功能机器人驱动板,可扩展总线舵机、PWM舵机、SD卡等功能,驱动板基于ESP32,板载WIFI和蓝牙。
它采用了柔软的橡胶轮胎,极大减少了复杂地形冲击,并配有两条1020欧标型材扩展导轨,使其轻松满足重载、避震、越野等要求,为二次开发提供了更多的可行性。
注意:购买海外版的客户需要自行购买安装3个18650锂电池才可以正常使用,推荐使用高放电倍率的电池
UGV02的驱动板基于ESP32模组开发而来,在开机后,ESP32会优先连接已知的WIFI热点(后续教程会介绍如何设置已知WIFI),如果开机后20秒内WIFI没有连接成功,ESP32会自动建立一个热点。
热点名称:UGV02_BASE
热点密码:12345678
用手机连接这个热点后,手机会提示你这个热点没有网络,允不允许切换热点,要选择不允许,保持与UGV02_BASE热点的连接。
打开手机浏览器,推荐Google Chrome浏览器,访问网址 192.168.4.1,就可以打开UGV02_BASE的控制页面,你可以在这个页面上发送JSON格式的指令来控制和设置板载的总线舵机设备,获取总线舵机的反馈,获取IMU信息,控制PWM舵机角度,设置OLED显示屏的内容等,方便用户进行上位机开发。
Web端界面会实时显示机器人的电压、信号强度(STA模式)、航向角、IP和MAC地址等信息。
通过方向按键可以控制机器人运动,方向按键下面的SLOW、MIDDLE、FAST按键用来选择机器人的移动速度。
网页端包含了“心跳检测”,打开网页端控制界面后,Web端应用会与机器人进行连续通信,如果在机器人的运动过程中断开连接,机器人在短时间内会自动停止运动,避免危险。
当使用平板电脑或PC打开Web端控制界面时,你可以使用键盘上的WASD这几个按键来控制机器人,为了避免误操作,登陆后的前几下快捷键是无反应的,循环按一次或几次WASD这几个按键,就可以开始控制机器人了。
此Web端应用是完全开源的,你可以通过更改WebPage.h来更改Web端应用的界面和功能,你可以根据我们提供的二次开发教程,来学习如何对产品功能进行二次开发和扩展。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换。同时也易于机器解析和生成。
由于UGV02的板载资源比较多、例程功能丰富、同时兼顾方便扩展上位机,让上位机对于UGV02的控制功能更加丰富和方便,所以我们使用JSON指令通信来与UGV02进行交互,同样的,你也可以基于现有的框架对这些功能进行二次开发,让UGV02的功能更适合你的使用需求。
我们在例程中提供了两种与UGV02进行JSON指令交互的方式:
1.通过Web端应用(或者通过程序发送请求,可用于与上位机进行无线JSON交互)。
2.通过串口通信,UGV02的驱动板上面的40PIN扩展接口中有对应的RX、TX接口,采用3.3V逻辑电平(适用于树莓派、Jetson nano等上位机,不适用于串口逻辑电平为5V的Arduino Uno),你也可以通过Type-C接口和USB接口与上位机进行交互,UGV02驱动板上有两个Type-C接口,位于中间的Type-C接口用于与ESP32进行通信和上传程序,无论你使用那种方式与上位机连接,通信波特率都为1000000。
打开Web端控制界面后,你可以看到界面下方的FEEDBACK INFOMATION板块,板块上方有个输入栏和一个SEND按键,你可以将JSON数据填写到这里然后点击SEND按键,如果这个指令是有反馈的,那么反馈信息会显示在这个输入栏的上方,在输入栏的下方,是JSON指令的例子,每个例子的后面有个INPUT按键,点击它,这个指令会被填写到输入栏中,你可以在输入栏中编辑这个指令,然后按下SEND键与机器人进行交互。
当然,你也可以通过上位机来生成这种JSON指令通过串口发送给机器人,波特率1000000,串口RX/TX引脚逻辑电平3.3V,也可以使用Type-C接口的USB线进行通信。
后续会对每一条JSON指令进行解释,首先,我们以控制移动的JSON指令为例,控制移动的JSON指令为 SPEED_INPUT 后面的 {"T":1,"L":0.5,"R":0.5},点击这条指令后面的 INPUT,这条指令会被填写到上方的输入栏中,每一条JSON指令最前面的参数都是"T",它代表这条指令的类型,例如,"T":1 代表着这条指令是一条控制机器人移动的指令,移动命令,除了T参数,还有L和R两个参数,分别控制左侧电机的功率和右侧电机的功率,可以取-1到+1之间的数值(这个值越大,电机功率越高,速度越快,正值表示向前,复制表示向后),但是由于直流减速电机的低速特性,功率取值的绝对值需要大于等于0.2,当速度取值的绝对值低于0.2但不为零时,电机会以20%的功率运行,速度为正值时,车轮向前运行;速度为0时,车轮停止转动;速度为负值时,车轮向后转动。
例如,如果你希望机器人全速向后倒退,就可以将这条指令编辑为 {"T":1,"L":-1,"R":-1},点击SEND按键后,机器人会全速向后移动一段时间后停止,由于心跳检测的原因,当机器人在一段时间内没有收到新的指令,会自动停止运行,避免危险。
以下内容用来介绍每条JSON指令的含义:
EMERGENCY_STOP: {"T":0}
急停指令,如果指令类型T没有与其对应的函数,也会触发急停。
SPEED_INPUT: {"T":1,"L":0.5,"R":0.5}
移动控制指令,参数分别代表左侧电机功率和右侧电机功率,速度值可正可负,为±1时为满负荷运转,为0时停止,动作时的绝对值需要大于0.2小于1。
PID_SET: {"T":2,"P":170,"I":90}
电机闭环控制的PID控制,注意,该功能不适用于UGV02这种没有速度反馈的底盘
OLED_SET: {"T":3,"lineNum":0,"Text":"putYourTextHere"}
OLED屏幕显示内容设置,lineNum参数为行设置,可以为:0、1、2、3,共可以显示4行内容。每次设置一行内容,新的内容不会影响到其它行显示的内容,但是会替换掉这一行之前原有的内容。
Text参数为内容设置,你可以在这里输入文字,文字会显示在对应行上。
当使用这条命令后,OLED屏幕将不会再显示机器人的信息,而是会显示指令让他显示的内容
OLED_DEFAULT: {"T":-3}
指令类型为-3时,会将OLED屏幕重置为初始状态,显示机器人的信息。
PWM_SERVO_CTRL: {"T":40,"pos":90,"spd":30}
PWM舵机角度控制指令,PWM信号由驱动板的IO4引脚生成,大部分PWM信号的舵机转动范围为0-180°,pos参数为要转动到的角度,90°为舵机的中间位置,spd参数为预留的速度接口,例程中为避免堵塞线程,所以spd参数并没有用到。
PWM_SERVO_MID: {"T":-4}
PWM舵机转动到中间位置,也就是90°的位置。
BUS_SERVO_CTRL: {"T":50,"id":1,"pos":2047,"spd":500,"acc":30}
总线舵机控制指令,这里需要注意,连接的总线舵机工作电压与驱动板的供电电压是否符合,你可以直接使用我们的ST3215总线舵机。
id: 总线舵机的ID,与驱动板连接的总线舵机ID不可以有重复的。
pos: 要舵机转动到的目标位置,对于ST3215舵机,在角度控制模式下,这一数值可以为0-4095,对应0-360°的顺时针方向转动范围;在连续转动的模式下,数值可以为±32766。
spd: 总线舵机的转动速度,单位时间(每秒)内运动的步数,50步/秒=0.732RPM(圈/分钟),数值越大速度越快(但是舵机的速度是有极限的),参数为0时,以最大速度运行,
acc: 总线舵机转动的加速度,数值越小启停越平滑,数值可以为0-254,如设置为10,则按照1000步每秒的平方加速度变速,当参数为0时,则按照最大的加速度运行。
BUS_SERVO_MID: {"T":-5,"id":1}
将某个ID的总线舵机转动到舵机中位(前提是这个舵机的运行模式为0:位置伺服模式)。
id: 目标舵机的ID。
BUS_SERVO_SCAN: {"T":52,"num":20}
用于扫描总线上连接了哪些ID的舵机,不可以有重复ID。结果会反馈回来显示在输入栏上方。
num: 舵机的最大ID,数值越大扫描时间越长。
BUS_SERVO_INFO: {"T":53,"id":1}
用于获取某一个舵机的信息反馈,反馈内容包含舵机的位置、速度、电压、扭矩等信息。
BUS_SERVO_ID_SET: {"T":54,"old":1,"new":2}
用于更改一个舵机的ID,每个新舵机的ID默认都是1,如果你不知道手头的舵机ID,可以使用上面的 BUS_SERVO_SCAN 命令来获得,但是前提是当查看这个舵机ID时驱动板只连接了这一个舵机,否则你不知道哪个ID对应哪个舵机。
old: 要更改ID的舵机的ID
new: 要设置的新ID
BUS_SERVO_TORQUE_LOCK: {"T":55,"id":1,"status":1}
舵机扭矩锁开关。
id: 要控制扭矩锁的舵机ID。
status: 扭矩锁开关参数,1为开启扭矩锁,舵机会保持自己所在的位置;0为关闭扭矩锁,舵机会在外力的作用下转动。
BUS_SERVO_TORQUE_LIMIT: {"T":56,"id":1,"limit":500}
舵机扭矩限制命令。
id: 目标舵机的ID。
limit: 扭矩限制比例,500为 50%*堵转扭力,1000为 100%*堵转扭力,限制扭矩后,当舵机受到外力作用时,当外力的扭力大于限制扭矩后,舵机会随外力转动,但仍然会提供这一扭力,该功能可以用于制作机械臂的夹头。
BUS_SERVO_MODE: {"T":57,"id":1,"mode":0}
舵机运行模式。
id: 目标舵机ID。
mode: 运行模式值,0:位置伺服模式,用于控制舵机的绝对角度,可以使用 BUS_SERVO_CTRL 命令对舵机的角度进行控制;3: 步进伺服模式,也使用 BUS_SERVO_CTRL 命令对其进行控制,区别是步进伺服模式下,BUS_SERVO_CTRL 的 pos 参数是可以为负数的,范围为 ±32766,给4096,会正转一圈,给-4096,反转一圈。
WIFI_SCAN: {"T":60}
WIFI扫描指令,该指令会断开现有的WIFI连接扫描周围的WIFI热点。
WIFI_TRY_STA: {"T":61}
WIFI连接指令,STA模式,用于连接已知WIFI。
WIFI_AP_DEFAULT: {"T":62}
WIFI热点开启指令,AP模式,机器人会自己建立一个WIFI热点。
热点名称:UGV02_BASE
热点密码:12345678
WIFI_INFO: {"T":65}
用于获取WIFI信息
WIFI_OFF: {"T":66}
关闭WIFI。
INA219_INFO: {"T":70}
获取INA219的信息,包括电源的电压电流功率等信息。
IMU_INFO: {"T":71}
用于获取IMU信息,包括航向角、地磁场、加速度、姿态、温度等信息。
ENCODER_INFO: {"T":73}
用于获取电机编码器信息。(不适用于UGV02,因为UGV02的电机没有编码器)
DEVICE_INFO: {"T":74}
用于获取设备信息,设备信息是需要用户自定义的,用于介绍这个设备的用途或其它信息。
IO_IR_CUT: {"T":80,"status":1}
用于控制驱动板上面的IO5引脚的高低电平,可用于控制红外摄像头的夜视功能开关,也可以用于控制继电器。
SET_SPD_RATE: {"T":901,"L":1.0,"R":1.0}
用于调整每侧电机的功率,当给机器人左右电机相同的功率时,如果机器人的移动不是直线,可以使用这个命令来对两侧电机功率进行微调,这个数值会作为系数乘以电机的输出功率,来改变电机的功率。
L: 左侧电机的功率系数。
R: 右侧电机的功率系数。
GET_SPD_RATE: {"T":902}
获取左右两侧电机的功率系数。
SPD_RATE_SAVE: {"T":903}
保存电机的功率系数,会被保存在ESP32的nvs区,掉电后也不会丢失,开机后由nvs区读取并加载这个速度系数。
GET_NVS_SPACE: {"T":904}
获取ESP32的nvs区剩余空间。
NVS_CLEAR: {"T":905}
清理nvs区,该命令会删除nvs区的全部内容,速度系数会变回默认值1.0。