Jetson Orin NX 开发指南(6): VINS-Fusion-gpu 的编译和运行

一、前言

由于 Jetson 系列的开发板 CPU 性能不是很好,因此在处理图像数据时往往需要 GPU 加速,而 VINS-Fusion 是针对同步定位与建图(SLAM)问题中十分出色的视觉算法,但是其在图像处理过程中资源消耗较大,仅仅依靠 Jetson 开发板的 CPU 往往很难实现事实效果。

本文在此背景下介绍如何配置带有 GPU 加速的 VINS-Fusion,主要参考以下文献

https://github.com/pjrambo/VINS-Fusion-gpu

Ubuntu 20.04 配置 VINS-Fusion-gpu + OpenCV 4.6.0-CSDN博客

并且需要一些必要的准备工作,如 CUDA 的安装,带有 GPU 加速的 OpenCV 的安装,cv_bridge 功能包的安装,这些工作在上一期内容中已经介绍,详见

Jetson Orin NX 开发指南(5): 安装 OpenCV 4.6.0 并配置 CUDA 以支持 GPU 加速-CSDN博客

接下来我们开始介绍如何在 Jetson Orin NX 开发板上运行 VINS-Fusion-gpu二、编译安装 ceres-solver-1.14.0

首先安装依赖

sudo apt-get install liblapack-dev libsuitesparse-dev libgflags-dev libgoogle-glog-dev libgtest-dev libcxsparse3 -y

然后将安装包下载在 ~/Documents/ 目录下并解压

wget ceres-solver.org/ceres-solver-1.14.0.tar.gz
tar -zxvf ceres-solver-1.14.0.tar.gz

 进入 ceres-solver-1.14.0 文件夹

cd ~/Documents/ceres-solver-1.14.0

创建 build 并编译生成 Makefile 文件

mkdir build & cd build
cmake ..

最终编译并安装 ceres-solver-1.14.0

sudo make install -j8

最终结果如下

至此,ceres-solver-1.14.0 就编译安装完成了!

三、编译 VINS-Fusion-gpu

首先创建 VINS-Fusion-gpu 工作空间,

mkdir -p ~/catkin_ws/src/vinsgpu/src/
cd ~/catkin_ws/src/vinsgpu/src/

然后从 Github 上下载 VINS-Fusion-gpu 源码

git clone https://github.com/pjrambo/VINS-Fusion-gpu.git

下载完成后进入 VINS-Fusion-gpu 文件夹

(1)修改 vins_estimator/CMakeLists.txt 文件

注释一行

#include(/home/dji/opencv/build/OpenCVConfig.cmake)

设置 OpenCV 路径为带有 GPU 加速的 opencv 4.6.0 (安装方式见上一期内容)

set(OpenCV_DIR "~/Documents/opencv-4.6.0/build")

(2)修改 loop_fusion/CMakeLists.txt 文件

注释一行

#include(/home/dji/opencv/build/OpenCVConfig.cmake)

设置 OpenCV 路径为带有 GPU 加速的 opencv 4.6.0 (安装方式见上一期内容)

set(OpenCV_DIR "~/Documents/opencv-4.6.0/build")

保存并退出,最后进入 VINS-Fusion-gpu 文件夹

cd ~/catkin_ws/src/vinsgpu/

接下来开始编译,终端输入

catkin_make

出现报错

错误内容举例:

(1)编译报错 error: ‘CV_FONT_HERSHEY_SIMPLEX’ was not declared in this scope

(2)编译报错 error: ‘CV_LOAD_IMAGE_GRAYSCALE’ was not declared in this scope

(3)编译报错 error: ‘CV_BGR2GRAY’ was not declared in this scope

解决办法:

进入 VINS-Fusion-gpu 文件夹下

cd ~/catkin_ws/src/vinsgpu/src/VINS-Fusion-gpu

然后输入以下内容

