Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

人工智能51

前置:

Nvidia JetsonTx2 Ubuntu18.04 刷机教程(详细排雷)_prophet_xh的博客-CSDN博客_tx2 虚拟机

Nvidia JetsonTx2 Ubuntu18.04 安装 ros melodic(顺带快速解决sudo rosdep init问题)_prophet_xh的博客-CSDN博客

Nvidia TX2 Ubuntu18.04 安装 IntelRealsense L515 realsense SDK 及 Realsense ROS (make各种问题解答,一篇到位版本)_prophet_xh的博客-CSDN博客

再次强调,不谈环境的安装教程纯属耍流氓。本教程适用于Nvidia TX2 ,cuda 10,ubuntu18.04的环境,并不通用,对其他的版本只起到参考作用。

继完成一系列环境配置后,准备开始用tx2进行rtabslam。但由于刷完机的板子自带的4.1.1的opencv版本,所以我们需要安装opencv3.2.0

没有必要去卸载opencv4,ubuntu下支持多版本的opencv共存,盲目卸载反而会引发更多问题。

1.首先去下载opencv3.2.0的sourse文件。

Releases - OpenCV

去上面这个官网找到3.2.0的版本(一页页翻),下载完成以后,可以提取到home目录下

如果下载慢,就点这个下,不用积分的哈

opncv3.2.0的官方代码包-机器学习文档类资源-CSDN下载

1.1安装一些依赖,一般opencv刷完机就已经存在了,这里补充记录下,刷机完成的用户可以跳过下面,直接到步骤2

sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev

这里可能有这个问题

E:无法定位软件包libjasper-dev

解决方案

一般的教程中是 sudo add-apt-repository "......" ,然后即可解决

但是很明显tx2的架构和一般的ubuntu系统不同

如果贸然使用,会出现

E:无法下载http://security.ubuntu.com/ubuntu/dists/xenial-security/main/binary-arm64/Packages 404 Not Found [IP: 91.189.91.38 80]

如果使用了一般教程的解决方案,而没有解决

此时,我们先把刚刚添加的 sudo add-apt-repository "......"去除掉("....."是你刚刚添加的ppa,每个教程里的都不一样,我就用'......'来替代泛指一下)

sudo add-apt-repository -r "......"

然后添加tx架构的 ppa

sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"
sudo apt update
sudo apt install libjasper1 libjasper-dev

解决完毕

2.编译

cd opencv-3.2.0
mkdir build
cd build

再在终端输入下面这么一长段,直接复制到终端即可,这些配置适用于cuda10,其他环境请酌情配置

关于CMAKE_INSTALL_PREFIX=/usr/local/opencv320是你的安装路径,那你也可以写其它的

本文opencv320是自己加的文件夹,你可以取其它名字

该路径会影响到后期我们配置cv_birdge 或者 cmake list,记住你安排的路径

一般的CMAKE_INSTALL_PREFIX=/usr/local,这也是opencv默认安装路径

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv320 -D BUILD_PNG=OFF -D BUILD_TIFF=OFF -D BUILD_TBB=OFF -D BUILD_JPEG=OFF -D BUILD_JASPER=OFF -D BUILD_ZLIB=OFF -D BUILD_EXAMPLES=ON -D BUILD_opencv_java=OFF -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF -D WITH_OPENCL=OFF -D WITH_OPENMP=OFF -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF -D WITH_CUDA=ON -D WITH_GTK=ON -D WITH_VTK=OFF -D WITH_TBB=ON -D WITH_1394=OFF -D WITH_OPENEXR=OFF -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.0 -D CUDA_ARCH_BIN=6.2 -D CUDA_ARCH_PTX="" -D INSTALL_C_EXAMPLES=ON -D INSTALL_TESTS=ON -D OPENCV_TEST_DATA_PATH=…/opencv_extra/testdata -D WITH_LAPACK=OFF ..

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv320 -D BUILD_PNG=OFF -D BUILD_TIFF=OFF -D BUILD_TBB=OFF -D BUILD_JPEG=OFF -D BUILD_JASPER=OFF -D BUILD_ZLIB=OFF -D BUILD_EXAMPLES=ON -D BUILD_opencv_java=OFF -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=OFF -D ENABLE_PRECOMPILED_HEADERS=OFF -D WITH_OPENCL=OFF -D WITH_OPENMP=OFF -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF -D WITH_CUDA=ON -D WITH_GTK=ON -D WITH_VTK=OFF -D WITH_TBB=ON -D WITH_1394=OFF -D WITH_OPENEXR=OFF -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.0 -D CUDA_ARCH_BIN=6.2 -D CUDA_ARCH_PTX="" -D INSTALL_C_EXAMPLES=ON -D INSTALL_TESTS=ON -D OPENCV_TEST_DATA_PATH=.../opencv_extra/testdata -D WITH_LAPACK=OFF ..

