本次发布所使用硬件开发板,镶嵌esp32s3N16R8, WROOM-1模组:
UART0/UART1端口接线方式:
对应的机械臂结构、各轴为0时的位置、世界坐标系、dh参数对应部件长度示意图如下:
dawa e1.0 是一个六轴机械臂控制核心系统,可以用来构建机械臂控制手柄,它通过串口UART0接收用户指令,运算后在UART1输出六轴角度(或者多组六轴角度构成的序列)。 系统指令的反馈信息,将通过明文字符串的形式,在UART0输出。
对于用户通过UART0向esp32发送的指令,可以分为两类:
一类是需要附带若干浮点数的指令,比如设置末端工具矩阵的指令,则可以用一个结构体来包含所有指令信息(以下叫做“结构体指令”);
另一种是简单指示指令,比如指示末端向前移动,则可以用单个字符来区分,为了便于校验等功能,把需要发送的单个字符放到一个特定的数据格式里面并让该字符出现两次比如 "dawa0%c0%c"的格式(以下叫做“字符串指令”)。
接口及部分参数描述:
接口名称 | 用途/用法 | 速率 | 结构体 数据 | 收发字符串指令的方式 |
UART0 | 用户接口,使用开发板自带的标记为“com”的usb接口,参看上面接线图,该接口用来向esp32发送指令,并接收console信息。 | 115200 | struct struct_uart0 { char key; float inner_data[14]; };//参看key值分配表2 //通过c语言memcpy()函数将要发送到esp32的结构体放入一个字符串中发出。 | "dawa0%c0%c" (例如要发送有效字符‘q’时,发送的字符串为"dawa0q0q") 有效字符分配参看key值分配表1 esp32通过该接口发送的字符串,可以明文读取,系console信息。 |
UART1 | esp32与下位机接口, 使用 GPIO17(TX), GPIO18(RX), 参看上面接线图 该接口使用同一个结构体来收发(每组)7个浮点数信息。 | 115200 | struct struct_uart1 { char key; float inner_data[7]; }; //参看key值分配表3和表4 //通过c语言memcpy()函数将从esp32接收到的字符串存入结构体,然后可以读取结构体里面的数据,向esp32发送数据时也使用memcpy将结构体拷贝成字符串发送。,参看本表下面的代码示例。 | 无 |
发送结构体指令时使用的代码示例:
struct struct_uart0 dats0;
char data_send[64];
dats0.key='&'
dats0.inner_data[0]=2;
memcpy(data_send,&dats0,sizeof(dats0));
int p0=write(serial_port_0,data_send,sizeof(data_send));
发送字符串指令时使用的代码示例:
char datasend[11];
sprintf(datasend,"dawa0%c0%c",(char)key,(char)key);
write(serial_port_0,datasend,sizeof(datasend));
只需使用一个字符来区分指令的使用"dawa0%c0%c"发送的,有效字符分配如下:
key值分配表1 (系用户侧向esp32发送的数据)。
key字符 | ASCII码 | 对应功能 | 备注 |
w | 119 | 绕x轴正转(依据右手法则决定正反方向,下同) | 实际发送字符串为“dawa0w0w”以下以此类推 |
s | 115 | 绕x轴反转 | |
a | 97 | 绕y轴反转 | |
d | 100 | 绕y轴正转 | |
z | 122 | 绕z轴正转 | |
x | 120 | 绕z轴反转 | |
u | 117 | 沿y轴反方向移动 | |
j | 106 | 沿y轴正方向移动 | |
h | 104 | 沿x轴反方向移动 | |
k | 107 | 沿x轴正方向移动 | |
n | 110 | 沿z轴正方向移动 | |
m | 109 | 沿z轴反方向移动 | |
p(小写) | 112 | 选当前点存入规划路径所需序列selected_points里面 | |
q | 113 | 清空路径容器general_path,选好的点序列selected_points | |
R | 82 | 纯折线路径,拐点不带圆弧 | |
r | 114 | 通过容器selected_points所存储的点来规划折线路径并运行(带有梯形加减速) | |
[ | 91 | 参数样条曲线路径 | |
] | 93 | 均匀插值参数样条曲线路径 | |
{ | 123 | 首尾相接的均匀插值参数样条曲线路径 | |
} | 125 | 如果有规划路径存在,则向下位机发送主路径插值点序列对应的六轴角度序列。【注1】 | |
Y | 89 | 如果有规划路径存在,则运行该路径。 | |
. | 46 | 去掉末端工具矩阵【注2】 | |
@ | 64 | 去掉路径休息点 | |
b | 98 | 回到各轴都是0的姿态。 | |
^ | 94 | 路径暂停命令 | |
` | 96 | 结束暂停,继续运行原先的路径。 |
key值分配表2
对应结构体struct_uart0,系用户侧向esp32发送的数据。应该注意的是,对于和esp32互发数据而言,inner_data[]数组里的数据若表示旋转角度,那它是弧度制的角度。请注意做好角度/弧度的转换。
key字符 | ASCII码 | 对应功能 | struct_uart0中inner_data 数组的数据排列方式: 【注3】 |
+ | 43 | 选择参考点,与‘p’键功能类似,但‘+’会同时使用结构体struct_uart0里面的浮点数数组上报一组指定角度信息。这组角度信息会使esp32s3硬件内的当前角度切换为该组信息对应的角度值。 | {nx,ox,ax,px,ny,oy,ay,py,nz,oz,az,pz} |
? | 63 | 返回当前设置信息。 | 备用。 |
, | 44 | 实时控制的插值距离rt_inter_dis, 有效设置范围是0.1~15(毫米) 实时控制插值间隔时间rt_inter_time, 有效设置范围是0~18000,缺省值是5000 (微秒) 路径的插值距离troj_inter_dis, 有效设置范围是0.1~15(毫米) 和路径插值间隔时间troj_inter_time 有效设置范围是0~1000000,缺省值是15000(微秒), 快速向下位机发送主路径插值点对应的六个一组角度序列的发送间隔时间quick_dl_time, 有效设置范围是0~18000,缺省值是100(微秒) 【注4】【注2】【注5】 | { rt_inter_dis, rt_inter_time, troj_inter_dis, troj_inter_time, quick_dl_time } |
# | 35 | 设置末端工具长度(tool_length) | {tool_length} 【注6】 |
& | 38 | 设置路径循环次数(loop_times) 【注7】【注2】 | {loop_times} |
% | 37 | moveTo命令,末端运行到指定的位姿点。【注8】 | {nx,ox,ax,px,ny,oy,ay,py,nz,oz,az,pz} |
( | 40 | 设置末端工具矩阵【注2】 | {nx,ox,ax,px,ny,oy,ay,py,nz,oz,az,pz} |
) | 41 | 使用欧拉角设置末端工具矩阵 【注2】 | {oula_x,oula_y,oula_z,px,py,pz} |
: | 58 | 设置ABB型机械臂DH参数【注2】 | {d1,a1,a2,a3,d4,d6} 【注9】 |
; | 59 | 设置各轴角度运行范围。 【注2】 | { axis0_bottom,axis0_top, axis1_bottom,axis1_top,axis2_bottom,axis2_top,axis3_bottom,axis3_top,axis4_bottom,axis4_top,axis5_bottom,axis5_top,} |
key值分配表3
对应结构体struct_uart1,系esp32向下位机发送的同步数据。各轴数据是弧度制。
key字符 | ASCII码 | 对应功能 | struct_uart1中inner_data 数组的数据排列方式: |
| | 124 | esp32位机向下位机发送的各轴弧度值。 | {axis0,axis1,axis2,axis3, axis4,axis5,0,0 } |
! | 33 | esp32位机向下位机索取当前下位机各轴弧度值,附带发送上位机当前的各轴弧度值【注10】。 | {axis0,axis1,axis2,axis3, axis4,axis5,0,0 } |
key值分配表4
对应结构体struct_uart1,系下位机向esp32发送的同步数据。各轴数据是弧度制。
key字符 | ASCII码 | 对应功能 | struct_uart1中inner_data 数组的数据排列方式: |
! | 33 | 当下位机收到esp32发来的索取各轴信息的数据包(参看key值分配表3中的‘!’行)以后,发送的各轴弧度值给上位机。 【注11】 | {axis0,axis1,axis2,axis3, axis4,axis5,0,0 } |
注释表:
【注1】 | 供下位机使用者自行决定如何使用已经规划好的路径,比如自行决定插值间隔时间,在循环路径中使用何种方式返回路径起点等。 |
【注2】 | dh、末端工具矩阵、末端矩阵是否启用、普通路径循环次数、实时控制插值距离、路径插值距离和各轴角度范围一旦设置,会被存储在flash当中,都在下次esp32开机时沿用继续使用上次关机时的设置。 |
【注3】 | 从inner_data[0]开始,数据数量不足14时后面的内容可以填写0 inner_data[0]~inner_data[14]. |
【注4】 | 五项设置中,如果不想改动某个/某些设置项,只要把对应的数据项填写为负数即可。只有所填写的数据在其规定的范围内,设置才会有效。 |
【注5】 | 当执行一条路径时,用户可以通过调节插值间隔时间,让下位机获得两种插值序列处理方式:一种方式是使用表1中的’}’键对应的命令,下位机密集接收插值序列并缓存,同时根据下位机自己的时间步骤逐步执行插值点序列; 第二种方式是使用表1中的 :‘r’,’]’,’[’,’]’ ,’{’ 等键对应的命令,让路径插值间隔时间保持在一个较大的值(比如默认的15ms左右,下位机不进行插值时间的调整,接收一个点,就执行一个点。 |
【注6】 | 在末端工具矩阵关闭时才有意义。也就是设置末端工具矩阵后(末端矩阵启用),末端工具长度设置自动失效。 |
【注7】 | 均匀插值路径不受此设置影响。 |
【注8】 | 该命令沿用路径规划插值距离和插值时间,而非实时控制的插值距离和插值时间。 |
【注9】 | 各项dh数值都填写正数。 |
【注10】 | 下位机收到该命令以后,应该比对自己当前各轴角度信息与上位机角度信息的差值,如果差值较大,应该向上位机发送下位机当前角度信息,使esp32的角度信息与下位机保持一致。当系统无输入命令和无任务状态持续1秒以上时,esp32 会向下位机发送一次该数据包。 |
【注11】 | 也可以在没有收到esp32的索取数据包时自行发送,但如果此时esp32如果处于运行路径等非空闲状态,发送的数据会被esp32丢弃。 |
例程的使用:
运行例程的pc,通过两个usb接口与esp32 相连接,其中UART0可以直接用一根typeC-USB数据线与电脑usb接口连接,UART1则需要通过一个USB-串口ttl转接模块与电脑连接。它的角色是模拟下位机和模拟用户指令输入。
例程基于UBUNTU系统,使用c语言编写 ,它开启两个 子线程 dxh_0 和dxh_1. 分别用来收发来自esp32 UART接口的数据,
dxh_0 ------ UART0
dxh_1 ------ UART1
需要例程的小伙伴可以在评论区留电子信箱。