sed -i 's/CV_FONT_HERSHEY_SIMPLEX/cv::FONT_HERSHEY_SIMPLEX/g' `grep CV_FONT_HERSHEY_SIMPLEX -rl ./`
sed -i 's/CV_LOAD_IMAGE_GRAYSCALE/cv::IMREAD_GRAYSCALE/g' `grep CV_LOAD_IMAGE_GRAYSCALE -rl ./`
sed -i 's/CV_BGR2GRAY/cv::COLOR_BGR2GRAY/g' `grep CV_BGR2GRAY -rl ./`
sed -i 's/CV_RGB2GRAY/cv::COLOR_RGB2GRAY/g' `grep CV_RGB2GRAY -rl ./`
sed -i 's/CV_GRAY2RGB/cv::COLOR_GRAY2RGB/g' `grep CV_GRAY2RGB -rl ./`
sed -i 's/CV_GRAY2BGR/cv::COLOR_GRAY2BGR/g' `grep CV_GRAY2BGR -rl ./`
sed -i 's/CV_CALIB_CB_ADAPTIVE_THRESH/cv::CALIB_CB_ADAPTIVE_THRESH/g' `grep CV_CALIB_CB_ADAPTIVE_THRESH -rl ./`
sed -i 's/CV_CALIB_CB_NORMALIZE_IMAGE/cv::CALIB_CB_NORMALIZE_IMAGE/g' `grep CV_CALIB_CB_NORMALIZE_IMAGE -rl ./`
sed -i 's/CV_CALIB_CB_FILTER_QUADS/cv::CALIB_CB_FILTER_QUADS/g' `grep CV_CALIB_CB_FILTER_QUADS -rl ./`
sed -i 's/CV_CALIB_CB_FAST_CHECK/cv::CALIB_CB_FAST_CHECK/g' `grep CV_CALIB_CB_FAST_CHECK -rl ./`
sed -i 's/CV_ADAPTIVE_THRESH_MEAN_C/cv::ADAPTIVE_THRESH_MEAN_C/g' `grep CV_ADAPTIVE_THRESH_MEAN_C -rl ./`
sed -i 's/CV_THRESH_BINARY/cv::THRESH_BINARY/g' `grep CV_THRESH_BINARY -rl ./`
sed -i 's/CV_SHAPE_CROSS/cv::MORPH_CROSS/g' `grep CV_SHAPE_CROSS -rl ./`
sed -i 's/CV_SHAPE_RECT/cv::MORPH_RECT/g' `grep CV_SHAPE_RECT -rl ./`
sed -i 's/CV_TERMCRIT_EPS/cv::TermCriteria::EPS/g' `grep CV_TERMCRIT_EPS -rl ./`
sed -i 's/CV_TERMCRIT_ITER/cv::TermCriteria::MAX_ITER/g' `grep CV_TERMCRIT_ITER -rl ./`
sed -i 's/CV_RETR_CCOMP/cv::RETR_CCOMP/g' `grep CV_RETR_CCOMP -rl ./`
sed -i 's/CV_CHAIN_APPROX_SIMPLE/cv::CHAIN_APPROX_SIMPLE/g' `grep CV_CHAIN_APPROX_SIMPLE -rl ./`
sed -i 's/CV_AA/cv::LINE_AA/g' `grep CV_AA -rl ./`
sed -i 's/CV_LOAD_IMAGE_UNCHANGED/cv::IMREAD_UNCHANGED/g' `grep CV_LOAD_IMAGE_UNCHANGED -rl ./`
sed -i 's/CV_MINMAX/cv::NORM_MINMAX/g' `grep CV_MINMAX -rl ./`

具体过程如下

其原理解释详见

Docker 制作各 ROS 版本 VINS-Fusion 镜像_docker ros 镜像_想要个小姑娘的博客-CSDN博客

简要总结:

 VINS-Fusion-gpu 是在 Ubuntu 18.04 环境下写的,其对应的 ROS 版本为 melodic,对应的 OpenCV 是 3.2.0,

而 Jetson Orin NX 对应的是 Ubuntu 20.04,其对应的 ROS 版本为 noetic,对应的 OpenCV 版本为 4.2.0,

