APP下载

QT、ROS下实现导航与自动避障功能小车

2020-05-08何威王建春曾奕雄谢穗文黄梓塨

机械工程师 2020年4期
关键词:树莓小车百度

何威, 王建春, 曾奕雄, 谢穗文, 黄梓塨

(华南理工大学 广州学院,广州515000)

0 引 言

本文所研究的导航与自动避障功能小车项目主要是使用Linux系统来完成的。使用Linux系统能保证跨平台的硬件支持、可靠的安全性、良好的稳定性,同时由于自动避障的功能是通过ROS平台实现的,分布式的ROS节点提供了各种高效的环境感知和运动规划等算法,并通过它们完成了系统的大部分运算,基于ROS已经实现了对大部分典型传感器和硬件设备的软件支持,如FireWare摄像头等[1]。同时,ROS在Linux中拥有简单的搭建与开发等功能,所以在开发的过程中能够省去很多不必要的步骤。

路径规划总体上可分为全局路径规划和局部路径规划,而路径规划又是自动避障功能小车项目的一个不可缺少的部分,它能够通过按一定的标准来规划路线,实现一条最优或近似最优的无碰撞路径,进而避开对障碍物的碰撞,以提高对小车的控制效果。

伴随着嵌入式系统计算能力的不断提高,强大的图像处理分析算法完全可以在灵活小巧、机动性强的嵌入式系统上运行。基于嵌入式系统进一步实现的计算机视觉完全可应用于安防领域和边海防等军事领域的实时监控[2]。

1 小车整体介绍

小车设计的目标是不仅能够实现智能化、自动化,而且还能实现运输物品、清扫路障等功能,与市面上物流公司的智能物流小车相比,具有更加灵活轻便和价格上的优势,是一款符合市场趋势的功能小车。而实现上述功能的关键点就是得有Linux系统的支持和ROS机器人操作系统的使用,同时借助百度地图API、树莓派、ROS自带的move_base框架等来实现上述功能。整个项目的流程是先利用GPS获得当前小车坐标,再输入目的地地址的坐标,通过百度地图API进行路径规划,使用激光雷达来实现实时避障的功能,在这基础上利用树莓派及WIFI传输数据获得当前小车实时位置发送到监控端,而控制模块move_base作为小车的最关键的点,其控制着小车的转向和速度,也间接地决定着路径规划、地图导航、自动避障等的准确性。

程序要点包括:1)局部路径规划与百度导航;2)树莓派通过WIFI发送传感器数据;3)控制模块move_base等几个方面,下文讲逐一讲解。

2 局部路径规划与百度导航

在全局路径的规划中需要使用百度地图API的导航功能,用GPS可确定当前位置的经纬度,然后选择目的地。通过百度地图API导航功能进行全局的路径规划,指引小车运动的大致方向。局部路径规划,意即自动避障。按照路径生成方式的不同可以将局部路径规划大致分为4类:基于图搜索的规划方法,基于曲线插值的规划方法,基于随机采样的规划方法及基于群智能优化的规划方法。A*算法和Dijkstra算法是最常用的基于图搜索的路径规划方法[3]。在这里我们采用的是ROS开源社区提供的ros-navigation导航集合包来进行局部规划,在导航功能指引的大致路线的情况下,如若在行驶的方向遇到障碍,通过自动避障的算法能躲避障碍,并且远程控制端可实现对小车的控制和位置信息读取。

2.1 局部路径规划

ROS开源社区提供的ros-navigation导航集合包中的move_base节点,是导航过程运动控制的最终执行机构,move_base订阅用户发布的导航目标move_base_simple/goal,实时运动控制的信号cmd_vel下发给底盘用以实现最终运动控制,move_base中的各种导航算法模块都是以插件的形式进行调用的,这样可以替换不同的算法以适应不同的应用,其中:local_planner用于局部路径规划;local_costmap是局部代价地图,用于描述局部环境信息;recovery_behaviors是恢复策略,用于机器人碰到障碍后自动进行逃避恢复,其中用到的costmap代价地图是利用激光雷达等数据生成的,大致原理是通过建立不同图层Layer然后叠加,被填充的栅格点表示有障碍物。实现自动避障的核心就是路径规划,路径规划就是利用环境障碍信息找到一条到达目标并且开销最小的路径。本项目使用的路径规划器是teb_local_planner,即基于弹性时间带碰撞约束的算法,算法将动态障碍物、运行时效、路径平滑等约束综合考虑。获取激光雷达所扫描后的信息,生成2D-costmap,在完成对tf坐标转换、信息参数配置、里程计及消息订阅之后,便能进行局部路径规划。

路径规划是基于网格表示,通过概率模型判断出障碍物所在的位置,起初使用的是单片成本映射,在成本映射中的大多数信息存储在同一个位置的主要限制,现在使用分层成本图,依然是使用二维的网格表示,但分层成本不是直接在网格里存储数据,而是有序的层列表,每层都跟踪与特定功能相关的数据,然后叠加至主成本。实现图层首先要创建扩展costmap2D:Layer类的新类,也就是实现初始化函数的updateBounds函数和updateCosts函数。先通过Gazebo模拟实验运行,经过多次运行成功后,再使用项目小车进行实验。

图1 一组costmap图层

2.2 百度导航

