Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra+为例)保姆级教程
Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra+为例)
获取源码
git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git
解压文件

- 得到如下内容

编译安装修改后的g2o
cd g2o_with_orbslam2
mkdir build
cd build
cmake ..
make
sudo make install //别忘了这一步 不然之后会有文件找不到
编译错误解决
尝试将 double 类型的角度直接传给需要 Eigen::Rotation2D<double> 对象的函数,导致类型不匹配

/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/types/slam2d/edge_se2_pointxy_bearing.cpp:51:39: error: cannot convert ‘Eigen::Rotation2D<double>::Scalar’ {aka ‘double’} to ‘const Rotation2Dd&’ {aka ‘const Eigen::Rotation2D<double>&’}51 | t.setRotation(t.rotation().angle()+_measurement);| ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~| || Eigen::Rotation2D<double>::Scalar {aka double}
报错原因
- 这个编译错误是因为在 g2o 库的代码中尝试将
double类型的值(在这里是通过调用Eigen::Rotation2D<double>::angle()得到的角度加上_measurement)赋值给需要const Rotation2Dd&(即const Eigen::Rotation2D<double>&)类型的函数setRotation。Eigen::Rotation2D<double>::angle()返回一个double类型的值,表示旋转的角度,而setRotation函数期望的是一个Rotation2Dd类型的对象。这种类型不匹配导致了编译错误,因为不能直接将double类型转换为Rotation2Dd对象。正确的做法应该是创建一个新的Rotation2Dd对象,将角度传递给它,然后再调用setRotation。
解决办法
- 修改edge2_se2_pointxy_bearing.cpp(ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/types/slam2d)中的第51行
- 从
t.setRotation(t.rotation().angle()+_measurement);
-
改为
-
t.setRotation((Eigen::Rotation2Dd)(t.rotation().angle()+_measurement));
由于在 Eigen 操作中未显式转换不同的数值类型,违反了 Eigen 对于类型一致性的严格要求