报错的关键原因就是 OpenCV 4 系列和 OpenCV 3 系列有一些变量的名称发生了改变,因此我们这里只要将相应的变量名称进行修正,就能顺利通过编译!(OpenCV 4.6.0 和 OpenCV 4.2.0 差别不大)

上面的语句通过 sed 命令和 grep 正则表达式的方式一键修改所有变量名称!

修改完成后进入工作空间,并编译

cd ~/catkin_ws/src/vinsgpu/
catkin_make

最终显示如下结果

这表明 VINS-Fusion-gpu 通过编译!
 

四、运行 VINS-Fusion-gpu

接下来我从测试数据集和使用真实相机数据两个方面来运行VINS-Fusion-gpu

4.1 数据集介绍

测试数据集一般选择 EuRoc 和 KITTI 数据集,其下载地址如下

kmavvisualinertialdatasets – ASL Datasets

The KITTI Vision Benchmark Suite

根据自己需要下载相应数据集

4.2 运行数据集

4.2.1 通过 rosrun 指令运行数据集

这里我们以 euroc 数据集为例,首先创建数据集存储路径,

mkdir -p ~/catkin_ws/datasets/euroc/
cd ~/catkin_ws/datasets/euroc/

这里我下载了 MH_01_easy 数据集,接下来我们运行测试,

首先打开超级终端(因为需要同时启动多个节点),安装方式参考

Jetson Orin NX 开发指南(2): 基本环境配置_想要个小姑娘的博客-CSDN博客

将超级终端分为四栏,然后 ctrl + alt + A 全选所有终端,输入以下指令使 VINS-Fusion-gpu 工作空间对所有终端生效

source ~/catkin_ws/src/vinsgpu/devel/setup.bash

然后通过快捷键 ctrl + alt + O 取消全选,

接下来在第一个终端启动 rviz 可视化界面

roslaunch vins vins_rviz.launch

 ​在第二个终端启动 vins 节点

rosrun vins vins_node ~/catkin_ws/src/vinsgpu/src/VINS-Fusion-gpu/config/euroc/euroc_stereo_imu_config.yaml

在第三个终端启动 loop_fusion 节点,进行回环检测(可选)

rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/vinsgpu/src/VINS-Fusion-gpu/config/euroc/euroc_stereo_imu_config.yaml

在第四个终端运行数据集

rosbag play ~/catkin_ws/datasets/euroc/MH_01_easy.bag

如下所示

逐个运行可以得到如下结果

4.2.2 通过 launch 文件运行数据集

也可以通过配置 launch 文件来运行数据集,接下来我们配置 VINS-Fusion-gpu 的 launch 文件,在 ~/catkin_ws/src/vinsgpu/src/VINS-Fusion-gpu/vins_estimator/launch/ 路径下创建一个 euroc.launch 文件

touch euroc.launch

并输入以下内容

<launch><node name="vins_estimator" pkg="vins" type="vins_node" output="screen" args="$(find vins)/../config/euroc/euroc_stereo_imu_config.yaml" /><node name="loop_fusion" pkg="loop_fusion" type="loop_fusion_node" output="screen" args="$(find vins)/../config/euroc/euroc_stereo_imu_config.yaml" />
</launch>

完成后打开超级终端,创建三个终端,并 source 一下 VINS-Fusion-gpu 工作空间,全选后输入

source ~/catkin_ws/src/vinsgpu/devel/setup.bash

第一个终端输入

roslaunch vins vins_rviz.launch

第二个终端输入

roslaunch vins euroc.launch

第三个终端输入

rosbag play ~/catkin_ws/datasets/euroc/MH_01_easy.bag

如下所示

逐个执行可以得到如下结果

可以达到跟 rosrun 指令一样的效果。

4.3 运行 realsense 真实数据

由于 launch 文件启动的方式比较普遍且便捷,这里主要介绍如何通过 launch 文件读取真实数据(reaalsense d435i)运行 VINS-Fusion-gpu,但是这里需要注意的是 VINS-Fusion-gpu 的 config 文件夹中并没有 realsense 相机(realsense d435i)的配置文件,不过在 VINS-Fusion 源码中的 config 文件夹中有 realsense d435i 相机的配置文件,可以在其基础上修改。

