当前位置: 首页 > news >正文

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>&)类型的函数 setRotationEigen::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_typestd::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 类,导致相关时间点变量 t1t2 未被正确声明

在这里插入图片描述

/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++ 标准库中并未定义。此外,由于 t1t2 变量的声明失败(因为它们依赖于不存在的 monotonic_clock 类),后续代码中尝试使用这些变量时也出现了错误,提示未声明的变量。正确的类应该是 std::chrono::steady_clockstd::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

运行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(四)

第一章&#xff1a;MyBatis延迟加载策略 1. 延迟加载的概念 立即加载和延迟加载的区别&#xff0c;使用一对多的环境举例子。 立即加载&#xff1a;当前查询用户的时候&#xff0c;默认也把该用户所拥有的帐户信息查询出来了。 延迟加载&#xff1a;当前查询用户的时候&…...

【从零开始的LeetCode-算法】3285. 找到稳定山的下标

有 n 座山排成一列&#xff0c;每座山都有一个高度。给你一个整数数组 height &#xff0c;其中 height[i] 表示第 i 座山的高度&#xff0c;再给你一个整数 threshold 。 对于下标不为 0 的一座山&#xff0c;如果它左侧相邻的山的高度 严格大于 threshold &#xff0c;那么我…...

Docker常用命令总结~

1、关于镜像 获取镜像 docker pull [image name] [option:tag]AI助手//获取postgres镜像(没有设置镜像版本号则默认获取最新的&#xff0c;使用latest标记) docker pull postgres or docker pull postgres:11.14 列出本地镜像 docker imagesAI助手 指定镜像启动一个容…...

浅谈怎样系统的准备前端面试

前言 创业梦碎&#xff0c;回归现实&#xff0c;7 月底毅然裸辞&#xff0c;苦战两个月&#xff0c;拿到了美团和字节跳动的 offer&#xff0c;这算是从业以来第一次真正意义的面试&#xff0c;遇到蛮多问题&#xff0c;比如一开始具体的面试过程我都不懂&#xff0c;基本一直是…...

如何配置防火墙提高服务器安全性

配置防火墙是提高服务器安全性的重要措施之一。防火墙可以控制网络流量&#xff0c;限制未经授权的访问&#xff0c;防止恶意攻击。以下是配置防火墙以提高服务器安全性的详细指南。 一、为什么需要配置防火墙 防火墙的主要作用是&#xff1a; 限制未经授权的访问&#xff1a…...

java集合-Map HashMap 源码解析

hashMap简介 HashMap是基于哈希表实现的&#xff0c;每一个元素是一个key-value对&#xff0c;无序&#xff0c;不可重复。HashMap是非线程安全的&#xff0c;只是用于单线程环境下&#xff0c;多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap 实现了Ser…...

案例分享|企查查的数据降本增效之路

分享嘉宾 任何强 企查查科技股份有限公司 大数据架构负责人 关于企查查 “企查查”是企查查科技股份有限公司旗下的一款企业信用查询工具。2023年5月20日&#xff0c;企查查正式发布全球首款商查大模型——“知彼阿尔法”&#xff0c;该模型基于企查查覆盖的全球企业信用数据进…...

图书馆管理系统(四)基于jquery、ajax--完结篇

任务3.6 后端代码编写 任务描述 这个部分主要想实现图书馆管理系统的后端&#xff0c;使用 Express 框架来处理 HTTP 请求&#xff0c;并将书籍数据存储在一个文本文件 books.txt 中。 任务实施 3.6.1 引入模块及创建 Express 应用 const express require(express); cons…...

什么是Modbus协议网关?

在工业自动化领域&#xff0c;设备间的通信与数据交换是实现高效、智能控制的关键。Modbus协议作为一种广泛应用的通信协议&#xff0c;自1971年由Modicon公司首次推出以来&#xff0c;便以其标准、开放、支持多种电气接口等特点&#xff0c;在工业控制系统中占据了重要地位。然…...

Docker 容器中启用 SSH 服务

在 Docker 容器中运行 SSH 服务需要一些调整&#xff0c;因为 Docker 容器通常使用 init 系统而不是完整的 systemd。以下是配置 SSH 服务在 Docker Ubuntu 容器中运行的步骤&#xff1a; 1. 安装 SSH 服务 如果还未安装 OpenSSH&#xff0c;请先安装&#xff1a; apt update…...

Linux系统—利用systemd管控系统以及服务详解(十四)

本文为Ubuntu Linux操作系统- 第十四弹~~ 新的一周开始了&#xff0c;时间过得真快&#xff0c;这星期就要冬至啦&#xff01;&#xff01; 今天继续Linux系统高级管理板块&#xff0c;主要讲述使用systemd管控系统和服务~ 上期回顾&#xff1a;“Linux系统—进程管理详解” 更…...

人工智能 AI 大模型研究设计与实践应用技术毕业论文

标题:人工智能 AI 大模型研究设计与实践应用技术 内容:1.摘要 人工智能 AI 大模型是当前人工智能领域的研究热点之一&#xff0c;它具有高度的通用性、灵活性和智能性&#xff0c;可以应用于多种领域&#xff0c;如自然语言处理、计算机视觉、语音识别等。本文旨在探讨人工智能…...

已有 containerd 的情况下部署二进制 docker 共存

文章目录 [toc]学习目的开始学习dockerd启动 containerd准备配置文件启动 containerd 启动 docker准备配置文件启动 docker 环境验证停止 docker 和 containerd 学习目的 使用容器的方式做一些部署的交付&#xff0c;相对方便很多&#xff0c;不需要担心别人的环境缺少需要的依…...

VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。—— 苏轼《水调歌头》 创作者&#xff1a;Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客&#xff0c;更多详细的安装教程&…...

vue+springboot+cas配置及cookie传递问题

cookie的注意事项 前边的文章已经介绍过cookie的基本信息&#xff0c;这里再次说明一点&#xff1a;cookie是无法进行跨域传递的&#xff0c;很多时候cookie无法设置和传递都是因为跨域问题&#xff0c;ip/端口不一致。 主要就是&#xff1a;被设置cookie和要传递cookie的地址…...

0009.基于springboot+layui的ERP企业进销存管理系统

一、系统说明 基于springbootlayui的ERP企业进销存管理系统,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程,课程设计&#xff0c;毕业设计。 二、系统架构 前端&#xff1a;html| layui 后端&#xff1a;springboot | mybatis| thymeleaf 环境&#xff1a;jdk1.8 |…...

ZYNQ初识2(zynq_7010)基于vivado,从PL端调用PS端的时钟

由于需要进行一些FPGA的简单开发&#xff0c;但板载PL端没有焊接晶振&#xff0c;所以需要从PS端借用时钟到PL端使用。 首先新建项目&#xff0c;根据自己的板载选择芯片&#xff0c;我的板载芯片是zynq_7010。 一路next&#xff0c;在自己的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 删除容器文件&#xff0c;id取前三位即可 docker rmi e64 删除镜像文件&#xff08;先删容器才能删镜像&#xff09;&#xff0c;id取前三位即可 在包含Dockerfile文件的目录…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...