/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/solvers/eigen/linear_solver_eigen.h:92:10: required from here
/usr/include/eigen3/Eigen/src/Core/util/XprHelper.h:819:96: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY819 | ASSERT((Eigen::internal::has_ReturnType<ScalarBinaryOpTraits<LHS, RHS,BINOP> >::value), \| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~
报错原因
- 这个错误是因为在 Eigen 库的操作中混合使用了不同的数值类型,而没有显式地进行类型转换。Eigen 要求在操作涉及不同类型的数值时,必须使用其
.cast<>()方法来显式转换类型,以确保操作的数学和类型正确性。
解决办法
-
修改linear_solver_eigen.h(ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/solvers/eigen)的第54行
-
从
-
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix; -
改为
-
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> PermutationMatrix;
在使用 Eigen 库时,向期望整数的参数传递了浮点数,导致类型不匹配

/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/examples/tutorial_slam2d/simulator.cpp:80:39: required from here
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:778:27: error: static assertion failed: FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED778 | EIGEN_STATIC_ASSERT(is_integer,| ^~~~~~~~~~
报错原因
- 这个编译错误发生是因为在使用 Eigen 库时,期望一个整数类型的参数却错误地传入了一个浮点数,违反了 Eigen 对于参数类型的要求,Eigen 静态断言失败是为了确保类型安全,防止错误的数据类型使用。
解决办法
-
修改simulator.cpp(ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/examples/tutorial_slam2d)的第80行
-
从
-
VectorXd probLimits(MO_NUM_ELEMS); for (int i = 0; i < probLimits.size(); ++i)probLimits[i] = (i + 1) / (double) MO_NUM_ELEMS; -
改为
-
VectorXd probLimits; probLimits.resize(MO_NUM_ELEMS); for (int i = 0; i < probLimits.size(); ++i)probLimits[i] = (i + 1) / (double) MO_NUM_ELEMS;
编译DBoW2

cd orbslam2_modified/ORB_SLAM2_modified/Thirdparty/DBoW2
mkdir build
cd build
cmake ..
make
编译Pangolin模块
- 略
- https://github.com/stevenlovegrove/Pangolin
获取Vocabulary


- 将ORB_SLAM2原仓库的Vocabulary文件夹复制过来,替代这里的空的Vocabulary文件夹
编译修改后的ORB_SLAM2
cd ORB_SLAM2_modified
mkdir build
cd build
cmake ..
make
编译报错解决
未能找到匹配请求的版本 “2.4.3” 的 OpenCV 配置文件,尽管检查了多个更高版本的安装

CMake Error at CMakeLists.txt:33 (find_package):Could not find a configuration file for package "OpenCV" that is compatiblewith requested version "2.4.3".The following configuration files were considered but not accepted:/usr/local/opencv3.2.0/share/OpenCV/OpenCVConfig.cmake, version: 3.2.0/usr/local/opencv-4.4.0/lib/cmake/opencv4/OpenCVConfig.cmake, version: 4.4.0/usr/local/opencv-3.2.0/share/OpenCV/OpenCVConfig.cmake, version: 3.2.0/usr/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig.cmake, version: 4.2.0/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig.cmake, version: 4.2.0-- Configuring incomplete, errors occurred!
报错原因
- 这个 CMake 错误发生是因为 CMake 在配置时未能找到与指定版本(2.4.3)兼容的 OpenCV 包配置文件,尽管考虑了多个已安装的更高版本(3.2.0, 4.4.0, 和 4.2.0),但这些都不满足指定的版本需求。
解决方法
-
修改ORB_SLAM2_modified下的CMakeLists.txt
-
将
-
find_package(OpenCV 2.4.3 REQUIRED) -
改为自己系统中安装的OpenCV版本即可
-
例如 我这里装的是OpenCV 3.2.0
-
find_package(OpenCV 3.2.0 REQUIRED)
当前编译环境未设置为使用 PCL 所需的 C++14 或更高版本的编译标准

/usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above7 | #error PCL requires C++14 or above| ^~~~~
报错原因
- 这个编译错误发生是因为 Point Cloud Library (PCL) 需要 C++14 或更高版本的编译标准,而当前的编译环境可能未设置为使用 C++14 或更高。
解决方法
-
修改ORB_SLAM2_modified下的CMakeLists.txt
-
将
-
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX11)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")add_definitions(-DCOMPILEDWITHC11)message(STATUS "Using flag -std=c++11.") elseif(COMPILER_SUPPORTS_CXX0X)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")add_definitions(-DCOMPILEDWITHC0X)message(STATUS "Using flag -std=c++0x.") else()message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() -
其中的11全部改为14即可
-
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) if(COMPILER_SUPPORTS_CXX14)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")add_definitions(-DCOMPILEDWITHC14)message(STATUS "Using flag -std=c++14.") elseif(COMPILER_SUPPORTS_CXX0X)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")add_definitions(-DCOMPILEDWITHC0X)message(STATUS "Using flag -std=c++0x.") else()message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.") endif()
std::map 的分配器的值类型与 map 的值类型不一致,导致静态断言失败