4.3.1 添加 realsense d435i 配置文件

在 VINS-Fusion 的 github 网站上查看对应 realsense d435i 的配置文件,

GitHub - HKUST-Aerial-Robotics/VINS-Fusion: An optimization-based multi-sensor state estimator

在 ~/catkin_ws/src/vinsgpu/src/VINS-Fusion-gpu/config/realsense_d435i/ 路径下创建如下三个文件夹

其中 left.yaml 文件配置如下(相对于 VINS-Fuison 未做修改)

%YAML:1.0
---
model_type: PINHOLE
camera_name: camera
image_width: 640
image_height: 480
distortion_parameters:k1: 0.0k2: 0.0p1: 0.0p2: 0.0
projection_parameters:fx: 385.7544860839844fy: 385.7544860839844cx: 323.1204833984375cy: 236.7432098388672

right.yaml 文件配置如下(相对于 VINS-Fuison 未做修改)

%YAML:1.0
---
model_type: PINHOLE
camera_name: camera
image_width: 640
image_height: 480
distortion_parameters:k1: 0.0k2: 0.0p1: 0.0p2: 0.0
projection_parameters:fx: 385.7544860839844fy: 385.7544860839844cx: 323.1204833984375cy: 236.7432098388672

realsense_stereo_imu_config.yaml 文件配置如下

%YAML:1.0#common parameters
#support: 1 imu 1 cam; 1 imu 2 cam: 2 cam; 
imu: 1         
num_of_cam: 2  imu_topic: "/camera/imu"
image0_topic: "/camera/infra1/image_rect_raw"
image1_topic: "/camera/infra2/image_rect_raw"
output_path: "/home/dji/output/"cam0_calib: "left.yaml"
cam1_calib: "right.yaml"
image_width: 640
image_height: 480# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 1   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.# 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.body_T_cam0: !!opencv-matrixrows: 4cols: 4dt: ddata: [ -5.7586305857286746e-03, -4.0463318787729019e-03,9.9997523237933461e-01, 2.0329267950355900e-02,-9.9998287214160420e-01, -1.0224590553211677e-03,-5.7628118925283633e-03, 7.9325209639615653e-03,1.0457519809151661e-03, -9.9999129084997906e-01,-4.0403746097850135e-03, 2.8559824645148020e-03, 0., 0., 0., 1. ]body_T_cam1: !!opencv-matrixrows: 4cols: 4dt: ddata: [ -1.0021770212322867e-03, 3.6313480322730518e-04,9.9999943188700535e-01, 1.5285779565991807e-02,-9.9999216342926500e-01, -3.8303422615924010e-03,-1.0007788055728661e-03, -5.2435791444330505e-02,3.8299766679101843e-03, -9.9999259827824449e-01,3.6697063849344680e-04, 8.6931302450199057e-03, 0., 0., 0., 1. ]#Multiple thread support
multiple_thread: 1
use_gpu: 1
use_gpu_acc_flow: 1#feature traker paprameters
max_cnt: 150            # max feature number in feature tracking
min_dist: 30            # min distance between two features 
freq: 10                # frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image 
F_threshold: 1.0        # ransac threshold (pixel)
show_track: 0           # publish tracking image as topic
flow_back: 1            # perform forward and backward optical flow to improve feature tracking accuracy#optimization parameters
max_solver_time: 0.04  # max solver itration time (ms), to guarantee real time
max_num_iterations: 8   # max solver itrations, to guarantee real time
keyframe_parallax: 10.0 # keyframe selection threshold (pixel)#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 0.1          # accelerometer measurement noise standard deviation. #0.2   0.04
gyr_n: 0.01         # gyroscope measurement noise standard deviation.     #0.05  0.004
acc_w: 0.001         # accelerometer bias random work noise standard deviation.  #0.002
gyr_w: 0.0001       # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.805         # gravity magnitude#unsynchronization parameters
estimate_td: 1                      # online estimate time offset between camera and imu
td: 0.00                             # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)#loop closure parameters
load_previous_pose_graph: 0        # load and reuse previous pose graph; load from 'pose_graph_save_path'
pose_graph_save_path: "/home/dji/output/pose_graph/" # save and load path
save_image: 0                   # save image in pose graph for visualization prupose; you can close this function by setting 0 

