(刺客信条地图大小排行2)为什么别人家的地图是这样子,我家的地图是这样子啊,

根据国家颁布的《移动互联网应鼡程序信息服务管理规定》注册用户需要绑定手机号进行实名验证

做个地图移动想的是移动地图嘫后刷新屏幕中心点的经纬度再后面根据这个经纬度刷新显示地图,新手自己捣鼓出的移动效果是这样的,。感觉把整个画布都移动叻。因为黑色的区域部分触摸没有反应。模拟器和真机上运行都是这样的效果图如下,各位高手看看这个事哪里的问题要是想实現我要的效果应该怎么改?求达人相助!!!!!!!!!移动部分的代码也贴出来如下:


图,第一个是没移动的时候第二个是移动時出现的样子。。




   大家好时隔多年之后,我叒开始了博客旅程经历了很多事情之后呢,我发现自己的想法真的很简单:好好读书做课题闲下来时写写博客,服务大家所以我会繼续写SLAM相关的博客。如果你觉得它对你有帮助那是最好不过的啦!写作过程中得到了许多热心读者的帮助与鼓励,有些读者还成了要好嘚朋友在此向大家致谢啦!关于SLAM,读者也会有很多问题由于我个人精力和学力都有限,无法一一回答向大家说声抱歉!有些共同的問题,我肯定会在博客里介绍的!

  前两天刚从珠海开会回来与中山大学的同学们聚在一起玩耍,很开心!

  《一起做》系列已经結束事实上它是我以前探索过程中的一些总结。虽然仍然有很多令人不满意的地方不过相信读了那个系列,读者应该对SLAM的流程有一定嘚了解了尤其是通过代码,你能知道许多论文里没讲清楚的细节在这之后,我现在有两个规划一是对目前流行的SLAM程序做一个介绍,沿着《视觉SLAM实战》往下写;二是介绍一些好用的开源工具/库写成一个《SLAM拾萃》。我觉得这两部分内容对读者了解SLAM会有较大的帮助。当嘫如果你对我的博客有任何建议,可以在下方评论或给我发邮件

  本篇是《SLAM拾萃》第一篇,介绍一个建图工具:octomap和往常一样,我會介绍它的原理、安装与使用方式并提供例程供读者学习。必要时也会请小萝卜过来吐槽(小萝卜真是太好用了,它可以代替读者提佷多问题)


  RGBD SLAM的目的有两个:估计机器人的轨迹,并建立正确的地图地图有很多种表达方式,比如特征点地图、网格地图、拓扑地圖等等在《一起做》系列中,我们使用的地图形式主要是点云地图在程序中,我们根据优化后的位姿拼接点云,最后构成地图这種做法很简单,但有一些明显的缺陷:

      点云地图通常规模很大所以一个pcd文件也会很大。一张640×480的图像会产生30万个空间点,需要大量的存储空间即使经过一些滤波之后,pcd文件也是很大的而且讨厌之处在于,它的“大”并不是必需的点云地图提供了很多不必要的細节。对于地毯上的褶皱、阴暗处的影子我们并不特别关心这些东西。把它们放在地图里是浪费空间
  • 处理重叠的方式不够好。
      在構建点云时我们直接按照估计位姿拼在了一起。在位姿存在误差时会导致地图出现明显的重叠。例如一个电脑屏变成了两个原本方嘚边界变成了多边形。对重叠地区的处理方式应该更好一些
  •   说起地图的用处,第一就是导航啦!有了地图就可以指挥机器人从A点箌B点运动,岂不是很方便的事但是,给你一张点云地图是否有些傻眼了呢?我至少得知道哪些地方可通过哪些地方不可通过,才能唍成导航呀!光有点是不够的

  octomap就是为此而设计的!亲你没有看错,它可以优雅地压缩、更新地图并且分辨率可调!它以八叉树(octotree,后面会讲)的形式存储地图相比点云,能够省下大把的空间octomap建立的地图大概是这样子的:(从左到右是不同的分辨率)

  由于仈叉树的原因,它的地图像是很多个小方块组成的(很像minecraft)当分辨率较高时,方块很小;分辨率较低时方块很大。每个方块表示该格被占据的概率因此你可以查询某个方块或点“是否可以通过”,从而实现不同层次的导航简而言之,环境较大时采用较低分辨率而較精细的导航可采用较高分辨率。

  小萝卜:师兄你这是介绍吗真像广告啊……


  本段会讲一些数学知识。如果你想“跑跑程序看效果”可以跳过本段。

  八叉树也就是传说中有八个子节点的树!是不是很厉害呢?至于为什么要分成八个子节点想象一下一个囸方形的方块的三个面各切一刀,不就变成八块了嘛!如果你想象不出来请看下图:

  实际的数据结构呢,就是一个树根不断地往下擴每次分成八个枝,直到叶子为止叶子节点代表了分辨率最高的情况。例如分辨率设成/OctoMap/octomap

git会把代码拷贝到当前目录/octomap下进入该目录,参照README.md进行安装编译方式和普通的cmake程序一样,如果你学过《一起做》就应该很熟悉了:

如果编译没有给出任何警告恭喜你编译成功!

  • 使用octovis查看示例地图
    在bin/文件夹中,存放着编译出来可执行文件为了直观起见,我们直接看一个示例地图:

     octovis会打开这个地图并显示它的UI是长这樣的。你可以玩玩菜单里各种东西(虽然也不多我就不一一介绍UI怎么玩了),能看出这是一层楼的扫描图octovis是一个比较实用的工具,你苼成的各种octomap地图都可以用它来看(所以你可以把octovis放到/usr/local/bin/下,省得以后还要找)


  •   GUI玩够了吧?仅仅会用UI是不够滴现在让我们开始编代碼使用octomap这个库吧!

      我为你准备了三个小例程。在前两个中我会教你如何将一个pcd格式的点云地图转换为octomap地图。后一个中我会讲讲如哬根据g2o优化的轨迹,以类似slam的方式把几个RGBD图像拼接出一个octomap。这对你研究SLAM会有一些帮助所有的代码与数据都可以在我的github上找到。有关编譯的信息我写在这个代码的Readme中了,请在编译前看一眼如何编译这些代码

      源代码如下:src/pcd2octomap.cpp 这份代码将命令行参数1作为输入文件,参数2莋为输出文件把输入的pcd格式点云转换成octomap格式的点云。通过这个例子你可以学会如何创建一个简单的OcTree对象并往里面添加新的点。  

      这个代码是相当直观的在编译之后,它会产生一个可执行文件叫做pcd2octomap,放在代码根目录的bin/文件夹下你可以在代码根目录下这样调:

      它会把data文件夹下的sample.pcd(一个示例pcd点云),转换成一个data/sample.bt的octomap文件你可以比较下pcd点云与octomap的区别。下图是分别调用这些显示命令的结果  

      这个octomap里只存储了点的空间信息,而没有颜色信息我按照高度给它染色了,否则它应该就是灰色的通过octomap,我们能查看每个小方块是否可以通行从而实现导航的工作。

      以下是对代码的一些注解:

      注1:有关如何读取pcd文件你可以参见pcl官网的tutorial。不过这件事情十分簡单所以我相信你也能直接看懂。

      注2:31行采用了C++11标准的for循环它会让代码看起来稍微简洁一些。如果你的编译器比较老而不支持c++11伱可以自己将它改成传统的for循环的样式。

      注3:octomap存储的文件后缀名是.bt(二进制文件)和.ot(普通文件)前者相对更小一些。不过octomap文件普遍都很小所以也不差这么些容量。如果你存成了其他后缀名octovis可能认不出来。


     例程2:加入色彩信息

      第一个示例中我们将pcd点云转换為octomap。但是pcd点云是有颜色信息的能否在octomap中也保存颜色信息呢?答案是可以的octomap提供了ColorOcTree类,能够帮你存储颜色信息下面我们就来做一个保存颜色信息的示例。代码见:src/pcd2colorOctomap.cpp

    30 // 创建带颜色的八叉树对象参数为分辨率,这里设成了0.05

      大部分代码和刚才是一样的除了把OcTree改成ColorOcTree,以及調用integrateNodeColor来混合颜色之外这段代码会编译出pcd2colorOctomap这个程序,完成带颜色的转换不过,后缀名改成了.ot文件  

      颜色信息能够更好地帮助我們辨认结果是否正确,给予一个直观的印象是不是好看了一些呢?


     例程3:更好的拼接与转换

      前两个例程中我们都是对单个pcd文件进荇了处理。实际做slam时我们需要拼接很多帧的octomap。为了做这样一个示例我从自己的实验数据中取出了一小段。这一小段总共含有五张图像(因为github并不适合传大量数据)它们存放在data/rgb_index和data/dep_index下。我的slam程序估计了这五个关键帧的位置放在data/trajectory.txt中。它的格式是:帧编号

      现在我们要做嘚事就是根据trajectory.txt里记录的信息,把几个RGBD图拼成一个octomap这也是所谓的用octomap来建图。我写了一个示例不知道你能否读懂呢?src/joinMap.cpp

    27 // 全局变量:相机矩陣 28 // 更好的写法是存到参数文件中但为方便起见我就直接这样做了 80 // 注意我们的做法是先把图像转换至pcl的点云,进行姿态变换最后存储成octomap 81 // 洇为octomap的颜色信息不是特别方便处理,所以采用了这种迂回的方式 97 // 从rgb, depth生成点云运算方法见《一起做》第二讲 98 // 第一次遍历用于生成空间点云

      大部分需要解释的地方,我都在程序里写了注解我用了一种稍微有些迂回的方式:先把图像转成pcl的点云,变换后再放到octotree中这种做法的原因是比较便于处理颜色,因为我希望做出带有颜色的地图如果你不关心颜色,完全可以不用pcl直接用octomap自带的octomap::pointcloud来完成这件事。

      insertPointCloud會比单纯的插入点更好一些octomap里的pointcloud是一种射线的形式,只有末端才存在被占据的点中途的点则是没被占据的。这会使一些重叠地方处理嘚更好

      最后,五帧数据拼接出来的点云大概长这样:  

      可能并不是特别完整毕竟我们只用了五张图。这些数据来自于nyud数据集的dining_room序列一个比较完整的图应该是这样的:

      至少是比纯粹点云好些了吧?好了关于例程就介绍到这里。如果你准备使用octomap这仅仅昰个入门。你需要去查看它的文档了解它的类结构,以及一些重要类的使用、实现方式


      《SLAM拾萃》第一讲,octomap就为大家介绍到这里啦。最近我发现自己写东西讲东西都越来越长,所以请原谅我越来越啰嗦的写作和说话风格希望它能帮助你!我们下讲再见!

      如果你觉得我的博客有帮助,可以进行几块钱的小额赞助帮助我把博客写得更好。(虽然我也是从别处学来的这招……)

      小萝卜:师兄你学坏了啊!

    我要回帖

    更多关于 刺客信条地图大小排行 的文章

     

    随机推荐