Ganos地理网格引擎支撑无人机路径规划能力实践

关于Ganos

Ganos是阿里云数据库产品事业部联合阿里云飞天数据库与存储实验室联合共同研发的新一代云原生位置智能引擎,它将时空数据处理能力融入了云原生关系型数据库PolarDB、云原生多模数据库Lindorm、云原生数据仓库AnalyticDB和云数据库RDS PG等核心产品中。Ganos目前拥有几何、栅格、轨迹、表面网格、体网格、3D实景、点云、路径、地理网格、快显十大核心引擎,为数据库构建了面向新型多模多态时空数据的存储、查询、分析、服务等一体化能力。

image

本文介绍的地理网格引擎能力,依托阿里云云原生关系型数据库PolarDB、云原生数据仓库AnalyticDB和云数据库RDS建设输出。

关于Ganos地理网格引擎

地理网格是一种再现地球表面的多边形网格单元集合,可以用于表示地物在地理空间中的位置信息,融合其他各类时空数据。地理网格计算一般由粗到细,逐级地分割地球表面,将地球曲面用一定大小的多边形网格进行近似模拟,其目标是将地理空间的定位和地理特征的描述一体化,并将误差范围控制在网格单元的范围内。每个网格单元都会进行编码,网格与编码是一一对应的。三维地理网格不只考虑经纬度,还把高度维纳入剖分和编码范围。

Ganos地理网格引擎目前涵盖GeoSOT和H3两种地理网格。GeoSOT是我国提出的一套地球空间剖分理论,并在此基础上发展出的一种离散化、多尺度区域位置标识体系。H3是Uber研发的一种覆盖全球表面的二维地理网格,采用的基本网格是正六边形。利用Ganos地理网格的函数可以将不同的空间范围转换为网格编码,可以求出网格编码的空间范围、层级和父子网格。Ganos支持退化网格计算(如下图),即充分利用网格的层级关系,用更精简的网格组合对空间范围进行表达。此外,Ganos自研地理网格索引,可用于高效查询网格码以及加速聚合计算。

image

Ganos地理网格支持无人机路径规划能力实践

业务需求

随着新能源技术的迅猛发展,低空经济已经逐步成为新的战略性新兴产业。低空经济是以各种有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引,辐射带动相关领域融合发展的综合性经济形态,它的应用场景丰富,既包括传统通用航空业态,又融合了以无人机为支撑的低空生产服务方式,在工业、农业、服务业等领域都有广泛应用,对构建现代产业体系具有重要作用,发展空间极为广阔。2024年,深圳率先发布《深圳经济特区低空经济产业促进条例》,为低空经济起飞铺就法治跑道;上海多年来积极打造华东无人机基地,目前华东无人机基地已先后成为国家级特色产业集群、上海市无人机特色园区、中国民航首批无人驾驶航空试验区、虹桥国际开放枢纽“华东无人机空港”等。

不同于传统的地表活动,低空活动具有立体性、区域性、融合性等特点,这些特点对于如何安全引导低空活动的顺利开展带来了一系列需要解决的技术问题。

  • 立体性:主要体现为“活动空间上的立体性”,低空空域是指垂直范围原则为真高1000米以下,可根据不同地区特点和实际需要,具体划设高度范围的空域为活动空间,将经济活动由地面向空中延伸、由“平面经济”向“立体经济”转变,表现为一种三维空间的立体经济形态;
  • 区域性:主要体现为“作用范围上的区域性”。与航空运输经济、高铁经济等大规模、大范围、一体化特征的经济形式不同,基于小飞机、小航线、小企业的低空经济具有小规模、小范围、分散性特点,具有明显的地域性和区域性特征;
  • 融合性:主要体现为“运行模式上的融合性”。与航空运输以及铁路、公路、水运等交通运输经济不同,低空经济的主要作用除了交通运输,更多的是行业服务,体现为“行业+航空”的模式,为该行业提供空中解决途径或辅助手段,以提升工作效率、降低成本、增强获得感等;

通过低空活动的特点我们可以发现,低空区域是没有路网的,在三维空间下如何保障低空设备的安全通过与到达、如何合理的划分低空区域的活跃周期与飞行器的活动规划是低空经济可以顺利落地并保障区域性活跃与安全的重要工作;

功能介绍

Ganos地理网格引擎提供了基于网格的路径规划能力,可以使用DEM、DSM、倾斜摄影等数据构建复杂环境下的无人机路径规划应用场景,相关能力简介如下:

ST_SetCost

用于给障碍物设置通行开销,障碍物可以是实体比如地面、建筑物,也可以是空间范围比如雷达扫描范围、风场空间。使用时首先要将障碍物的空间范围转换为网格数组,再进行通行开销设置。

ST_3DGridPath

无人机路径规划的最核心函数,根据用户提供的起始点终止点以及通行的开销数据,计算出最优的三维网格路径。支持不同的路径算法比如A*和DIjkstra,不同的移动方式比如是否允许斜向飞行,以及不同的距离计算方法比如曼哈顿和欧几里得。