相对于 VINS-Fuison 添加了两行,从而调用 GPU 加速算法运行

当然,其他相机的配置文件设置和上面的内容是一致的,因为这是 VINS-Fuion 源码中需要读取的参数的内容和格式,为了达到更高的精度,往往需要对相机进行标定,标定完成后修改配置文件中的内外参和时延,从而提高估计精度,标定的方法可以参考

d435i 相机和imu标定_d435i imu标定_想要个小姑娘的博客-CSDN博客

当然,在此标定可以在后面熟悉 VINS-Fusion 的使用之后在进行,由于我们这里只是介绍如何使用 VINS-Fusion-gpu 测试真实数据,因此标定可以不进行(也不推荐现在进行,很费时间)

4.3.2 通过 launch 文件运行 realsense 相机

首先必须安装 librealsense 和 realsense-ros,参考以下两片文章(分别针对 Ubuntu 系统和 Jetson 系列的系统)

Ubuntu 20.04 配置 realsense_ubuntu安装realsense2-CSDN博客

Jetson Orin NX 开发指南(4): 安装 CUDA 和 Realsense_想要个小姑娘的博客-CSDN博客

安装完成后确保能够正常使用 ROS 启动 realsense 相机,并能够正确读取到相机数据和 IMU 数据,配置方式同样参考上面两篇文章。

接下来在 ~/catkin_ws/src/vinsgpu/src/VINS-Fusion-gpu/vins_estimator/launch/ 路径下创建一个 launch 文件

cd ~/catkin_ws/src/vinsgpu/src/VINS-Fusion-gpu/vins_estimator/launch/
touch realsense_d435i.launch

在 launch 文件中输入以下内容

<launch><node name="vins_estimator" pkg="vins" type="vins_node" output="screen" args="$(find vins)/../config/realsense_d435i/realsense_stereo_imu_config.yaml" /><node name="loop_fusion" pkg="loop_fusion" type="loop_fusion_node" output="screen" args="$(find vins)/../config/realsense_d435i/realsense_stereo_imu_config.yaml" />
</launch>

这样 launch 文件就配置完成了

接下来打开超级终端,创建四个终端,并 source 一下 VINS-Fusion-gpu 工作空间,全选后输入

source ~/catkin_ws/src/vinsgpu/devel/setup.bash

第一个终端输入

roslaunch vins vins_rviz.launch

第二个终端输入

roslaunch vins realsense_d435i.launch

第三个终端输入

roslaunch realsense2_camera rs_camera.launch

如下所示

依次运行可以得到如下结果(这里暂时不放 rviz 的效果,因为需要标定相机之后才能有好的效果)

因为插入相机后数据量过大,鼠标会卡死不动,这时只需要把相机拔了鼠标就能恢复正常,这时可以在另外一台电脑通过 ssh 指令访问 Jetson Orin NX,终端输入

ssh onx001@172.101.10.106

输入密码后进入 Jetson Orin NX 系统,终端输入

jtop

显示如下内容

可以看到这里 vins_node 正在占用 GPU 资源,也就是说 VINS-Fusion-gpu 成功运行了

其中 Jetson Orin NX 的 ssh 和 jtop 的安装可以参考

Jetson Orin NX 开发指南(2): 基本环境配置_想要个小姑娘的博客-CSDN博客

此外,需要注意 VINS-Fusion-gpu 的特征追踪图片的显示方式与 VINS-Fusion 有所不同,VINS-Fusion-gpu 是将特征追踪图像单独显示出来的,而在 VINS-Fusion 中,特征追踪图像是集成在 rviz 中显示的,如果需要将特征追踪的图像显示在 rviz 中,可以参考下文