一般这样在tx2,cuda10上cmake,不会出现报错,耐心等待即可

cmake结束后

make -j4

继续耐心等待

sudo make install

这里可能会报错

CMake Error at data/cmake_install.cmake:72 (file):
file INSTALL cannot find
"/home/prophet/opencv-3.2.0/.../opencv_extra/testdata".

Call Stack (most recent call first):
cmake_install.cmake:89 (include)

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

不要慌,我们去打开这个在date下cmake文件

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

找到最后,发现是最后出现的问题,而最后是share,分享的功能,对应用不造成影响,可以如图,将后3行注释掉(因为是在home目录下,双击就能编辑)

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

继续

sudo make install

完成

3.配置环境

创建opencv.conf文件

sudo gedit /etc/ld.so.conf.d/opencv.conf

添加下面内容

/usr/local/opencv320/lib

完成以后,终端输入

sudo ldconfig

接着添加路径

sudo gedit /etc/bash.bashrc

在文件最后添加路径(路径要自己安装路径,比如前文我是/usr/local/opencv320)

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv320/lib/pkgconfig
export PKG_CONFIG_PATH

刷新一下下

source /etc/bash.bashrc

此时我们已经了opencv3.2.0的安装,如果没什么问题的话,重新打开一个终端,输入

pkg-config opencv --modversion

应该会显示当前的opencv版本是3.2.0

4.ros 配置

终于结束了安装,那我们如何去让ros引用,ros下自带的是opencv4.1.1

安装结束了,并不代表就能用上,我们必须去让ros使用,而我们也没有卸载opencv4

故,我们需要将ros与opencv3.2.0连接起来

此时,我们要做的是去更改cv_birdge文件

打开cv_birdgeconfig.cmake文件

sudo gedit /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake

修改画线的几行,注释掉的是原文件,下方的是改完的,根据自己的路径该:Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

像图片中这样改 ,一共是三处。

if(NOT "include;/usr/include;/usr/include/opencv " STREQUAL " ")

改成

if(NOT "include;/usr/local/opencv320/include/opencv2;/usr/local/opencv320/include/opencv " STREQUAL " ")

set(_include_dirs "include;/usr/include;/usr/include/opencv4")

改成

set(_include_dirs "include;/usr/local/opencv320/include/opencv2;/usr/local/opencv320/include/opencv;/usr/local/opencv320/include;/usr/include")

set(libraries "cv_bridge;/usr/lib/aarch64-linux-gnu/libopencv_core.so.3.2.0;/usr/lib/aarch64-linux-gnu/libopencv_imgproc.so.3.2.0;/usr/lib/aarch64-linux-gnu/libopencv_imgcodecs.so.3.2.0")

改成

set(libraries "cv_bridge;/usr/local/opencv320/lib/libopencv_core.so.3.2.0;/usr/local/opencv320/lib/libopencv_imgproc.so.3.2.0;/usr/local/opencv320/lib/libopencv_imgcodecs.so.3.2.0")

保存退出!

目前为止已经完成opencv3.2.0安装及ros环境配置

下一章将进行rtabmap的安装!

Original: https://blog.csdn.net/prophet_xh/article/details/124113271
Author: prophet_xh
Title: Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0



相关阅读1

Title: 汽车螺丝扭力标准

汽车螺丝扭力标准如下:

1、支座与车身螺栓(13MM)--25Nm;

2、支座与车身螺栓(18MM)--40Nm+90度/50Nm;

3、支座与发动机支座螺栓(18Mm)--100Nm;

4、支座与车身螺栓(13MM)--25Nm;

5、支座与车身螺栓(18MM)--40Nm+90度/50Nm;

6、支座与变速器支座螺栓(18MM)--100Nm;

7、摆动支架摆动支架与变速箱螺栓--40Nm+90度/50Nm;

