一种物流机器人的设计与实现

2023-05-30 09:56:20严毓培马维旻杨裕尹雪梅潘强汤佩豫黎伟
电子产品世界 2023年1期
关键词:单片机

严毓培 马维旻 杨裕 尹雪梅 潘强 汤佩豫 黎伟

摘要:为了节省机器人开发的成本和功耗,工业领域一般采用非ROS系統开发机器人,本文阐述的仓储物流机器人的设计基于ARM架构的S5PV210的CPU,运行嵌入式Linux操作系统,降低了硬件成本,节省了电池功耗,同时根据定制需求开发,实时性比较高。机器人的ARM主板和单片机主板间通过定制的通信协议通信,外接了各种传感器以加强机器人的感知能力,通过嵌入式Linux下多进程的开发以实现多功能同步,图形界面采用嵌入式QT开发,通过mjpeg-streamer实现web远程视频监控,并设计了安卓APP以提供操控的便携性。

关键词:物流机器人;ARM;嵌入式Linux;单片机;QT图形界面

*基金项目:

1)广东省普通高校特色创新类项目(自然科学)(2018GKTSCX056)

2)广东普通高校重点项目(自然科学)(2019GZDXM014)

3)珠海城市职业技术学院2021年科研项目(KY2021Y01Z)

4)2020年教育部高等学校项目(2020ITA03008)

5)2022年广东省科技创新战略专项资金(pdjh2022b0992)

6)2021年校级质量工程师资项目(ZLJS2020120622,ZLJS2020120623,ZLJS2020120624)

0 引言

目前大部分的机器人都是基于 ROS 系统实现,一般 ROS 在 Ubuntu 系统中的稳定性最好,因此需要 Intel或者高性能 ARM 架构的 CPU 的支撑,但存在的问题是硬件成本高,功耗高,产品的体积大。同时 ROS 系统中有很多功能对于某些特定的应用场景而言是冗余的,这些冗余的功能会使系统庞大,占用很多内存和 CPU的资源,而且机器人反应不够灵敏,实时性较差。如果将 ROS 移植到基于 ARM 架构的低成本低功耗的 CPU上,或者对 ROS 系统进行裁剪以去掉冗余的部分,存在工作难度大周期长的问题,而且 ROS 后期运行时不够稳定。因此要设计一款在特定应用场景中运行的低成本低功耗的机器人,不应采用 ROS 系统开发,而应根据具体需求采用适用于特定应用场景下的定制化的软硬件设计方案,在降低成本功耗体积的同时可以提高系统的稳定性和实时性。

1硬件设计

本文中所设计的物流机器人如图1所示,硬件部分由 ARM 主板和单片机电路板组成,具体的硬件框架如图2所示。

其中 ARM 主板采用了 S5PV210的 CPU,带有512 MB 的 RAM和512 M 的flash,LCD 触摸屏,SD 卡插槽,3个 USB 接口和4个串口,运行嵌入式 Linux 操作系统[1],如图3所示。利用该主板可实现机器人的激光雷达扫描,LCD 触摸屏显示,机器人与手机 APP 之间的蓝牙通信,运行mjpeg-streamer 的实时 web 远程视频监控等功能。

ARM 主板的 CPU 是 S5PV210,运行嵌入式 Linux 系统,嵌入式 Linux 系统是非实时系统,无法准确读取25 kHz 的光电编码器的脉冲,因此用单片机进行电机控制和光电编码器的脉冲读取,单片机与 ARM 主板之间用自定义的通信协议传输光电编码器读取的数据[2],如图4所示。

机器人外接模块可以为机器人提供更加丰富的功能,如图5所示,其中 USB 摄像头用来提供机器人现场的视频,USB-Wi-Fi 模块用来将摄像头的视频传输到远程客户端的 web 页面,串口蓝牙模块用来和手机 APP 连接,飞控模块包含 GPS,陀螺仪,电子罗盘,加速度计等传感器,并内置了传感器融合等算法,为室内机器人判断运动方向提供参考[3]。

机器人可连接激光传感器,该传感器可以扫描周围的环境,得到周围6 m 范围内的每个障碍物的角度和距离,如图6所示。

2软件设计

2.1单片机的软件设计

机器人的直流电机连接着减速电机,因此光电编码器一秒钟可以读入25 kHz 的脉冲,但嵌入式 Linux 操作系统是非实时的操作系统,读取脉冲不够准确[4],因此用单片机来读取25 kHz 的脉冲,并将脉冲值通过串口自定义的简单协议传给 ARM 开发板。