Ubuntu 20.04 配置 VINS-Fusion-gpu + OpenCV 4.6.0-CSDN博客

最后附一张 VINS-Fusion-gpu 运行 realsense d435i 相机的 节点图,

至此,VINS-Fusion-gpu 的运行就彻底完成了!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

执行make menuconfig问题的解决

执行make menuconfig 出现问题 在终端输入以下命令执行。 make menuconfig在终端输入上面命令执行时&#xff0c;没有成功运行&#xff0c;出现了如下的问题。 出现这个错误提示意味着在运行 make menuconfig 命令时&#xff0c;系统找不到 ncurses 库。ncurses 是一种文本用…

iPhone手机记笔记工具选择用哪个

iPhone手机大家应该都比较熟悉&#xff0c;其使用性能是比较流畅的&#xff0c;在iPhone手机上记录笔记可以帮助大家快速地进行总结工作、记录工作内容等&#xff0c;在iPhone手机上记笔记工具选择用哪个呢&#xff1f; 可以在iPhone手机上使用的笔记工具是比较多的&#xff0…

Vue3中使用tinymce全功能演示,包括开源功能

效果图&#xff1a; 1、下载插件: npm i tinymce npm i tinymce/tinymce-vue 2、在node_modules文件夹中找到tinymce下的skins复制到项目public文件夹中 &#xff08;可以先创建一个tinymce文件夹&#xff09;&#xff1a; 3、在tinymce官网中下载中文包&#xff0c;并放在刚…

FISCO BCOS | 构建第一个区块链应用程序

本章将介绍基于FISCO BCOS区块链的业务应用场景开发的全流程。介绍包括业务场景分析、合约设计实现、合约编译、区块链开发等。最后&#xff0c;我们介绍一个应用模块实现&#xff0c;即通过我们提供的Java SDK实现对区块链上合约的调用访问。 本教程要求用户熟悉Linux操作环境…

NCV6324CMTAATBG---车规级3MHz 2A 高效同步降压转换器

同步降压转换器&#xff1f; 是一种电源管理电路&#xff0c;它可以将输入电压转换为较低的输出电压。与传统的降压转换器相比&#xff0c;同步降压转换器具有更高的效率和更好的动态响应。 同步降压转换器的工作原理是通过控制开关管的导通和截止来实现电能的转换。在导通状…

Go语言入门心法(一)

一: go语言中变量认知 go语言中变量的定义: &#xff08;要想飞|先会走&#xff09;||&#xff08;翻身仗|抹遗憾 &#xff09;(1)go语言中变量认知升维(2)go语言中变量与强类型语言java类似,变量使用必须先声明后使用(3)go语言中变量标准的声明使用var关键字进行声明: var 变…

微信小程序通过 movable-area 做一个与vuedraggable相似的上下拖动排序控件