8、摆动支架与副车架螺栓--20Nm+90度/25Nm;

9、发动机部分火花塞--25Nm(1.6/2.0),30Nm(1.8T);

10、放油螺栓--30Nm;

11、机油滤清器--25Nm;

12、曲轴正时轮螺栓--90Nm+90度;

13、凸轮轴正时轮螺栓--65Nm;

14、曲轴轴瓦--65Nm+90度;

15、连杆轴瓦--80Nm+90度;

16、缸盖螺栓第一步--40Nm;

17、缸盖螺栓第二步--90度;

18、缸盖螺栓第三步--90度;

19、爆震传感器--20Nm;

20、双温开关--15Nm;

21、氧传感器--50Nm;

22、三元催化器与排气管连接螺栓--40Nm;

23、排气管双箍螺栓--40Nm;

24、变速箱部分变速箱与发动机连接部分--80Nm;

25、变速箱与启动机连接部分--80Nm;

26、变速箱与油底壳螺丝--40Nm;

27、换档杆壳体与车身--25Nm;

28、换档拉锁支架到变速器连接螺栓--25Nm;

29、变速箱油堵--25Nm;

30、速度表驱动轴--30Nm;

31、变速器壳盖螺栓--10Nm;

32、离合器总泵--25Nm;

33、离合器分泵--25Nm;

34、底盘部分制动踏板与助力器之间螺栓--20Nm;

35、前制动卡钳--35Nm;

36、后制动卡钳--35Nm;

37、转向拉杆与万向节连接--45Nm;

38、方向盘紧固螺母--50Nm;

39、转向十字轴与转向机连接--30Nm;

40、控制臂球头与控制臂连接--20Nm+90度;

41、控制臂球头自锁螺母--450Nm;

42、稳定杆与控制臂连接螺栓--45Nm;

43、稳定杆穿销自锁螺母--45Nm;

44、控制臂与副车架--70Nm+90度;

45、控制臂与车身--100Nm+90度;

46、副车架与转向机--20Nm+90度;

47、前减震器与转向节连接螺栓--65Nm+90度/75Nm;

48、前减震器上部六角螺母--60Nm;

49、后轮轴头自锁螺母--175Nm;

50、后桥支架与后桥连接--80Nm;

51、后桥支架与车身连接--75Nm;

52、后桥与后分泵连接--65Nm;

53、后轮轴头连接--60Nm;

54、后减震器与后桥连接--60Nm;

55、后减震器与车身连接--75Nm;

56、驱动轮法兰连接螺栓--50Nm;

57、轮胎螺栓--120Nm;

Original: https://www.cnblogs.com/LiuYanYGZ/p/16418376.html
Author: LiuYanYGZ
Title: 汽车螺丝扭力标准

相关阅读2

Title: 数学建模 - K-means聚类

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

; 解决问题

将样本划分为由类似的对象组成的多个类的过程(聚类)。
聚类后,可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测;也可以探究不同类之间的相关性和主要差异。
(KMeans本质上是一种基于欧式距离度量的数据划分方法)
ps. 分类是已知类别的,聚类未知。

算法流程

K-means聚类算法:

  1. 指定需要划分的簇的个数K值(类的个数);
  2. 随机地选择K个数据对象作为初始的聚类中心(不一定要是我们的样本点);
  3. 计算其余的各个数据对象到这K个初始聚类中心
    的距离,把数据对象划归到距离它最近的那个中心所
    处在的簇类中;
  4. 调整新类并且重新计算出新类的中心;
  5. 循环步骤三和四,看中心是否收敛(不变),如
    果收敛或达到迭代次数则停止循环;
  6. 结束

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0公式过程: k-means聚类算法

; 模型特性

K-means聚类优点:
(1)算法简单、快速。
(2)对处理大数据集,该算法是相对高效率的。
当簇是密集的、球状或团状的,且簇与簇之间区别明显时,聚类效果较好 。

K-means聚类缺点:
(1)要求用户必须事先给出要生成的簇的数目K。
(2) 对初值敏感。
(3) 对于孤立点数据敏感。

ps. K‐means++算法可解决2和3这两个缺点。
K-means++算法选择初始聚类中心的基本原则是:
初始的聚类中心之间的相互 距离要尽可能的 。(只对K-means算法" 初始化K个聚类中心" 这一步进行了优化)
即进行预处理优化:

步骤一:随机选取一个样本作为第一个聚类中心;

步骤二:计算每个样本与当前已有聚类中心的最短距离(即与最近一个聚类中心的距离),这个值越大,表示被选取作为聚类中心的概率较大;
最后,用轮盘法(依据概率大小来进行抽选)选出下一个聚类中心;

步骤三:重复步骤二,直到选出K个聚类中心。选出初始点后,就继续使用标准的K-means算法了。

使用方法

  1. 利用Spss软件
    Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0默认使用的是 K-means++算法
  2. 利用matlab软件
X2 = zscore(X);      % zscore方法标准化数据

Y2 = pdist(X2);      % 计算距离(默认欧式距离)

Z2 = linkage(Y2);    % 定义变量之间的连接,用指定的算法计算系统聚类树

T = cluster(Z2,6);   % 创建聚类

H = dendrogram(Z2);  % 作出系谱图(散点聚类图看腻了,这里画个系谱图)

结合 MATLAB 中的一些函数,结果作出系谱图
ps. MATLAB 以及 sklearn 也提供了相应的 kmeans() 函数可供直接聚类使用

from 5 分钟带你弄懂 K-means 聚类

注意事项

a. 聚类个数(K值)

分几类主要取决于个人的经验与感觉,通常的做法是多尝试几个K值,看分成几类的结果更好解释,更符合分析目的等。(即提前应该要知道分类数目)
ps. 如果不能提前判断要分几类,可以采用 系统(层次)聚类算法

b. 数据量纲

如果数据的量纲不一样,那么算距离时就没有意义。例如:如果X1单位是米,X2单位是吨,用距离公式计算就会出现"米的平方"加上"吨的平方"再开平方,最后算出的东西没有数学意义,这就有问题了。
所以应该先进行数据的预处理( 标准化处理
Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0
可以直接利用spss实现:
Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

; c. 分类与聚类区别

分类:类别是已知的,通过对已知类别的数据进行训练和学习,找到这些不同类的特征,再对未知类别的数据进行分类。属于监督学习。

聚类:事先不知道数据会分为几类,通过聚类分析将数据聚合成几个群体。聚类不需要对数据进行训练和学习。属于无监督学习。

一般而言,是否有监督,就看输入数据是否有标签,输入数据有标签,则为有监督学习,否则为无监督学习。

d. 适用条件

KMeans方法只有在簇的平均值被定义的情况下才能使用,且对有些分类属性的数据不适合。
异常值会对均值计算产生较大影响,导致中心偏移,因此对于"噪声"和孤立点数据最好能提前过滤 。

e. 对于K值的选择

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0from K-Means算法之K值的选择

; f. 簇的形式

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0
from K-means聚类算法

g. 与其他聚类算法的比较

k-means聚类算法优缺点?

参考资料

清风数学建模

k-means聚类算法

5 分钟带你弄懂 K-means 聚类

K-Means算法之K值的选择

K-means聚类算法

k-means聚类算法优缺点?

机器学习,KMeans聚类分析详解

Original: https://blog.csdn.net/weixin_51942493/article/details/125857141
Author: chen_ :)
Title: 数学建模 - K-means聚类

相关阅读3

Title: Geohash算法

用户附近位置计算

经纬度与物理距离介绍

经纬度是经度与纬度的合称组成一个坐标系统,称为地理坐标系统,它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

在一定误差范围内,通常情况下,经纬线和米的换算为:经度或者纬度0.00001度,约等于1米。以下表格列出更细致的换算关系:

在纬度相等的情况下在经度相等的情况下经度每隔0.00001度,距离相差约1米;每隔0.0001度,距离相差约10米;每隔0.001度,距离相差约100米;每隔0.01度,距离相差约1000米;每隔0.1度,距离相差约10000米。纬度每隔0.00001度,距离相差约1.1米;每隔0.0001度,距离相差约11米;每隔0.001度,距离相差约111米;每隔0.01度,距离相差约1113米;每隔0.1度,距离相差约11132米。

; 地图坐标系

WGS84坐标系地球坐标系,国际通用坐标系GCJ02坐标系火星坐标系,WGS84坐标系加密后的坐标系;Google国内地图、高德、QQ地图 使用BD09坐标系百度坐标系,GCJ02坐标系加密后的坐标系