单片机采用 STC15F2K60S2,其中外部中断0和外部中断1分别用来读取左右两个电机的光电编码器的脉冲,定时器0设置为8位重装用以设置波特率为115200。定时器1每4 ms中断一次,在中断服务程序里,生成可以驱动直流电机转速的占空比,每200 ms计算一次轮子的速度,假设两个电机的光电编码器的脉冲数为 P,轮子转一圈是25000个脉冲,轮子的半径是 r,则轮子的速度为2×3.14×9/25000,并进行1 s 的定时[5]。

串口中断服务程序根据从 ARM 板获取到的串口信息控制两个电机的启动停止、转动方向、设定速度,如图7所示,可通过手机 APP 或者机器人的液晶触摸屏上的按钮控件来发送这些指令,因点击按钮是间断性的动作,同时发送两次设定速度的按钮的时间间隔会比较久,所以在获取设定速度时如果 buffer[2]的值有可能等于13,即’/r’,也不会认为这是新的一条指令。

主程序每秒钟发送两个电机的速度到 ARM 板,因嵌入式 Linux 系统底层读取串口数据是不定时的,很多情况下会读取到一个不完整的包[6],考虑到机器人的速度不可能达到 65 535 mm/s,因此可以将通信协议简单设计如下:

当嵌入式 Linux 读到两个连续的 0xFF,则认为是一个新的包的开始,将后面接收到的数据存放起来,直到读满 6 个字节再开始计算两个轮子的速度。

主程序中每秒将计算设定速度的上下限,上限是设定速度的 105%,下限是设定速度的 95%,当电机的速度在上下限之间不需调节占空比,否则每 200 ms调节一次占空比。

2.2 嵌入式Linux的软件设计

系统从 QT 的TMainForm進入后分别对mjpegstreamer,GPIO,串口,液晶屏,摄像头进行初始化,并启动 QT 的定时器,每 1 s 刷新一次控件。

在robot_start的进程中设置一个死循环,不断从串口 0 连接的串口蓝牙模块来获取手机 APP 发送过来的命令并加以执行,同时不断从串口 3 连接的单片机来获取机器人的速度,通过与设定的速度对比后向单片机发送占空比,并根据累积的脉冲数计算机器人行走的总里程和某时刻的朝向。

由于 GPS 传感器、陀螺仪、加速度计、磁力计和电子罗盘等传感器在室内无法使用 [7],该方法使用里程计信息对机器人的位置和角度进行计算,因此机器人的朝向可以通过刚体的运动计算得出。

移动机器人的轮子由电机带动,轮子的直径为 D,则轮子的周长为πD,电机转动的圈数 m 可以由光电编码器获取,当机器人在前进或者后退状态,移动机器人移动的距离 S 可以由 S = m×πD得到。

机器人在每 1 s 求 1 次角度,并计算角度的累计和,以此判断出机器人的朝向,因为激光数据处理的进程也会对角度数据进行读写操作,因此在以上流程执行前需要加上互斥锁mutex_lock,执行完毕后关闭互斥锁 [8]。

串口 3 连接飞控模块,根据模块提供的通信协议,每 1 s 获取 1 次飞控模块的经纬度的数据,经度和纬度数据都是 4 个字节,需要拼接后得到十进制的经纬度,当机器人如果到室外运动时可以通过经纬度对机器人进行粗略的定位。

机器人每 1 s 也会判断设定速度是否发生改变,如果改变了就会根据新的设定速度计算占空比并下发到单片机,如果机器人按照设定速度来调整占空比,会出现机器人的速度忽大忽小的情况,因此将速度上限定为设定速度的105%,速度下限定为设定速度的95%,误差率为±5%,当机器人的速度在速度的上下限范围内则不用调整占空比,机器人可以运行得更平稳[9]。

机器人的液晶触摸屏采用 QT 的图形界面进行设计,其中界面布局可以在 QT designer 中完成,并在 QT designer 中直接添加槽函数[10],可通过qt_second()函数每秒钟对界面的控件进行刷新,当按钮单击后按钮文本会发生变化,可通过PushButton->setText函数完成按钮文本的设计,同样设定速度的输入框可以通过 LineEdit1->setText(QString::number(setup_speed)); 完成设计,单击+、-两个按钮可以修改机器人的设定速度,当机器人的设定速度大于1 m/s 或者小于0时,弹出警告框QMessageBox::information(this,”Error ”, “speed should be in range 0-999 mm/s ”);,设定速度、两个电机的速度、经纬度数据可通过以下 TextLabel2->setText(QString::number(setup_speed)+”mm/s ”);等函数完成显示。

