关 闭

新闻中心

EEPW首页 > 工控自动化 > 设计应用 > 一种物流机器人的设计与实现*

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

作者:严毓培,马维旻,杨裕,尹雪梅,潘强,汤佩豫,黎伟(珠海城市职业技术学院,广东珠海 519090)时间:2023-01-17来源:电子产品世界收藏
编者按:为了节省机器人开发的成本和功耗,工业领域一般采用非ROS系统开发机器人,本文阐述的仓储物流机器人的设计基于ARM架构的S5PV210的CPU,运行嵌入式Linux操作系统,降低了硬件成本,节省了电池功耗,同时根据定制需求开发,实时性比较高。机器人的ARM主板和单片机主板间通过定制的通信协议通信,外接了各种传感器以加强机器人的感知能力,通过嵌入式Linux下多进程的开发以实现多功能同步,图形界面采用嵌入式QT开发,通过mjpeg-streamer实现web远程视频监控,并设计了安卓APP以提供操控的便携性。


本文引用地址:http://www.eepw.com.cn/article/202301/442706.htm

*基金项目:

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

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

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

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

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

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

0   引言

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

1   硬件设计

本文中所设计的如图1 所示,硬件部分由 主板和电路板组成,具体的硬件框架如图2所示。

image.png

图1 设计的

1673929768216626.png

图2 硬件框架图

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

1673929857913889.png

图3 ARM开发板

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

1673929974826046.png

图4 单片机主板

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

image.png

图5 外接模块

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

1673930096855733.png

图6 激光传感器

2   软件设计

2.1 单片机的软件设计

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

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

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

1673930322820294.png

图7 单片机串口中断服务程序

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

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

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

1673930406351697.png

图8 发送实时电机速度的协议

2.2 嵌入式Linux的软件设计

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

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

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

1674009235117774.png

图9 嵌入式Linux的应用程序框架图

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

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

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

1674009383120417.png

图10 嵌入式Linux下液晶触摸屏的QT界面图

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

机器人的液晶触摸屏采用QT 的图形界面进行设计,其中界面布局可以在QT designer 中完成,并在QTdesigner 中直接添加槽函数[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”); 等函数完成显示。

1674009527704177.png

图11 基于mjpeg-streamer的web远程视频监控

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

1675306755894024.png

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

表1 终点角度和旋转方向的关系

1674009693423709.png

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

表2 前方1米范围内有障碍物时的判断

1674009798395679.png

1675307029266299.png

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

1674009944250434.png

图12 机器人动作决策的状态机图

2.3 安卓端的软件设计

image.png

图13 Android APP

机器人通过串口蓝牙模块和安卓手机连接,主要修改的文件是安卓系统里的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);

mStartButton.setOnClickListener(newShowStart());

forward . set On Click Listener(new Show Forward());

right.setOnClickListener(new ShowRight());

backward.set On Click Listener(new ShowBackward());

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);

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

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

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

1675307219170191.png

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.

(本文来源于《电子产品世界》杂志2023年1月期)

image.png


image.png


image.png


image.png




评论


相关推荐

技术专区

关闭