注:如果使用GCJ-02坐标系,Geohash函数和距离计算函数理论上都应在WGS84坐标系下使用,在火星坐标系下会存在一定的偏差,主要是火星坐标系的加偏处理带来的,经过查阅资料及抽样测试,认为该误差在可接受范围内。

Geohash算法介绍

GeoHash是空间索引的一种方式,其基本原理是将地球理解为一个二维平面,通过把二维的空间经纬度数据编码为一个字符串,可以把平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码。

以GeoHash方式建立空间索引,可以提高对空间poi数据进行经纬度检索的效率。

编码规则为:先将纬度范围(-90, 90)平分成两个区间(-90, 0)和(0, 90),如果目标维度位于前一个区间,则编码为0,否则编码为1,然后根据目标纬度所落的区间再平均分成两个区间进行编码,以此类推,直到精度满足要求,经度也用同样的算法,对(-180, 180)依次细分,然后合并经度和纬度的编码,奇数位放纬度,偶数位放经度,组成一串新的二进制编码,按照Base32进行编码。

示例

以当前所在办公区【两江国际】的位置坐标为例, 经纬度为(104.059684,30.559545)

第一步:将经纬度转换为二进制

序号纬度范围划分区间0划分区间130.559545所属区间1(-90, 90)(-90, 0.0)(0.0, 90)12(0.0, 90)(0.0, 45.0)(45.0, 90)03(0.0, 45.0)(0.0, 22.5)(22.5, 45.0)14(22.5, 45.0)(22.5, 33.75)(33.75, 45.0)05(22.5, 33.75)(22.5, 28.125)(28.125, 33.75)16(28.125, 33.75)(28.125, 30.9375)(30.9375, 33.75)07(28.125, 30.9375)(28.125, 29.53125)(29.53125, 30.9375)18(29.53125, 30.9375)(29.53125, 30.234375)(30.234375, 30.9375)19(30.234375, 30.9375)(30.234375, 30.5859375)(30.5859375, 30.9375)010(30.234375, 30.5859375)(30.234375, 30.41015625)(30.41015625, 30.5859375)111(30.41015625, 30.5859375)(30.41015625, 30.498046875)(30.498046875, 30.5859375)112(30.498046875, 30.5859375)(30.498046875, 30.541992188)(30.541992188, 30.5859375)113(30.541992188, 30.5859375)(30.541992188, 30.563964844)(30.563964844, 30.5859375)014(30.541992188, 30.563964844)(30.541992188, 30.552978516)(30.552978516, 30.563964844)115(30.552978516, 30.563964844)(30.552978516, 30.55847168)(30.55847168, 30.563964844)1

最后得到维度的二进制编码为:101010110111011, 用同样的方式可以得到精度(104.059684)的二进制编码:110010011111111

第二步:将经纬度的二进制编码合并

从偶数0开始,经度占偶数位,纬度占奇数位。

序号01234567891011121314151617181920212223242526272829
编码

111001001100011110111111101111

第三步:将合并后的二进制数做Base32编码

按照每5位一组,分成6组,每组计算其对应的十进制数值,按照Base32进行编码。

Base32编码表的其中一种如下,是用0-9、b-z(去掉a, i, l, o)这32个字母进行编码.

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

11100 10011 00011 11011 11111 01111
28(w) 19(m) 3(3)  27(v) 31(z) 15(g)

最终得到的经纬度编码为:wm3vzg

如上文二进制编码的计算过程,如果递归的次数越大,则生成的二进制编码越长,因此生成的geohash编码越长,位置越精确。目前Geohash使用的精度说明如下:

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

GeoHash用一个字符串表示经度和纬度两个坐标, 比直接用经纬度的高效很多,而且使用者可以发布地址编码,既能表明自己位于某位置附近,又不至于暴露自己的精确坐标,有助于隐私保护。

编码过程中,通过二分范围匹配的方式来决定某个经纬坐标是编码为1还是0,因此某些邻近坐标的编码是相同的,因此GeoHash表示的并不是一个点,而是一个矩形区域。 GeoHash编码的前缀可以表示更大的区域。例如wm3vzg,它的前缀wm3vz表示包含编码wm3vzg在内的更大范围。 这个特性可以用于附近地点搜索。