机器人通过以上mjpeg-streamer 组件的代码完成了web 远程视频监控的功能,可在远程打开firefox浏览器看到机器人上摄像头拍到的视频[11],相关实现代码如下:

if(webcamera==0)

{

int mjpg_streamer2;

char arg[40]=”/mjgp-streamer/start_uvc_yuv.

sh”;

mjpg_streamer2=system(arg);

if((mjpg _ streamer2==127)||(mjpg _ streamer2<0))

webcamera=0;

else

webcamera=1;

printf(“the mjgp_streamer2 is %i\n ”,mjpg_ streamer2);

}

激光探头可以测量到周围障碍物的距离和角度,当激光探头发现在320~40的范围内,在距离激光探头1 m 的范围内有移动障碍物,则变量stop_forward=1,否则该变量为0,该角度和距离可以根据实际机器人的情况做相应调整。同理当激光探头发现在40到140的范围内,在距离激光探头1 m 的范围内有障碍物,则变量stop_right =1,否则该变量为0。如果变量 stop_ forward =1,则此时机器人需要旋转到某个角度,从周围障碍物的缝隙中出去。

根据表1的内容,移动机器人可判断下一秒是前进、右转、左转或者后退,如果沿着终点角度的方向有障碍物,则根据表2的判断,移动机器人计算出一个与终点角度最近且缝隙间隔大于机器人宽度的角度,沿着该角度的中线方向移动出去[12]。

if(angle<last_data[0]){

new_start=1;

if((max_data[1]>=40.0)&&

(max_data[1]<=140.0))

turning_right++;

else if((max_data[1]>=220.0)&&

(max_data[1]<=320.0))

turning_left++;}

if((angle>320)||(angle<40)){

if((distance<800.0)&&(distan

ce>0.0)){

stop_forward++;}}

if((destination _ angle >40)&&(destination _

angle<320)){

if(angle<=(360-destination_

angle+30))&&(angle>=(360-destination_angle-30))){

if((distance<1000.0)&&(dista

nce>0.0)){

stop_destination++;}}}

可利用状态机处理该部分代码,一共有3种状态,第1种是在左转或者右转中以寻找终点方位的状态,第2种是前进或者后退中不断向终点靠近,第3种状态是

寻找新的空隙的状态。

2.3安卓端的软件設计

机器人通过串口蓝牙模块和安卓手机连接,主要修改的文件是安卓系统里的 BluetoothChat.java 文件,以下是控件的初始化:

mInputEditText =(EditText) findViewById(R . id.editText1);

mInputEditText.setGravity(Gravity.TOP);   mInputEditText .setSelection(mInputEditText .

getText().length(),

mInputEditText.getText().length());

mInputEditText.clearFocus();

mInputEditText.setFocusable(false);

mStartButton=(Button)super .findViewById(R . id.button_start);

forward=(ImageButton)super .findViewById(R . id.imageButton_forward);

backward=(ImageButton)super.findViewById(R. id.imageButton_backward);

left=(ImageButton)super .findViewById(R . id.imageButton_left);

right=(ImageButton)super .findViewById(R . id.imageButton_right);

mS tartButton . s etOnClickListener(newShowStart());

f o r w a r d . s e t O n C l i c k L i s t e n e r(n e w ShowForward());

right.setOnClickListener(new ShowRight());

ba c kward . se t OnCli c kList e ne r(ne wShowBackward());

left.setOnClickListener(new ShowLeft());

mTitle =(TextView) findViewById(R .id .title_ left_text);

mTitle.setText(R.string.app_name);

mTitle =(TextView) findViewById(R .id .title_ right_text);

HEXCheckBox =(CheckBox) findViewById(R. id.radioMale);

breakButton=(Button) findViewById(R . id.button_break);

m Bl u e t o ot hAdapt e r = Bl u e t o ot hAdapt e r . getDefaultAdapter();

checkBox_sixteen =(CheckBox) findViewById(R.id.checkBox_sixteen);

如果在 APP 上按下启动按钮,按钮的文本会变成“停止”,同时向机器人的串口蓝牙模块发送”Start ”字符串,机器人通过串口收到后调用 start()函数启动机器人,以下是安卓端的具体实现。

