ORB-SLAM2_RGBD_DENSE_MAP编译、问题解决、离线加载TUM数据和在线加载D435i相机数据生成稠密地图

news2024/11/18 3:29:39

文章目录

  • 0 引言
  • 1 安装依赖
    • 1.1 其他库安装
    • 1.2 pcl库安装
  • 2 编译ORB-SLAM2_RGBD_DENSE_MAP
    • 2.1 build.sh
    • 2.2 build_ros.sh
  • 3 运行ORB-SLAM2_RGBD_DENSE_MAP
    • 3.1 build.sh编译版本
    • 3.2 build_ros.sh编译版本

0 引言

ORB-SLAM2_RGBD_DENSE_MAP是基于ORB-SLAM2框架的一种RGB-D稠密地图构建算法。ORB-SLAM2是一种基于单目、双目和RGB-D相机的实时定位与建图(SLAM)系统,旨在通过计算机视觉技术实现机器人和自主驾驶汽车等设备的自主定位和地图构建。

ORB-SLAM2_RGBD_DENSE_MAP的主要思想是结合ORB-SLAM2框架的稠密重建算法和体素网格(Voxel Grid)滤波器,对RGB-D相机采集到的图像数据进行处理,从而得到一个稠密的3D点云表示,进而构建出稠密的地图。该算法通过对相邻帧之间的视差图进行计算,利用三角测量法估计相机到场景中每个像素的深度值,并通过体素网格滤波器对深度图进行降采样,从而减少计算量和存储空间。最终,该算法可以生成一个具有高精度和高分辨率的稠密地图。

ORB-SLAM2_RGBD_DENSE_MAP算法的优点是具有较高的重建精度和鲁棒性,在各种环境和光照条件下均表现良好。然而,由于该算法需要进行大量的计算和存储,因此它的实时性运行效率可能受到一定的影响。

本文系统环境:

  • Ubuntu18.04
  • ROS-melodic
  • OpenCV3.2.0
  • Eigen 3.3.4
  • Pangolin-0.6
  • PCL 1.8.1
  • realsense-ros (若用硬件D435i)

1 安装依赖

1.1 其他库安装

ORB-SLAM2算法1已针对Ubuntu20.04安装ORB-SLAM2所需的依赖库,安装 OpenCVEigenPangolin 可以参考下。

1.2 pcl库安装

