|
发表于 2022-4-26 19:45:56
3710 浏览 8 回复
[新手上路]
解释Prometheus_px4 geo.cpp中一个函数 map_projection_project
prometheus问答
提问前请先确定以下问题:: |
是的 |
第一步:问题BUG描述: |
这个函数如何解算得到 x y z的? |
第二步:PX4版本是否为Prometheus_PX4_V1.11.1分支?: |
是 Prometheus_PX4_V1.11.1 |
第三步:测试prometheus_px4是否正常: |
正常 |
第四步:Prometheus版本是否为最新master?: |
是master版本 |
第五步:测试Prometheus是否正常: |
正常 |
geo.cpp中有个函数map_projection_project/* Transforms a point in the geographic coordinate system to the local
* azimuthal equidistant plane using the projection given by the argument
* @param x north
* @param y east
* @param lat in degrees (47.1234567掳, not 471234567掳)
* @param lon in degrees (8.1234567掳, not 81234567掳)
* @return 0 if map_projection_init was called before, -1 else
* */
int map_projection_project(const struct map_projection_reference_s *ref, double lat, double lon, float *x,float *y);
我将这个函数单独复制出来运算,发现运算结果与如下网址的计算结果有较大误差。
GPS经度纬度距离计算 GPS经度纬度距离计算 - 计算专家 (jisuan.mobi)
能否解释下函数中解算x y的原理? 也就是根据代码,解释计算原理。
我知道答案
回答被采纳将会获得 3 阿木币 已有8人回答
|
扫一扫浏览分享
|
|
|
|
|
|
|
楼主|
发表于 2022-4-26 19:55:48
如果您能解释通,并且最后计算偏差较小,可以再追加。 |
|
|
|
|
|
|
|
发表于 2022-4-27 09:20:16
您可以了解一下mavros中local_position相关的代码 |
|
|
|
|
|
|
|
发表于 2022-4-27 10:31:07
你这个是要GPS位置转换成本地坐标系的x y点么 这个geo.cpp 是px4中的代码 还是prometheus中的代码呢 |
|
|
|
|
|
|
|
发表于 2022-4-27 10:40:42
根据代码,解释计算原理。 你可以把代码贴出来啊 C++的代码 挨个分析计算可以吗 |
|
|
|
|
|
|
|
楼主|
发表于 2022-4-27 19:43:54
|
|
|
|
|
|
|
楼主|
发表于 2022-4-27 19:45:03
|
|
|
|
|
|
|
楼主|
发表于 2022-4-27 19:47:03
int map_projection_project(const struct map_projection_reference_s *ref, double lat, double lon, float *x, float *y)
{
if (!map_projection_initialized(ref)) {
return -1;
}
const double lat_rad = math::radians(lat);
const double lon_rad = math::radians(lon);
const double sin_lat = sin(lat_rad);
const double cos_lat = cos(lat_rad);
const double cos_d_lon = cos(lon_rad - ref->lon_rad);
const double arg = math::constrain(ref->sin_lat * sin_lat + ref->cos_lat * cos_lat * cos_d_lon, -1.0, 1.0);
const double c = acos(arg);
double k = 1.0;
if (fabs(c) > 0) {
k = (c / sin(c));
}
*x = static_cast<float>(k * (ref->cos_lat * sin_lat - ref->sin_lat * cos_lat * cos_d_lon) * CONSTANTS_RADIUS_OF_EARTH);
*y = static_cast<float>(k * cos_lat * sin(lon_rad - ref->lon_rad) * CONSTANTS_RADIUS_OF_EARTH);
return 0;
}
|
|
|
|
|
|
|
|
楼主|
发表于 2022-4-27 19:49:12
|
|
|
|
|
|
|