如果把某个区域或整个地图上的地理位置都按照Geohash编码,则会得到一个网格,编码递归粒度越细,网格的矩形区域越小,geohash编码的长度越大,则Geohash编码越精确。 不同的编码长度,生成的网格与实际地理的精度如下(Geohash字符串编码长度对应网格大小)

字符串长度网格宽度网格高度15000Km5000Km21250Km625Km3156Km156Km439.1Km19.5Km54.89Km4.89Km61.22Km0.61Km7153m153m838.2m19.1m94.77m4.77m101.19m0.596m

Geohash编码与网格

当前选取的编码长度为6,因此一个网格实际的地理差异在1.2公里与0.6公里,示例中两江国际对应的网格大致效果如图:

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

; 邻近网格位置推算

结论

根据Geohash的编码规则将经纬度分解到二进制,结合地理常识,中心网格在南北(上下)方向上体现为纬度的变化,往北则维度的二进制加1,往南则维度的二进制减1,在东西(左右)方向上体现为经度的变化,往东则经度的二进制加1,往西则减1,可以计算出上下左右四个网格经纬度的二进制编码,再将加减得出的经纬度两两组合,计算出左上、左下、右上和右下四个网格的经纬度二进制编码,从而就可以根据Geohash的编码规则计算出周围八个网格的字符串。

正向推导

以Geohash编码长度为6为基础,网格的宽高与实际距离换算为:1.2Km*0.6Km.

参考上文提到的,在经度相同情况下,每隔0.001度,距离相差约111米。0.6Km换算为纬度为:0.005405405。

当前两江国际粗粒度的wgs84坐标(104.05503,30.562251), 纬度二进制编码:101010110111011,经度二进制编码:110010011111111, Geohash值为:wm3vzg

正北方向近邻的网格维度为增加一个网格的高度,即纬度增加0.005405405,为: 30.562251 + 0.005405405 = 30.567656405, 转换为二进制编码后为(可用工具快速转换): 101010110111100

正好是原纬度的二进制编码101010110111011 加1后的结果(101010110111011 + 000000000000001 = 101010110111100)

反向推导

当前两江国际粗粒度的wgs84坐标(104.05503,30.562251), 纬度二进制编码:101010110111011,经度二进制编码:110010011111111, Geohash值为:wm3vzg

基于当前坐标的网格,正北方向近邻的网格N,其纬度二进制加1后为:101010110111100,经度不变,其Geohash值为: wm3vzu

通过http://geohash.co/ 反向转换其经纬坐标为:(104.0570068359375,30.56671142578125)

通过https://www.box3.cn/tools/lbs.html 查询2个坐标的实际位置,误差在531m(符合精度范围)

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

; 邻近8个网格位置计算

Geohash编码:wm3vzs纬度二进制编码:101010110111100经度二进制编码:110010011111110公式:(Lat_bin + 1, Lon_bin - 1)Geohash编码:wm3vzu纬度二进制编码:101010110111100经度二进制编码:110100101101010公式:(Lat_bin + 1, Lon_bin)Geohash编码:wm6jbh纬度二进制编码:101010110111100经度二进制编码:110010100000000公式:(Lat_bin + 1, Lon_bin + 1)Geohash编码:wm3vze纬度二进制编码:101010110111011经度二进制编码:110010011111110公式:(Lat_bin, Lon_bin - 1)Geohash编码:wm3vzg纬度二进制编码:101010110111011经度二进制编码:110010011111111公式:(Lat_bin, Lon_bin)Geohash编码:wm6jb5纬度二进制编码:101010110111011经度二进制编码:110010100000000公式:(Lat_bin, Lon_bin + 1)Geohash编码:wm3vzd纬度二进制编码:101010110111010经度二进制编码:110010011111110公式:(Lat_bin - 1, Lon_bin - 1)Geohash编码:wm3vzf纬度二进制编码:101010110111010经度二进制编码:110010011111111公式:(Lat_bin - 1, Lon_bin)Geohash编码:wm6jb4纬度二进制编码:101010110111010经度二进制编码:110010100000000公式:(Lat_bin - 1, Lon_bin + 1)

附近3公里网格模型

Nvidia TX2 安装 opencv3.2.0 及在ros melodic下配置opencv3.2.0

青色代表:用户位置的网格编码,红色代表:附近附近3公里的网格编码

Original: https://blog.csdn.net/usher_ou/article/details/122716877
Author: Usher_Ou
Title: Geohash算法