Spring Boot中使用PostgreSQL数据库
在如今的关系型数据库中,有两个开源产品是你必须知道的。其中一个是MySQL,相信关注我的小伙伴们一定都不陌生,因为之前的Spring Boot关于关系型数据库的所有例子都是对MySQL来介绍的。而今天我们将介绍另外一个开源关系型数据库:PostgreSQL,以及在Spring Boot中如何使用。 PostgreSQL简介 在学习PostgreSQL的时候,我们总是会将其与MySQL放一起来比较:MySQL自称是最流行的开源数据库,而PostgreSQL则标榜自己是最先进的开源数据库,那么有多先进呢?下面就一起认识一下它! PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中。PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询、外键、触发器、视图、事务完整性、多版本并发控制等。同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型、函数、操...
进入global_planning功能包的src文件夹下,我们可以看到5个cpp文件,如下图所示,
A_star.cpp:实现A_star规划的功能的主要部分; global_planner.cpp:主要定义了一些消息的接收端,如飞机状态、点云数据、目标点状态等消息的接收,为A_star算法做准备工作的文件; global_planner_node.cpp:主函数,创建一个global_planner的对象来调用a_star算法; occupy_map.cpp:它主要承担将传感器获得的障碍物的点云数据转化为栅格地图中障碍物的信息,为A_star规划算法做准备; tools.cpp:主要用于向终端发布,用户所关心的一些消息,或是反应程序进程的消息; 下面我们来看看A_star规划具体是怎么实现的。 首先我们进入主函数会发现它只有短短的几行,如下图所示。
其中最主要的代码,已用红框圈出,它申明了一个Global_Planner类的对象叫global_planner,然后调用global_planner对象的init函数; 接下来我们进入init函数,init函数是定义在global_planner.cpp这个文件下的,如图所示。
它首先是读取一些必要的参数,每个参数所代表的含义已在图中给出;然后它会订阅目标点、无人机状态、地图的更新方式等等,订阅端收到消息,会将收到的消息传入回调函数,对数据进行处理; 然后还初始化了一些发布者,用来发布对应的消息,每个函数对应什么功能已在图中给出;
接下来我们需要先初始化一个A_star规划器,代码如图所示,我们申明了一个叫Astar的对象,和指向它的指针Astar_ptr;然后将句柄传入A_star对象的init函数中;
这个函数是申明在A_star.cpp文件下的,如图所示。
首先也是先读取一些必要的参数,具体的参数信息已在图上给出; 申明了一个tie_breaker_,这个参数主要是为了防止出现对称性的路径,所以在算出的某条路径的代价的基础上,放大一个极小量,以减少对称路径出现的概率; path_node_pool_是用来存放规划器已经访问过的节点的容器,容器中的每一个成员表示栅格地图上的每个点,它包含了地图点的位置、状态等等; 然后使用Occupy_map_ptr对象的init函数初始化地图; 



drone_state_cb函数,读取飞控返回的飞机状态;
mainloop_cb主循环回调函数,负责最主要的规划问题;
进入mainloop_cb函数, 
以上代码,检查exec_state状态,我们重点阅读一下红框部分的代码,首先是重置一下A_star规划器,代码如下,
清空了扩展节点集、路径节点集,申明一个空白的优先级序列,将空白优先级序列,与open_set_集交换,即清空开集;把之前处理过的节点挨个取出,恢复初始化状态,最后把use_node_num_和iter_num_置0,回归初始化状态,执行完毕。 返回mainloop_cb函数,执行下一句,即进入Astar::search函数,如下,
首先检查,目标点处是否有障碍物,无障碍物才会继续执行下面的程序; 然后初始化起始点,申明一个node结构体的对象,用来存放起点的数据,具体代码如上; 然后把起点对象放入开集中,准备进入主循环!
主循环代码如上,首先检查open_set不为空,则取出开集中f值最小的节点,然后判断取出的节点是否达到了终止条件。 如果达到了终止条件,就将当前节点赋给terminate_node,然后将其传入retrievePath函数,往回搜寻,得到路径存入path_node_容器中,代码如下;
如果没达到终止条件,则将当前节点弹出开集放入闭集中,然后对当前节点进行扩展,代码如下;
一直这样不断搜索,直到开集为空,或是达到终止条件,或是达到最大搜索次数,才结束循环。 以上就是Prometheus项目中,A_star算法的代码具体实现流程。 最后附上A_star仿真运行截图,
以上就是P系列无人机激光避障功能的代码研读了,相信大家看完之后,对代码有了深一层的理解,也欢迎大家能够参与进来优化代码,提交issues,在此开源项目Prometheus小组成员感谢支持,感谢贡献。