同时,Ganos地理网格引擎还提供了ST_MatchGridLevel(依据给定的DES/DSM计算合适的用于路径规划的网格级别)、ST_CostUnion(合并所有障碍物通行开销到一个统一的开销数组,作为最终规划路线的输入等能力应对更为复杂的业务场景需求。

以上函数的详细使用请参见Ganos手册,手册计划2024年3月下旬上线。

最佳实践

我们以某个园区的倾斜摄影数据为例,演示三维路径规划在实际场景中的应用。

数据概况

测试数据形如:

image

数据入库与处理 

1. 网格路径规划功能依赖的扩展需要在使用前创建:

CREATE EXTENSION IF NOT EXISTS ganos_geomgrid CASCADE;
CREATE EXTENSION IF NOT EXISTS ganos_utility CASCADE;

2. 该数据存储于 OSS 中,使用 ST_ImportOSGB 将其导入(导入函数的详细介绍可以参考这里):

SELECT 
  ST_ImportOSGB(
    'test_oblique',
    'OSS://YOUR_OSS_AK:YOUR_OSS_SK@OSS_REGION/YOUR_BUCKET/YOUR_OSGB_PATH', 
    '{"parallel":16,"project":"building"}');

3. 将某一级别的瓦块整体转换为单一 GLB 格式,存入临时表 temp_glb 中,以 SfMesh 类型作为中间类型:

SELECT 
  ST_ImportGLB(
    'temp_glb', 
    ST_AsGLB(ST_Combine(tile)), 
    'temp_glb_1', 
    '{"ignore_texture":t
### 关于无人机按指定路径移动的代码修改方法 要实现无人机按照指定路径移动的功能,可以基于已有的路径规划算法(如 Q-Learning 或 A* 算法),并结合实际环境中的约束条件进行调整。以下是具体的技术细节: #### 1. 路径规划的核心逻辑 路径规划的目标是从起点到终点找到最优路径[^1]。如果已有路径数据,则可以直接将其作为输入传递给控制模块。例如,在三维空间中,可以通过 `ST_3DGridPath` 函数生成路径,并将结果转换为一系列坐标点。 ```cpp // 示例:调用 Ganos 地理网格引擎函数生成路径 std::vector<std::tuple<double, double, double>> generatePath(double startX, double startY, double startZ, double endX, double endY, double endZ) { std::vector<std::tuple<double, double, double>> path; // 设置通行成本矩阵 ST_SetCost(gridMatrix); // 计算路径 auto result = ST_3DGridPath(startX, startY, startZ, endX, endY, endZ); for (const auto& point : result) { path.emplace_back(point.x, point.y, point.z); } return path; } ``` 上述代码展示了如何使用 Ganos 的功能生成路径[^3]。返回的结果是一个由 `(x, y, z)` 组成的向量列表,代表无人机应依次经过的位置。 --- #### 2. 控制模块的设计 一旦获得路径点集合,就需要设计控制器使无人机沿这些点飞行。常见的做法是采用 PID 控制器或其他高级控制策略来跟踪路径上的每一个点。 ```cpp void followPath(const std::vector<std::tuple<double, double, double>>& pathPoints) { for (size_t i = 0; i < pathPoints.size(); ++i) { const auto &[targetX, targetY, targetZ] = pathPoints[i]; while (!isCloseEnough(currentPosition(), {targetX, targetY, targetZ})) { adjustDronePosition(targetX, targetY, targetZ); // 使用PID调节位置 } if (i != pathPoints.size() - 1) { delayBetweenWaypoints(); // 如果不是最后一个点,等待一段时间再继续下一个点 } } } bool isCloseEnough(std::tuple<double, double, double> currentPos, std::tuple<double, double, double> targetPos) { constexpr double threshold = 0.1; // 阈值可根据需求调整 return distance(currentPos, targetPos) <= threshold; } double distance(const std::tuple<double, double, double>& a, const std::tuple<double, double, double>& b) { return sqrt(pow(std::get<0>(a) - std::get<0>(b), 2) + pow(std::get<1>(a) - std::get<1>(b), 2) + pow(std::get<2>(a) - std::get<2>(b), 2)); } ``` 此部分实现了逐点跟随机制,确保无人机能够精确到达每一步的目标位置[^2]。 --- #### 3. 外部因素的影响处理 在某些情况下,外部干扰可能影响无人机的实际飞行轨迹。例如,光源强度的变化可能会改变蜣螂类生物的行为模式[^4]。因此,可以在程序中引入动态权重因子以适应不同的场景。 ```cpp double calculateDynamicWeight(double lightIntensity) { // 根据光照强度计算权重 return exp(-lightIntensity / maxLightIntensity); } ``` 该函数可以根据当前环境下的光线情况实时更新权值,从而微调路径规划过程中的优先级。 --- #### 总结 通过以上步骤,可以从路径生成、路径追踪以及外界变量补偿三个方面完成对现有代码的改造工作。最终使得无人机能够在复杂环境下稳定地遵循预设路线行驶。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值