1.从零开始一起学习SLAM | SLAM有什么用?
2.手把手带你学webpack(6)--source-map
从零开始一起学习SLAM | SLAM有什么用?
SLAM,即Simultaneous Localization And Mapping,是一个在移动设备上同时进行定位和地图构建的过程。我们可以通过一个日常例子来理解它,比如家用的智能扫地机器人。 早期的简单雨滴动画源码扫地机器人在工作时,只能简单地避开障碍物,随机游走清扫,导致效率低下且清扫不彻底。然而,随着SLAM技术的引入,现在的扫地机器人能够通过传感器扫描环境,建立地图,并根据自身的定位进行高效的清扫路径规划,包括自动回充、断点续扫等高级功能。archlinux 内核 源码这要求机器人具备三大能力:定位(Localization)、建图(Mapping)和路径规划(Route Planning)。 具体来说,定位是机器人需要知道自己在房间的准确位置;建图是机器人需要构建出对周围环境的详细地图;路径规划是机器人需要找到从当前位置到指定目标的最短路径。这些能力相辅相成,使得扫地机器人能够智能地完成清扫任务。 SLAM技术不仅在扫地机器人中得到应用,还在自动驾驶、无人机、AR、智能机器人等领域发挥了重要作用。传感器主要分为激光雷达和视觉两大类。激光雷达在早期SLAM研究中较为常用,因其高精度和成熟的解决方案,但价格高、brew 源码安装体积大、信息较少的缺点也明显。而视觉SLAM则使用摄像头作为主传感器,广泛应用于AR、自动驾驶等前沿领域。 定位相关应用中,SLAM技术在自动驾驶中主要用于更精确地确定汽车的位置。在室外导航方面,尽管地图类App已经做得很好,但它们在车道识别、GPS失效区域的定位等方面仍有局限性。通过SLAM技术,可以实现更精准的室内定位,如在电商仓库的AGV机器人、移动机器人等场景。xenko 源码分析 建图相关应用中,SLAM可以用于生成物体的三维模型或对较大场景进行三维重建。这在室内场景的三维重建、增强现实游戏、三维漫游等方面有广泛应用。 关于SFM(结构从运动)和SLAM的区别,它们讨论的是相似的问题,但起源和应用领域不同。SFM强调实时性,通常离线处理,而SLAM更注重实时定位与地图构建。SFM处理的图像通常为同一场景在不同时间、不同相机拍摄的,而SLAM一般要求同一相机的序列图像或连续视频。SFM使用相机作为传感器,spring cache 源码而SLAM除了相机外,还会集成惯导、激光雷达等传感器。 对于快速对自由女神像进行3D重建,考虑到没有特殊硬件的情况下,选择SLAM可能是一个更合适的方式,因为它可以实时处理动态环境,而SFM通常更适合静态场景的重建。 为了深入学习SLAM,可以参考以下资源:基于LiDAR的多传感器融合SLAM系列教程:LOAM、LeGO-LOAM、LIO-SAM
系统全面的相机标定课程:单目/鱼眼/双目/阵列相机标定:原理与实战
视觉SLAM必备基础课程:视觉SLAM必学基础:ORB-SLAM2源码详解
深度学习三维重建课程:基于深度学习的三维重建学习路线
激光定位+建图课程:激光SLAM怎么学?手把手教你Cartographer从入门到精通!
视觉+IMU定位课程:视觉惯性里程计讲教程全部上线!IMU预积分/残差雅克比推导、边缘化约束、滑窗BA!
手把手图像三维重建课程:系统学三维重建讲全部上线!掌握稠密匹配、点云融合、网格重建、纹理贴图!
通过这些课程和资源,你可以快速入门SLAM,并在实践中掌握相关技能。手把手带你学webpack(6)--source-map
本篇文章对应源码:JvcicpO1xuXG4gIHRocmIG5ldyBFcnJvcignctZXRoaW5nIHdybnLi4uJyk7XGXG5cbm1vZHVsZS5leHBvcnRzID0geyBlcnJvckZuIHXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSbIjoiIn0=\n//#sourceURL=webpack-internal:///./src/utils.js\n");这种方式适用于在开发模式下需要精确的source-map时使用,相比直接的eval,会更加精确些
3.4inline-source-map顾名思义,就是以内联方式存放source-map文件,它会将source-map文件的内容编码成base后直接放在打包结果的最后
constHtmlWebpackPlugin=require('html-webpack-plugin');const{ CleanPlugin}=require('webpack');/***@type{ import('webpack').Configuration}*/module.exports={ mode:'development',devtool:'inline-source-map',plugins:[newHtmlWebpackPlugin(),newCleanPlugin()],};//#sourceMappingURL=data:application/json;charset=utf-8;base,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsbUJBQW1COzs7Ozs7O1VDTm5CO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7Ozs7OztBQ3RCQSxRQUFRLFVBQVUsRUFBRSxtQkFBTyxDQUFDLCtCQUFTOztBQUVyQyIsInNvdXJjZXMiOlsid2VicGFjazovLzA2X3dlYnBhY2tfccmNlXhcC8uL3NyYydGlscy5qcyIsIndlYnBhY2s6Ly8wNlZWJwYWNrX3NvdXJjZV9tYXAvd2VicGFjay9ibc3RyYXAiLCJ3ZWJwYWNrOi8vMDZfd2VicGFjazb3VyY2VfbWFwLy4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDbZWIjpbImZ1bmN0aW9uIGVycm9yRm4oKSB7XG4gIGNvbnNvbGUubG9nKCdoZWxsbyBlcnJvcicpO1xuXG4gIHRocmIG5ldyBFcnJvcignctZXRoaW5nIHdybnLi4uJyk7XGXG5cbm1vZHVsZS5leHBvcnRzID0geyBlcnJvckZuIHXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXGYXIgXZWJwYWNrXvZHVsZV9jYWNoZV9fID0geXG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gXZWJwYWNrXvZHVsZV9jYWNoZV9fWvZHVsZUlkXTtcblWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaWbyB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlXbbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdHXG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFjatb2R1bGVzXbbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFjayZXF1aXJlXpO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiYuc3QgeyBlcnJvckZuIH0gPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbmVycm9yRm4oKTtcbiJdLCJuYW1lcyI6WsInNvdXJjZVJvb3QiOiIifQ==从官方文档可以看到,这种方式的构建速度是最慢的,只适用于构建单个文件的时候使用
3.5cheap-source-map这种方式相比source-map而言,没有建立列映射,也就是说遇到报错的时候,只会告诉你哪一行代码出错了,而不会告诉你哪一列出错了,如果开发时对列映射没有太高要求的话可以使用这种方式,毕竟不用生成列映射,比起source-map来说会快一些
constHtmlWebpackPlugin=require('html-webpack-plugin');const{ CleanPlugin}=require('webpack');/***@type{ import('webpack').Configuration}*/module.exports={ mode:'development',devtool:'cheap-source-map',plugins:[newHtmlWebpackPlugin(),newCleanPlugin()],};3.6cheap-module-source-map官方文档对这种方式的devtool并没有进行任何详细介绍,事实上这种方式适用于js代码被loader转换过的场景,比如被babel进行了转换,又比如源码是用typescript写的,后来经过loader转成了js代码,而我们又希望在运行的时候出现报错信息时能够对应回typescript代码像这种有loader对js进行转换的场景下,想要保证正确的source-map就需要使用到带有module的devtool了,因为除了cheap-module-source-map,还有很多别的方式也是有module的,只要是在官方文档中看到带有module的devtool都是具有这种特性
下面就以babel为例,我们通过babel-loader对js进行转换,然后看看能否正确对应到转换前的代码首先安装如下依赖
pnpmi@babel/core@babel-preset-envbabel-loader@babel/core是babel的核心,所有功能都要在这个包的基础上运行
@babel-preset-env让我们可以不需要考虑转换成什么版本的js,它会根据要适配的浏览器自动转换成能兼容相应浏览器的版本,这里我们使用它主要是能够将我们写的es6代码转成es5,从而让我们的源码和打包后的结果有差异,方便观察source-map是否生效
babel-loader,用于和webpack搭配使用,转换js文件
接下来配置loader
constHtmlWebpackPlugin=require('html-webpack-plugin');const{ CleanPlugin}=require('webpack');/***@type{ import('webpack').Configuration}*/module.exports={ mode:'development',devtool:'eval',//默认就是eval,因此development模式下不写devtool配置项也可以plugins:[newHtmlWebpackPlugin(),newCleanPlugin()],};0然后我们写一个具有es6特性的语法的函数
constHtmlWebpackPlugin=require('html-webpack-plugin');const{ CleanPlugin}=require('webpack');/***@type{ import('webpack').Configuration}*/module.exports={ mode:'development',devtool:'eval',//默认就是eval,因此development模式下不写devtool配置项也可以plugins:[newHtmlWebpackPlugin(),newCleanPlugin()],};1使用到了const、箭头函数,经过babel转换成es5后,代码的位置会和源码中不一样,那么在浏览器中如果仍然能够找到转换前的源码,则说明cheap-module-source-map生效了可以看到,在浏览器中确实能够看到转换前的源码,这就是cheap-module-source-map中module的作用,事实上官方文档中这么多的配置项我们不需要害怕,只需要知道每个关键字是什么意思,那么它们组合起来无非就是各种特性的叠加而已
3.7hidden-source-map也是一个见名知意的配置项,相比于source-map,就是将最后的//#sourceMappingURL=main.js.map这句注释删除了,这也就意味着source-map不会生效了,但是仍然会生成source-map文件的官方文档中给我们的建议是在只需要知道有错误出现时给我们在控制台输出出来的话就可以使用这种方式
3.8nosources-source-map这种方式能够在出现错误的时候告诉我们是源码中哪个文件第几行出错了,但是不会在浏览器中给我们生成源码
总结了解完以上这几个devtool配置项,就足够了,官网的个配置项就是根据eval、hidden、inline、cheap、module、nosources这几个关键字组合出来的
但是组合也是有规则的,官方文档中给出的规则如下:
[inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map
原文:/post/