/usr/include/c++/9/bits/stl_map.h:122:71: error: static assertion failed: std::map must have the same value_type as its allocator122 | static_assert(is_same<typename _Alloc::value_type, value_type>::value,| ^~~~~
报错原因
这个编译错误是因为在使用 std::map 时,分配器(allocator)的 value_type 和 std::map 的值类型不匹配,违反了 STL map 的类型一致性要求,导致静态断言失败。
解决方法
-
修改LoopClosing.h(ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/include)中的第49行
-
从
-
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose; -
改为
-
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,Eigen::aligned_allocator<std::pair<KeyFrame* const, g2o::Sim3> > > KeyFrameAndPose;
代码错误地引用了不存在的 std::chrono::monotonic_clock 类,导致相关时间点变量 t1 和 t2 未被正确声明

/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc: In function ‘int main(int, char**)’:
/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:81:22: error: ‘std::chrono::monotonic_clock’ has not been declared81 | std::chrono::monotonic_clock::time_point t1 = std::chrono::monotonic_clock::now();| ^~~~~~~~~~~~~~~
/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:90:22: error: ‘std::chrono::monotonic_clock’ has not been declared90 | std::chrono::monotonic_clock::time_point t2 = std::chrono::monotonic_clock::now();| ^~~~~~~~~~~~~~~
/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:93:83: error: ‘t2’ was not declared in this scope; did you mean ‘tm’?93 | uble ttrack= std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count();| ^~| tm
/home/lyb/ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:93:88: error: ‘t1’ was not declared in this scope; did you mean ‘y1’?93 | uble ttrack= std::chrono::duration_cast<std::chrono::duration<double> >(t2 - t1).count();| ^~| y1
报错原因
- 这些编译错误发生因为代码中尝试使用了不存在的
std::chrono::monotonic_clock类,该类在 C++ 标准库中并未定义。此外,由于t1和t2变量的声明失败(因为它们依赖于不存在的monotonic_clock类),后续代码中尝试使用这些变量时也出现了错误,提示未声明的变量。正确的类应该是std::chrono::steady_clock或std::chrono::system_clock。
解决方法
- 将代码中所有使用
std::chrono::monotonic_clock的地方替换为std::chrono::steady_clock。 - 主要存在于以下文件中(ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples)
- Monocular
- mono_kitti.cc
- mono_tum.cc
- RGB-D
- rgbd_tum.cc
- Stereo
- stereo_kitti.cc
- Monocular
运行ORB_SLAM2 RGBD
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml ~/rgbd_dataset_freiburg1_xyz Examples/RGB-D/associations/fr1_xyz.txt
- 运行成功,效果如下

运行报错解决
段错误 (核心已转储)

Depth Threshold (Close/Far Points): 3.86618
段错误 (核心已转储)
报错原因
- “段错误 (核心已转储)” 错误通常表明程序试图访问其内存空间中未授权或不存在的部分,这可能是由于无效的指针引用、数组越界、或其他内存管理错误导致的。
解决方法
-
删除所有CMakeLists.txt文件里的
-march=native -
如下
-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -march=native ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -march=native") -
修改为
-
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall ") -
主要存在于以下文件中:
- ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/CMakeLists.txt
- ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Examples/ROS/ORB_SLAM2/CMakeLists.txt
- ORBSLAM2_with_pointcloud_map/orbslam2_modified/ORB_SLAM2_modified/Thirdparty/DBoW2/CMakeLists.txt
-
之后全部重新用CMake构建,Make编译一遍即可,再次运行即可运行成功。

相关文章:
Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra+为例)保姆级教程
Ubuntu20.04 编译运行 ORBSLAM2_with_pointcloud_map(以RGBD Orbbec Astra为例) 获取源码 git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git解压文件 得到如下内容 编译安装修改后的g2o cd g2o_with_orbslam2 mkdir build cd build cmake .. make…...
MyBatis(四)
第一章:MyBatis延迟加载策略 1. 延迟加载的概念 立即加载和延迟加载的区别,使用一对多的环境举例子。 立即加载:当前查询用户的时候,默认也把该用户所拥有的帐户信息查询出来了。 延迟加载:当前查询用户的时候&…...
【从零开始的LeetCode-算法】3285. 找到稳定山的下标
有 n 座山排成一列,每座山都有一个高度。给你一个整数数组 height ,其中 height[i] 表示第 i 座山的高度,再给你一个整数 threshold 。 对于下标不为 0 的一座山,如果它左侧相邻的山的高度 严格大于 threshold ,那么我…...
Docker常用命令总结~
1、关于镜像 获取镜像 docker pull [image name] [option:tag]AI助手//获取postgres镜像(没有设置镜像版本号则默认获取最新的,使用latest标记) docker pull postgres or docker pull postgres:11.14 列出本地镜像 docker imagesAI助手 指定镜像启动一个容…...
浅谈怎样系统的准备前端面试
前言 创业梦碎,回归现实,7 月底毅然裸辞,苦战两个月,拿到了美团和字节跳动的 offer,这算是从业以来第一次真正意义的面试,遇到蛮多问题,比如一开始具体的面试过程我都不懂,基本一直是…...
如何配置防火墙提高服务器安全性
配置防火墙是提高服务器安全性的重要措施之一。防火墙可以控制网络流量,限制未经授权的访问,防止恶意攻击。以下是配置防火墙以提高服务器安全性的详细指南。 一、为什么需要配置防火墙 防火墙的主要作用是: 限制未经授权的访问:…...
java集合-Map HashMap 源码解析
hashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,无序,不可重复。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap 实现了Ser…...
案例分享|企查查的数据降本增效之路
分享嘉宾 任何强 企查查科技股份有限公司 大数据架构负责人 关于企查查 “企查查”是企查查科技股份有限公司旗下的一款企业信用查询工具。2023年5月20日,企查查正式发布全球首款商查大模型——“知彼阿尔法”,该模型基于企查查覆盖的全球企业信用数据进…...
图书馆管理系统(四)基于jquery、ajax--完结篇
任务3.6 后端代码编写 任务描述 这个部分主要想实现图书馆管理系统的后端,使用 Express 框架来处理 HTTP 请求,并将书籍数据存储在一个文本文件 books.txt 中。 任务实施 3.6.1 引入模块及创建 Express 应用 const express require(express); cons…...
什么是Modbus协议网关?
在工业自动化领域,设备间的通信与数据交换是实现高效、智能控制的关键。Modbus协议作为一种广泛应用的通信协议,自1971年由Modicon公司首次推出以来,便以其标准、开放、支持多种电气接口等特点,在工业控制系统中占据了重要地位。然…...
Docker 容器中启用 SSH 服务
在 Docker 容器中运行 SSH 服务需要一些调整,因为 Docker 容器通常使用 init 系统而不是完整的 systemd。以下是配置 SSH 服务在 Docker Ubuntu 容器中运行的步骤: 1. 安装 SSH 服务 如果还未安装 OpenSSH,请先安装: apt update…...
Linux系统—利用systemd管控系统以及服务详解(十四)
本文为Ubuntu Linux操作系统- 第十四弹~~ 新的一周开始了,时间过得真快,这星期就要冬至啦!! 今天继续Linux系统高级管理板块,主要讲述使用systemd管控系统和服务~ 上期回顾:“Linux系统—进程管理详解” 更…...
人工智能 AI 大模型研究设计与实践应用技术毕业论文
标题:人工智能 AI 大模型研究设计与实践应用技术 内容:1.摘要 人工智能 AI 大模型是当前人工智能领域的研究热点之一,它具有高度的通用性、灵活性和智能性,可以应用于多种领域,如自然语言处理、计算机视觉、语音识别等。本文旨在探讨人工智能…...
已有 containerd 的情况下部署二进制 docker 共存
文章目录 [toc]学习目的开始学习dockerd启动 containerd准备配置文件启动 containerd 启动 docker准备配置文件启动 docker 环境验证停止 docker 和 containerd 学习目的 使用容器的方式做一些部署的交付,相对方便很多,不需要担心别人的环境缺少需要的依…...
VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)
名人说:一点浩然气,千里快哉风。—— 苏轼《水调歌头》 创作者:Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客,更多详细的安装教程&…...
vue+springboot+cas配置及cookie传递问题
cookie的注意事项 前边的文章已经介绍过cookie的基本信息,这里再次说明一点:cookie是无法进行跨域传递的,很多时候cookie无法设置和传递都是因为跨域问题,ip/端口不一致。 主要就是:被设置cookie和要传递cookie的地址…...
0009.基于springboot+layui的ERP企业进销存管理系统
一、系统说明 基于springbootlayui的ERP企业进销存管理系统,系统功能齐全, 代码简洁易懂,适合小白学编程,课程设计,毕业设计。 二、系统架构 前端:html| layui 后端:springboot | mybatis| thymeleaf 环境:jdk1.8 |…...
ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟
由于需要进行一些FPGA的简单开发,但板载PL端没有焊接晶振,所以需要从PS端借用时钟到PL端使用。 首先新建项目,根据自己的板载选择芯片,我的板载芯片是zynq_7010。 一路next,在自己的vivado的工作文档新建文件夹并给自…...
Android详解——ConstraintLayout约束布局
目录 一、ConstraintLayout概述 二、ConstraintLayout属性介绍 1. 相对位置 2. 边距 3. 中心和偏移位置 中心位置 偏移位置 4. 圆形位置 5. 可见性 6. 尺寸约束 最小尺寸 WRAP_CONTENT :强制约束 MATCH_CONSTRAINT Min和Max 百分比尺寸 比率 7. 链式布局 创建…...
docker简单命令
docker images 查看镜像文件 docker ps -a 查看容器文件 docker rm 0b2 删除容器文件,id取前三位即可 docker rmi e64 删除镜像文件(先删容器才能删镜像),id取前三位即可 在包含Dockerfile文件的目录…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