class ShowStart implements OnClickListener{

public void onClick(View v){

String message1;

if(system_start==true){

system_start=false;

mStartButton.setText(“Start ”);

message1=“stop\r ”;

}

else{

system_start=true;

mStartButton.setText(“Stop”);

message1=“start\r ”;

}

try {

message1.getBytes(“ISO_8859_1”);} catch(UnsupportedEncodingExceptione){

e.printStackTrace();}

sendMessage(message1);}}

APP 的其他控件介绍如下:buletooth data buffer 区域显示的是机器人和安卓手机通过蓝牙通信的数据,full screen 按钮可将该区域全屏显示,hex display 单选框可以切换该区域数据的十六进制和十进制的显示,clear screen 按钮可以清空该区域的数据显示,connect 按钮可以启动或者关闭安卓手机和机器人之间的连接,stop 按钮可以启动或者停止机器人,speed(mm/s)用来显示机器人的实时速度,hex output 单选框用来切换速度的十六进制或十进制的显示,longitude 显示机器人所在位置的经度,latitude 显示机器人所在位置的纬度,angle 需要输入机器人相对于导航终点的朝向角度,distance 需要输入机器人相对于导航终点的距离,这是一种角坐标的表示,有了这两个数据就可以确定导航终点相对于机器人的具体位置,laser scan stop 按钮可以切换激光传感器的启动和停止,send speed 按钮可以发送机器人的设定速度,send position 按钮会将 angle 输入框和 distance 输入框的内容发送到机器人,以便机器人了解导航终点的位置,navigation 按钮用来切换手动移动和自动导航模式,整体界面左下方的上下左右四个箭头按钮可以控制机器人前进,后退,左转和右转,界面右下方显示机器人的实时速度,电机1和电机2的速度,以及距离机器人最近的障碍物的距离。

3结束语

本文阐述了一种非 ROS 系统的定制化物流机器人的软硬件设计方案,该设计方案可以节省机器人的成本和功耗,并增强了系统的稳定性和实时性,通过实验验证,机器人运行稳定高效,说明该设计方案具有一定的实用性和可靠性。

参考文献:

[1]毛文平,李帅永,谢现乐,等.基于自适应机制改进蚁群算法的移动机器人全局路径规划[J].控制与决策,2022,(2):19-25.

[2]潘圆媛.物联网环境下的移动机器人定位的应用[J].科技资讯,2022,20(16):20.

[3]苏青.多机器人路径规划与协同避碰研究[D].南京:南京邮电大学,2014.

[4]鲍敦桥.仿真类人机器人设计及高层决策方法的研究[D].合肥:合肥工业大学,2009.

[5]马斌奇.多机器人协作与控制策略研究[D].西安:西安电子科技大学,2009.

[6]朱可平,王菲菲,吴加.移动机器人核心技术发展趋势[J].物流技术与应用,2022,27(9):5.

[7]毛福新,闫光辉,陈俏锐,等.智能物流场景搬运机器人系统优化[J].天津职业技术师范大学学报,2022,32(3):7.

[8]韩雪峰.导盲机器人[D].哈爾滨:哈尔滨工程大学,2009.

[9]马斌奇.多机器人协作与控制策略研究[D].西安:西安电子科技大学,2009.

[10]李橙,卫星,周游,等.基于激光视觉引导的智能物流分拣机器人控制研究[J].激光杂志,2022,43(8):43.

[11]张文辉,齐乃明,尹洪亮.自适应神经变结构的机器人轨迹跟踪控制[J].控制与决策,2011,26(4):4-6.

[12]付晓艳,白雪,魏博凝.基于机器学习的物流自动分拣机器人定位精度检测算法[J].自动化与仪器仪表,2022(8):5-9.

猜你喜欢
单片机
基于单片机的SPWM控制逆变器的设计与实现
电子制作(2019年13期)2020-01-14 03:15:28
基于单片机的层次渐变暖灯的研究
电子制作(2019年15期)2019-08-27 01:12:10
基于单片机的便捷式LCF测量仪
电子制作(2019年9期)2019-05-30 09:42:02
小议PLC与单片机之间的串行通信及应用
电子制作(2018年12期)2018-08-01 00:48:04
基于单片机的平衡控制系统设计
电子制作(2017年19期)2017-02-02 07:08:27
Microchip推出两个全新PIC单片机系列