CARLA
 
载入中...
搜索中...
未找到
GeoLocation.cpp
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
8
10#include "carla/geom/Math.h" // 包含数学函数的声明
11
12#include <cmath>
13
14#if defined(_WIN32) && !defined(_USE_MATH_DEFINES) // 如果在Windows平台上且没有定义_USE_MATH_DEFINES
15# define _USE_MATH_DEFINES
16# include <math.h> // cmath is not enough for MSVC
17#endif
18
19namespace carla {
20namespace geom {
21
22 /// 定义地球赤道半径的常量,单位是米
23 static constexpr double EARTH_RADIUS_EQUA = 6378137.0;
24
25 /// 将纬度转换为墨卡托投影所需的比例尺
26 ///
27 /// 输入参数:纬度(度)
28 /// 返回值:比例尺因子
29 /// 注意:在lat/lon和mercator之间转换时
30 /// 或者反过来,两次转换中使用相同的比例尺
31 static double LatToScale(double lat) {
32 return std::cos(Math::ToRadians(lat));
33 } // 将纬度转换为弧度并计算余弦值作为比例尺
34
35 /// 将纬度、经度和比例尺转换为墨卡托坐标系中的mx/my
36 ///
37 template <class float_type> // 模板函数,允许使用不同的浮点类型
38 static void LatLonToMercator(double lat, double lon, double scale, float_type &mx, float_type &my) {
39 mx = scale * Math::ToRadians(lon) * EARTH_RADIUS_EQUA; // 计算mx
40 my = scale * EARTH_RADIUS_EQUA * std::log(std::tan((90.0 + lat) * Math::Pi<double>() / 360.0)); // 计算my
41 }
42
43 /// 将墨卡托坐标系中的mx/my转换回纬度、经度
44 static void MercatorToLatLon(double mx, double my, double scale, double &lat, double &lon) {
45 lon = mx * 180.0 / (Math::Pi<double>() * EARTH_RADIUS_EQUA * scale); // 计算经度
46 lat = 360.0 * std::atan(std::exp(my / (EARTH_RADIUS_EQUA * scale))) / Math::Pi<double>() - 90.0;// 计算纬度
47 }
48
49 /// 在给定的纬度、经度上添加米为单位的dx/dy,并返回新的纬度、经度
50 static void LatLonAddMeters(
51 double lat_start, // 起始纬度
52 double lon_start, // 起始经度
53 double dx, // 要添加的x方向的米数
54 double dy, // 要添加的y方向的米数
55 double &lat_end, // 输出参数:结束纬度
56 double &lon_end) { // 输出参数:结束经度
57 double scale = LatToScale(lat_start); // 计算起始纬度的比例尺
58 double mx, my; // 墨卡托坐标系中的临时变量
59 LatLonToMercator(lat_start, lon_start, scale, mx, my); // 将起始经纬度转换为墨卡托坐标系
60 mx += dx; // 在x方向上添加米数
61 my += dy; // 在y方向上添加米数
62 MercatorToLatLon(mx, my, scale, lat_end, lon_end); // 将墨卡托坐标系的坐标转换回经纬度
63 }
64
65 GeoLocation GeoLocation::Transform(const Location &location) const { // GeoLocation类的成员函数,用于转换Location对象
66 GeoLocation result{0.0, 0.0, altitude + location.z}; // 创建一个新的GeoLocation对象,其高度是当前高度加上location的z坐标
67 LatLonAddMeters( // 调用函数在当前GeoLocation上添加location的x和y坐标
68 latitude, longitude, // 当前纬度和经度
69 location.x, -location.y, // 反转y轴,使得纬度向北增加
70 result.latitude, result.longitude); // 输出新的纬度和经度
71 return result; // 返回新的GeoLocation对象
72 }
73
74} // namespace geom
75} // namespace carla
double altitude
经度,初始化为0.0。
Definition GeoLocation.h:27
GeoLocation Transform(const Location &location) const
使用此对象作为地理参考,将给定的 location 转换为 GeoLocation。
double latitude
定义 GeoLocation 类,它是一个公开的成员。
Definition GeoLocation.h:23
double longitude
纬度,初始化为0.0。
Definition GeoLocation.h:25
static constexpr T ToRadians(T deg)
Definition Math.h:47
static double LatToScale(double lat)
将纬度转换为墨卡托投影所需的比例尺
static void LatLonToMercator(double lat, double lon, double scale, float_type &mx, float_type &my)
将纬度、经度和比例尺转换为墨卡托坐标系中的mx/my
static void MercatorToLatLon(double mx, double my, double scale, double &lat, double &lon)
将墨卡托坐标系中的mx/my转换回纬度、经度
static constexpr double EARTH_RADIUS_EQUA
定义地球赤道半径的常量,单位是米
static void LatLonAddMeters(double lat_start, double lon_start, double dx, double dy, double &lat_end, double &lon_end)
在给定的纬度、经度上添加米为单位的dx/dy,并返回新的纬度、经度
CARLA模拟器的主命名空间。
Definition Carla.cpp:139