ORB-SLAM2_RGBD_DENSE_MAP 因为是稠密建图,还需要安装pcl1.7以上版本,本文是安装了pcl1.8大版本,可先下载 pcl 1.8.1 版本(点击Source code(zip)

先安装pcl1.8.1所需的依赖库:

sudo apt-get update  
sudo apt-get install git build-essential linux-libc-dev
sudo apt-get install cmake cmake-gui
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common 
sudo apt-get install libflann1.9 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libvtk7.1-qt libvtk7.1
sudo apt-get install libqhull* libgtest-dev
sudo apt-get install freeglut3-dev pkg-config
sudo apt-get install libxmu-dev libxi-dev
sudo apt-get install mono-complete
sudo apt-get install openjdk-8-jdk openjdk-8-jre

然后解压下载的pcl1.8.1源码,并进入到pcl1.8.1文件夹中

mkdir build
cd build
cmake ..
make -j4
sudo make install

测试pcl是否安装成功的话,可用pcl_viewer xxx.pcd;如果没有pcd文件,可去点云库PCL(Point Cloud Library)的学习资源汇总下载rabbit.pcd

pcl_viewer rabbit.pcd

请添加图片描述

2 编译ORB-SLAM2_RGBD_DENSE_MAP

编译类似ORB-SLAM2的安装,但可能会出现不一样的问题。首先下载ORB-SLAM2_RGBD_DENSE_MAP

git clone https://github.com/xiaobainixi/ORB-SLAM2_RGBD_DENSE_MAP.git

由于安装的是pcl1.8,首先将CMakeLists.txtfind_package( PCL 1.7 REQUIRED )改成了find_package( PCL 1.8 REQUIRED )

2.1 build.sh

# 下载的ORB-SLAM2_RGBD_DENSE_MAP工程目录下
chmod +x build.sh
./build.sh

tips: ./build.sh > build_log.txt 2>&1 可打印整个编译log到文件

  1. 编译问题1
make: *** [all] Error 1
Converting vocabulary to binary
./build.sh: line 30: ./tools/bin_vocabulary: Permission denied

原因是./tools/bin_vocabulary 词袋文件没有执行权限,如下给其权限

# ORB-SLAM2_RGBD_DENSE_MAP 目录下执行
sudo chmod +x tools/bin_vocabulary
  1. 编译问题2
../Thirdparty/DBoW2/lib/libDBoW2.so: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
collect2: error: ld returned 1 exit status
CMakeFiles/rgbd_tum.dir/build.make:391: recipe for target '../bin/rgbd_tum' failed
make[2]: *** [../bin/rgbd_tum] Error 1
CMakeFiles/Makefile2:124: recipe for target 'CMakeFiles/rgbd_tum.dir/all' failed
make[1]: *** [CMakeFiles/rgbd_tum.dir/all] Error 2
Makefile:90: recipe for target 'all' failed
make: *** [all] Error 2
Converting vocabulary to binary
./tools/bin_vocabulary: error while loading shared libraries: libopencv_core3.so.3.3: cannot open shared object file: No such file or directory

Error1一开始以为OpenCV的问题,但后来排查到我这个是由于之前尝试编译时,第三方库DBoW2g2o没有完全编译,删除两个第三方库中的build文件夹,重新编译即可。

Error2tools中的bin_vocabulary词袋找不到libopencv_core3.so.3.3,而且ORB-SLAM2_RGBD_DENSE_MAPlib也没有该版本的opencv动态链接库,而本文系统安装的是OpenCV 3.2.0,版本也不符合,所以临时解决办法是不用bin_vocabulary词袋可执行文件,改用ORB-SLAM2工程中的词袋文件ORBvoc.txt

# 首先注释掉 build.sh 中的bin_vocabulary部分
# 最后几行注释掉

# cd ..
# echo "Converting vocabulary to binary"
# ./tools/bin_vocabulary

最后复制ORB-SLAM2中的词袋文件夹VocabularyORB-SLAM2_RGBD_DENSE_MAP工程目录下。

重新编译,即可编译成功

/usr/include/eigen3/Eigen/src/Core/util/Constants.h:162:37: note: declared here
 EIGEN_DEPRECATED const unsigned int AlignedBit = 0x80;
                                     ^~~~~~~~~~
[ 94%] Linking CXX executable ../bin/mono_tum
[ 97%] Linking CXX executable ../bin/mono_kitti
[100%] Linking CXX executable ../bin/mono_euroc
[100%] Built target mono_tum
[100%] Built target mono_kitti
[100%] Built target mono_euroc

2.2 build_ros.sh

首先添加该工程到ROS_PACKAGE_PATH

gedit ~/.bashrc
# 最后一行新增,其中冒号后的PATH是自己ORB-SLAM2_RGBD_DENSE_MAP工程存放目录
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB-SLAM2_RGBD_DENSE_MAP/Examples/ROS
# 保存后source
source ~/.bashrc

然后执行如下命令进行编译

# 下载的ORB-SLAM2_RGBD_DENSE_MAP工程目录下
chmod +x build_ros.sh
./build_ros.sh

3 运行ORB-SLAM2_RGBD_DENSE_MAP

3.1 build.sh编译版本

由于用到rgbdepth图,所以参考ORB-SLAM2算法2下载TUMrgbd_dataset_freiburg1_desk数据集,准备好数据集后,可执行以下命令,其中PATHrgbd_dataset_freiburg1_desk文件夹的存放目录

# 下载的ORB-SLAM2_RGBD_DENSE_MAP工程目录下
./bin/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml PATH/rgbd_dataset_freiburg1_desk PATH/rgbd_dataset_freiburg1_desk/associations.txt
  1. 运行问题1
Depth Threshold (Close/Far Points): 3.09294

-------
Start processing sequence ...
Images in the sequence: 573

New map created with 945 points
Segmentation fault (core dumped)

这种 段错误(核心已转储)的问题本文暂未完全解决(如有,欢迎分享交流),先用以下的临时解决办法(该问题仍会偶发):

  1. CMakeLists.txtThirdparty/g2o/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 -O3")
  1. 在有定义Eigen的头文件中添加预编译命令EIGEN_MAKE_ALIGNED_OPERATOR_NEW ,分别是include路径下Converter.h、LoopClosing.h、PointCloude.h这三个文件
    Converter.h
class Converter
{
	public:
	# 添加预编译命令
	EIGEN_MAKE_ALIGNED_OPERATOR_NEW
	static std::vector<cv::Mat> toDescriptorVector(const cv::Mat &Descriptors);
	
	static g2o::SE3Quat toSE3Quat(const cv::Mat &cvT);
	static g2o::SE3Quat toSE3Quat(const g2o::Sim3 &gSim3);

LoopClosing.h(两次修改,第一个public中添加,第二个public中的注释掉)

class LoopClosing
{

public:
	# 添加预编译命令
	EIGEN_MAKE_ALIGNED_OPERATOR_NEW
	typedef pair<set<KeyFrame*>,int> ConsistentGroup;
	typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
		Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;
	
public:
	
	LoopClosing(Map* pMap, KeyFrameDatabase* pDB, ORBVocabulary* pVoc,const bool bFixScale, shared_ptr<PointCloudMapping> pPointCloud);
	
	void SetTracker(Tracking* pTracker);
	void SetLocalMapper(LocalMapping* pLocalMapper);
	// Main function
	void Run();
	void InsertKeyFrame(KeyFrame *pKF);
	void RequestReset();
	// This function will run in a separate thread
	void RunGlobalBundleAdjustment(unsigned long nLoopKF);
	shared_ptr<PointCloudMapping> mpPointCloudMapping;
	bool isRunningGBA(){
		unique_lock<std::mutex> lock(mMutexGBA);
		return mbRunningGBA;
	}
	bool isFinishedGBA(){
		unique_lock<std::mutex> lock(mMutexGBA);
		return mbFinishedGBA;
	}
	
	void RequestFinish();
	
	bool isFinished();
	# 注释掉预编译命令
	// EIGEN_MAKE_ALIGNED_OPERATOR_NEW
	int loopcount = 0;

PointCloude.h

class PointCloude
{
	typedef pcl::PointXYZRGBA PointT;
	typedef pcl::PointCloud<PointT> PointCloud;
public:
	PointCloud::Ptr pcE;
public:
	# 添加预编译命令
	EIGEN_MAKE_ALIGNED_OPERATOR_NEW
	Eigen::Isometry3d T;
	int pcID;
  1. 运行问题2
viewer视图中没有点云,只有坐标系

改动include文件夹中的 pointcloudmapping.h头文件

# bool loopbusy;
bool loopbusy = false;

  1. 运行问题3
    确认TUM1.yaml文件里有没有点云地图的参数,如果没有,就把以下几行加在最后面
PointCloudMapping.Resolution: 0.01
meank: 50
thresh: 2.0

重新执行./build.sh,编译完成后,重新执行:

# 下载的ORB-SLAM2_RGBD_DENSE_MAP工程目录下
./bin/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml PATH/rgbd_dataset_freiburg1_desk PATH/rgbd_dataset_freiburg1_desk/associations.txt

运行结果:

median tracking time: 0.0200984
mean tracking time: 0.0206714

Saving camera trajectory to CameraTrajectory1.txt ...

trajectory saved!

Saving keyframe trajectory to CameraTrajectory2.txt ...

trajectory saved!
globalMap save finished

Current Frame 关键帧可视化界面:

请添加图片描述
Map Viewer 轨迹地图可视化界面:

请添加图片描述
viewer 稠密地图可视化界面:

请添加图片描述
保存的稠密地图文件result.pcd可用已安装的pcl打开:
pcl_viewer result.pcd

请添加图片描述

至此,成功用TUM数据包运行非ROS版本的ORB-SLAM2_RGBD_DENSE_MAP,并可视化生成的稠密地图。

3.2 build_ros.sh编译版本

本文这里就不用TUM的开源数据测试了,因为恰好有D435i相机可以实时发出深度图和rgb图来测试(录制的一小段数据ORB-SLAM2-RGBD-DENSE-MAP-data.tar),所以以下就是以此为例。

默认已经安装realsense-ros的相机驱动,首先是相机启动文件(rs_camera.launch)的配置,保证发出与rgb图对齐的深度图:false修改成true

  <arg name="enable_depth"        default="true"/>

然后插上D435i相机后(USB3.0),新开终端启动D435i相机:

# source 激活realsense-ros的相机驱动后执行
roslaunch realsense2_camera rs_camera.launch

启动后,通过rostopic list可查的所需的rgb图和对齐的深度图的topic

# 与rgb图对齐的深度图
/camera/aligned_depth_to_color/image_raw
# rgb图
/camera/color/image_raw

然后修改代码中的两个topic,在ORB-SLAM2_RGBD_DENSE_MAP/Examples/ROS/ORB_SLAM21/src/ros_rgbd.cc文件中修改:

    // message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, "/kinect2/qhd/image_color_rect", 1);
    // message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, "/kinect2/qhd/image_depth_rect", 1);
    message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, "/camera/color/image_raw", 1);
    message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, "/camera/aligned_depth_to_color/image_raw", 1);

当然,还有对应的配置文件,在ORB-SLAM2_RGBD_DENSE_MAP/Examples/ROS/ORB_SLAM21/目录下新建配置文件d435i.yaml,主要是fx, fy, cx, cy、分辨率,帧率,baseline等要修改成所用的D435i相机对应的,好在D435i相机发出的rgb图已经是去畸变的,而且给出了内参,可通过rostopic echo /camera/color/camera_info命令查询,具体如下:

查询结果:其中K即是所需的内参

header: 
  seq: 0
  stamp: 
    secs: 1691576284
    nsecs: 247732162
  frame_id: "camera_color_optical_frame"
height: 540
width: 960
distortion_model: "plumb_bob"
D: [0.0, 0.0, 0.0, 0.0, 0.0]
K: [682.6236572265625, 0.0, 490.54339599609375, 0.0, 682.521240234375, 275.81976318359375, 0.0, 0.0, 
1.0]
R: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
P: [682.6236572265625, 0.0, 490.54339599609375, 0.0, 0.0, 682.521240234375, 275.81976318359375, 0.0, 
0.0, 0.0, 1.0, 0.0]

d435i.yaml配置文件信息:

%YAML:1.0

#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------

# Camera calibration and distortion parameters (OpenCV) 
Camera.fx: 682.6236572265625
Camera.fy: 682.521240234375
Camera.cx: 490.54339599609375
Camera.cy: 275.81976318359375

Camera.k1: 0.0
Camera.k2: 0.0
Camera.p1: 0.0
Camera.p2: 0.0
Camera.p3: 0.0

Camera.width: 960
Camera.height: 540
# Camera frames per second 
Camera.fps: 15.0

# IR projector baseline times fx (aprox.)
# bf = baseline (in meters) * fx, D435i的 baseline = 50 mm 
Camera.bf: 50.0

# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 1

# Close/Far threshold. Baseline times.
ThDepth: 40.0

# Deptmap values factor
DepthMapFactor: 1000.0

#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------

# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 1000

# ORB Extractor: Scale factor between levels in the scale pyramid 	
ORBextractor.scaleFactor: 1.2

# ORB Extractor: Number of levels in the scale pyramid	
ORBextractor.nLevels: 8

# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast			
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7

#--------------------------------------------------------------------------------------------
# Viewer Parameters
#--------------------------------------------------------------------------------------------
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize:2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500

PointCloudMapping.Resolution: 0.01
meank: 50
thresh: 2.0

然后重新执行./build_ros.sh编译,编译成功后执行如下命令运行:

# ORB-SLAM2_RGBD_DENSE_MAP 目录下执行
rosrun ORB_SLAM21 RGBD Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM21/d435i.yaml

运行后相比原版的ORB-SLAM2多生成一个viewer的稠密建图的可视化界面:

Current Frame可视化界面:

请添加图片描述
Map Viewer可视化界面:

请添加图片描述
viewer可视化界面:

请添加图片描述
至此,成功用在线加载D435i相机发出的rgb图和对齐的深度图,运行ROS版本的ORB-SLAM2_RGBD_DENSE_MAP,并可视化生成的稠密地图。

Reference:

  1. ORB-SLAM2_RGBD_DENSE_MAP
  2. ORB-SLAM2算法1之Ubuntu20.04+ROS-noetic安装ORB-SLAM2及各种问题解决
  3. 点云库PCL(Point Cloud Library)的学习资源汇总
  4. ORB-SLAM2算法2之TUM开源数据运行ORB-SLAM2生成轨迹并用evo工具评估轨迹
  5. ORB-SLAM2-RGBD-DENSE-MAP-data.tar



须知少时凌云志,曾许人间第一流。



⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018384.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】LeetCode 160 相交链表

今天再写一道算法题&#xff08;这两周都写算法题有点摆烂&#xff09; 题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1…

第17篇ESP32 platformio_arduino框架 AP热点与AP+STA同时存在模式

笔记本连接ESP32后&#xff0c;串口打印连接状态&#xff1a; 第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit…

影楼管理系统软件erp如何通过快解析发布到外网登录访问

影楼管理系统也叫影楼ERP软件&#xff0c;即影楼信息化管理系统&#xff0c;通常集成了选片、影楼流程管理、婚纱礼服、影楼财务、影楼客服、影楼接单等多功能为一身的影楼app管理。通过影楼管理系统把客户关系管理理念引入影楼管理&#xff0c;有序而全面的建立客户资料库&…

【9】openGL调用imGUI使用其自带例子测试

参考视频 去github下载imgui源码&#xff0c;得到 将根目录下所有.h .cpp文件复制到你的项目文件夹imgui下面。 进入exmaple文件夹&#xff0c;可以看到例子 这是它调用的头文件 在backends里找到你需要的 .h .cpp文件&#xff0c;总共四个文件&#xff0c;复制过来 你的项…

使用阿里云无影云电脑能干什么?

阿里云无影云电脑是一种易用、安全、高效的云上桌面服务&#xff0c;阿里云无影云电脑可用于高数据安全管控、高性能计算等要求的金融、设计、视频、教育等领域&#xff0c;适用于多种办公场景&#xff0c;如远程办公、多分支机构、安全OA、短期使用、专业制图等。阿里云百科来…

Java基于微信小程序的电影交流平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 第一章&#xff1a;简介第二章、开发环境&#xff1a;后端&#xff1a;前端&#xff1a;数据库&…

阿里云无影云电脑介绍_云办公_使用_价格和优势说明

什么是阿里云无影云电脑&#xff1f;无影云电脑&#xff08;原云桌面&#xff09;是一种快速构建、高效管理桌面办公环境&#xff0c;无影云电脑可用于远程办公、多分支机构、安全OA、短期使用、专业制图等使用场景&#xff0c;阿里云百科分享无影云桌面的详细介绍、租用价格、…

Android Media3 ExoPlayer 开启缓存功能

ExoPlayer 开启播放缓存功能&#xff0c;在下次加载已经播放过的网络资源的时候&#xff0c;可以直接从本地缓存加载&#xff0c;实现为用户节省流量和提升加载效率的作用。 方法一&#xff1a;采用 ExoPlayer 缓存策略 第 1 步&#xff1a;实现 Exoplayer 参考 Exoplayer 官…

Docker 部署 Bitwarden RS 服务

Bitwarden RS 服务是官方 Bitwarden server API 的 Rust 重构版。因为 Bitwarden RS 必须要通过 https 才能访问, 所以在开始下面的步骤之前, 建议先参考 《Ubuntu Nginx 配置 SSL 证书》 配置好域名和 https 访问。 部署 Bitwarden RS 拉取最新版本的 docker.io/vaultwarden…

快递、外卖、网购自动定位及模糊检索收/发件地址功能实现

概述 目前快递、外卖、团购、网购等行业 &#xff1a;为了简化用户在收发件地址填写时的体验感&#xff0c;使用辅助定位及模糊地址检索来丰富用户的体验 本次demo分享给大家&#xff1b;让大家理解辅助定位及模糊地址检索的功能实现过程&#xff0c;以及开发出自己理想的作品…

【Java】应用层协议HTTP和HTTPS

HTTP和HTTPS协议 HTTPHTTP协议的工作过程HTTP协议格式抓包工具抓包结果 HTTP请求(Request)URL方法GET方法POST请求其他方法 报头(header)HostContent-lengthContent-TypeUser-AgentRefererCookie 正文(body) HTTP响应HTTP状态码响应报头(header)响应正文(body) 通过form表单构造…

【RocketMQ】(四)消息的拉取

在上一讲中&#xff0c;介绍了消息的存储&#xff0c;生产者向Broker发送消息之后&#xff0c;数据会写入到CommitLog中&#xff0c;这一讲&#xff0c;就来看一下消费者是如何从Broker拉取消息的。 RocketMQ消息的消费以组为单位&#xff0c;有两种消费模式&#xff1a; 广播…

c++拷贝对象时的优化问题

博主是基于VS2019测试的&#xff0c;不同编译器可能情况不一样。示例分析只有传值传参传值返回一道例题 博主是基于VS2019测试的&#xff0c;不同编译器可能情况不一样。 看下面这一个类A&#xff1a; class A { public:A(int a 0):_a(a){cout << "A(int a 0)&q…

通过stream流实现分页、模糊搜索、按列过滤功能

通过stream实现分页、模糊搜索、按列过滤功能 背景逻辑展示示例代码 背景 在有一些数据通过数据库查询出来后&#xff0c;需要经过一定的逻辑处理才进行前端展示&#xff0c;这时候需要在程序中进行相应的分页、模糊搜索、按列过滤了。这些功能通过普通的逻辑处理可能较为繁琐…

Win7开机进入修复界面处理方法

Win7开机进入修复界面处理方法 2023-09-18 呓语煮酒 大家在使用Windows7的时候是否出现过这样一个问题&#xff0c;就是电脑开机后进入修复界面&#xff0c;界面如下&#xff1a; 一般出现这样的问题基本都是电脑主机非正常关机导致的。一般家用主机都是按照正常关机&#xf…

浅谈C++|STL之deque篇

一.deque基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端插入删除操作 deque与vector区别: vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度回比vector快vector访问元素时的速度会比d…

Linux高性能服务器编程 学习笔记 第四章 TCP/IP通信案例:访问Internet上的Web服务器

Web客户端和服务器之间使用HTTP协议通信。 我们按以下方式来部署通信实例&#xff1a;在Kongming20上运行wget客户端程序&#xff08;一个在命令行下使用的网络下载工具&#xff0c;它支持通过HTTP、HTTPS和FTP协议下载文件&#xff09;&#xff0c;在ernest-laptop上运行squi…

udp的简单整理

最近思考udp处理的一些细节&#xff0c;根据公开课&#xff0c;反复思考&#xff0c;终于有所理解&#xff0c;做整理备用。 0&#xff1a;简单汇总 1&#xff1a;udp是基于报文传输的&#xff0c;接收方收取数据时要一次性读完。 2&#xff1a;借助udp进行发包&#xff0c;…

车载软件架构 —— AUTOSAR Vector SIP包(一)

车载软件架构 —— AUTOSAR Vector SIP包(一) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在…

uniapp项目实践总结(十六)自定义下拉刷新组件

导语&#xff1a;在日常的开发过程中&#xff0c;我们经常遇到下拉刷新的场景&#xff0c;很方便的刷新游览的内容&#xff0c;在此我也实现了一个下拉刷新的自定义组件。 目录 准备工作原理分析组件实现实战演练内置刷新案例展示 准备工作 在components新建一个q-pull文件夹…