百度地图API是一套由JavaScript语言编写的应用程序接口,能够帮助程序员在网站中构建功能丰富、交互性强的个性化地图应用程序[3]。在QT中使用百度地图API,从百度地图API的开发文档中选择web端接口,在QT中显示地图、标点(当前位置点,目标位置点),输入目标名称得到其位置以及导航功能。由于在项目中使用的是QT5.6版本,QT5.6取消了QWebKits,而是使用QWebEngine。所以在UI设计师界面上就找不到QWebView,将游览器嵌入程序中,所以在此使用QWebEngineView,就能将HTML在程序中显示,Qt5.6 以后与JavaScript 交互可以使用runJavaScript()函数。由于在地图未加载完成时,无法完成交互,因此需要加入loadFinished(bool)进行判断。读取GPS模块的数据,常用的GPS模块大多采用NMEA-0183协议,GPS固定数据输出语句($GPGGA),是一帧GPS定位的主要数据,其标准格式为:

该项目主要需要使用的是:(2) 纬度(格式为dd mm. mm mm,即dd度,mm. mm mm分);(3)经度(格式为ddd mm. mm mm,即ddd度,mm. mm mm分);(12)差分基准站号(0000~1023),×为总和校验域;hh为总和校验数:35(CR)(LF)为回车,换行。GPS模块读取主要分为串口设置于数据读取,数据的分析和需要数据的提取。在Linux中串口设备文件是/det/ttyS0orttyS1。首先打开串口,然后根据GPS模块配置参数对波特率、校验等进行设置。对GPS数据处理中通过对读取的字符串数据的判断来提取,首先判断数据为什么类型,然后根据数据格式和逗号位置提取数据信息。得到的经纬度需要和百度地图坐标进行一个转换,转换通过百度地图API接口进行(如果使用离线地图则可以直接使用经纬度),现在可以使用百度地图API提供的控件加上输入的GPS数据信息实现当前位置点的标记。导航功能,在百度地图API开发文档中可以找到web端公交、驾车、步行路线规划,其服务地址是:http://api.map.baidu.com/direction//PC&Webapp服务地址。在参数说明中以下参数比较重要(项目当前只针对一个城市):origin(起点经纬度),destination(终点经纬度)及重要的coord_type坐标类型。可以得到导航系统的方向指引。将导航信息打包,按照规定的数据协议发布给决策层,决策层依据全局方向、局部方向进行判断。

3 树莓派通过WIFI发送传感器数据

在嵌入式平台之中,未改良的树莓派里面的CPU占用率占比相对于改良后的树莓派来说比较高,因此未改良版容易出现卡死的情况,在此我们选择改良后的树莓派以运行项目的算法,由于占用率充分下降,故能预留该算法的改进空间。考虑到树莓派的性能,首先在树莓派上使用客户端,通过QT的network功能将包括激光雷达、里程计及底层返回的数据信息发送至服务端。服务端处理完信息之后,将控制信息发送给树莓派,树莓派再通过串口发布给底层。QT的网络模块包括#include、#include < QtNetwork / QNet workRequest>、#include,可以直接获取信息。

4 控制模块move_base

在完成导航的决策之后使用move_base控制小车转向和速度,在ROS中可以直接调用相应的package。

其中需要目标位置、各坐标系之间的转换、里程计、激光雷达等的信息。Move_base会在cmd_vel的主题上发布Twist信息,包含期望的前进速度和转向。然后将数据发布给下位机便可以进行控制了。

图2 树莓派的GPIO口

图3 move_base的架构

5 实验测试

5.1 底层硬件环境搭建

硬件包括开发PC主机一台、树莓派2代B型一个、激光雷达Rp2A、GPS模块、STM32硬件控制器、电动机和相匹配的驱动、串口模块等搭建的三轮底盘。

三轮控制算法方面使用了PID算法,PID算法是一种广泛应用的闭环控制算法,在小车的运动控制层中,需要控制车轮以指定速度运动指定时间,若由于电池电压变化等原因影响电动机驱动能力,则小车的实际运动必然与上层指令不一致,通过引入PID算法对轮速进行闭环控制,可以精确控制小车的轮速,保持实际轮速与目标轮速一致。

图4 小车测试图片

5.2 上层软件算法设计

通过下位机串口获得当前GPS实时位置信息和激光雷达收集的附近障碍物信息,通过传感器算法融合,获得当前位置的雷达图。通过已知的GPS信息再与百度地图API结合,获得实时可用路径,再通过串口发送给下位机运动轨迹信息。

运用QT界面,融合上述两个算法,得到一个实时观察的界面信息,直观可靠地了解小车下一步的运动轨迹路径,如图5所示。

图5 QT界面融合

6 结 语

功能小车通过路径规划、百度导航、传输数据及控制运动4个方面来达到项目的要求,设计完成的小车不仅优于同类的功能小车,而且在降低出错概率的基础上有着实现快速到达指定位置的功能,真正能够实现自动化、自动避障、准确导航等功能。在以后的进一步研究会将载重功能、实际工作效率列为考察项,让小车可以实现真正的实用价值。

猜你喜欢

树莓小车百度
大车拉小车
自制小车来比赛
Robust adaptive UKF based on SVR for inertial based integrated navigation
基于树莓派的骑行智能头盔设计
刘老师想开小车
两轮自平衡小车的设计与实现
百度年度热搜榜
基于树莓派的远程家居控制系统的设计
响应面法优化红树莓酒发酵工艺
百度医生