因为只是做个小案例 我就直接代码写page页面里了 其实很简单 组件稍微改一下就好了 wxss /* 设置movable-area的宽度 */ .area{width: 100%; }/* a b c 每条元素的样式 */ movable-view {width: 100%;background-color: red;height: 40px;line-height: 40px;color: #FFFFFF;tex…

如何进行pyhon的虚拟环境创建及管理

无论服务器或者本地&#xff0c;创建虚拟环境都是&#xff1a; 【Python】搭建虚拟环境_python创建虚拟环境_今天自洽了吗的博客-CSDN博客 虚拟环境绑定到项目 这个是运行环境&#xff0c;可以切换任意运行环境 如果是服务器上&#xff1a;可以先source xx/bin/active&#xf…

Python皮卡丘

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://want…

canvas基础2 -- 形状

七巧板 七巧板本质上就是 分别由几个直线 拼成一个个图形&#xff0c;再将这些图形结合起来 var tangram [{ p: [{ x: 0, y: 0 }, { x: 800, y: 0 }, { x: 400, y: 400 }], color: "#caff67" },{ p: [{ x: 0, y: 0 }, { x: 400, y: 400 }, { x: 0, y: 800 }], col…

1808_ChibiOS基本的架构介绍

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 简单看了一下ChibiOS的架构介绍&#xff0c;感觉这种OS以及组件非常适合快速构建一个应用。这里做一个简单的资料整理。。 1. 不同于其他的OS&#…

JVM面试题:(三)GC和垃圾回收算法

GC: 垃圾回收算法&#xff1a; GC最基础的算法有三种&#xff1a; 标记 -清除算法、复制算法、标记-压缩算法&#xff0c;我们常用的垃圾回收器一般 都采用分代收集算法。 标记 -清除算法&#xff0c;“标记-清除”&#xff08;Mark-Sweep&#xff09;算法&#xff0c;如它的…

Vuex获取、修改参数值及异步数据处理

一、Vuex简介 1.1 vuex介绍 Vuex是专门为vue应用程序开发的状态管理模式&#xff0c;将组件的共享状态抽取出来&#xff0c;以一个全局单例模式进行管理&#xff0c;组件树构成一个巨大的视图&#xff0c;不管组件在树的何种位置&#xff0c;任何组件都能获取到状态和触发行为…

个股期权、商品期权、股指期权开户攻略(全网最全)

在进行个股期权、商品期权、股指期权交易之前&#xff0c;首先需要选择一个可靠的期权分仓平台。这样才能是想零门槛开通期权账户和交易权限&#xff0c;下文详细为大家科普个股期权、商品期权、股指期权开户攻略&#xff08;全网最全&#xff09; 一、期权分仓平台的选择 目前…

mac 版hadoop3.2.4 解决 Unable to load native-hadoop library 缺失文件

mac 版hadoop3.2.4或其他版本 Unable to load native-hadoop library 缺失文件 Native 包报错缺失&#xff1a; 1. hadoop-3.2.4/lib/native里加*.dylib 2. hadoop-3.2.4/etc/hadoop/hadoop-env.sh 加或修改 export HADOOP_OPTS"-Djava.library.path/Users/lvan/Documen…

Ubuntu下怎么配置vsftpd

2023年10月12日&#xff0c;周四中午 目录 首先要添加一个系统用户然后设置这个系统用户的密码给新创建的系统用户创建主目录启动vsftpd服务查看vsftpd服务的状态打开外界访问vsftpd服务所需的端口获取服务器的IP地址大功告成 首先要添加一个系统用户 useradd 用户名然后设置…

基于内存的分布式NoSQL数据库Redis(一)介绍与安装

文章目录 基于内存的分布式NoSQL数据库Redis知识点01&#xff1a;课程目标知识点02&#xff1a;NoSQL与RDBMS知识点03&#xff1a;Redis的功能与应用场景知识点04&#xff1a;Redis的Linux版单机部署后记 基于内存的分布式NoSQL数据库Redis 知识点01&#xff1a;课程目标 整体…

短视频账号矩阵系统源码saas===独立部署

前言&#xff1a; 短视频账号矩阵是指在不同的短视频平台上&#xff0c;一个个人或企业所拥有的账号数量和分布情况。由于不同的短视频平台受众人群和内容类型等因素不同&#xff0c;因此拥有更多账号可以在更广泛的受众中传播内容&#xff0c;提高曝光度和流量。短视频账号矩阵…

Air001 TIM1高级定时器单脉冲输出模式使用

Air001 TIM1高级定时器单脉冲输出模式使用 ✨本例程基于合宙官方提供的标准库以及Demo工程作为验证参考。&#x1f4cd;官方提供的SDK包资源&#xff1a;https://gitee.com/openLuat/luatos-soc-air001&#x1f33f;想了解STM32高级定时器单脉冲输出模式了解可以参考阅读:https…

多输入多输出 | MATLAB实现CNN-BiLSTM-Attention卷积神经网络-双向长短期记忆网络结合SE注意力机制的多输入多输出预测

MATLAB实现CNN-BiLSTM-Attention卷积神经网络-双向长短期记忆网络结合SE注意力机制的多输入多输出预测 目录 MATLAB实现CNN-BiLSTM-Attention卷积神经网络-双向长短期记忆网络结合SE注意力机制的多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 C…