最新资讯

  • 【SLAM】在 ubuntu 18.04 arm 中以ROS环境编译与运行ORB_SLAM3

【SLAM】在 ubuntu 18.04 arm 中以ROS环境编译与运行ORB_SLAM3

2025-04-30 09:00:24 1 阅读

在ubuntu18.04arm中于ROS环境编译与运行ORB_SLAM3,并以TUM和EuRoC数据集测试了ROS下单目、双目和RGB-D运行。

1. 引言

在之前的博客中,已经介绍了基于虚拟机docker环境以及云端的AutoDL环境运行ORB_SLAM3的步骤。

在实际场景中,SLAM通常是需要在机器人平台上运行的,ROS就是一个比较常见的机器人开发平台,在ROS环境中运行,可以方便我们的SLAM系统与其他机器人功能模块(比如导航和路径规划)进行通信,而且在ros node模式下运行的SLAM更适合多机通讯环境,比如实现多机器人协同建图、机器人和PC交互等等功能。

ORB_SLAM3在本地运行的基础上,提供了在ROS中运行的机制,本文简述了如何在ubuntu 18.04 arm环境中安装ROS环境、编译ORB_SLAM3 ROS版本,以及用现有的数据集模拟摄像头信号输入来使用ORB_SLAM3的全流程。

本文示例环境:ubuntu 22.04 arm虚拟机下启动的ubuntu18.04 docker容器。

2. 安装ROS环境

参考【Linux】在ubuntu18.04arm中安装ROS环境一文进行安装,主要基于ROS官网的教程。

3. 编译ROS环境的ORB_SLAM3

本文撰写时UZ-SLAMLab/ORB_SLAM3的最新提交为2022年2月10日的4452a3c4ab75b1cde34e5505a36ec3f9edcdc4c4,后文的教程基于此提交点。

3.1. 编译命令

3.1.1. 先编译普通版本

本文不赘述安装ORB_SLAM3依赖项的步骤,您可以参考【SLAM】于ubuntu18.04上纯CPU运行GCNv2_SLAM的记录(ARM64/AMD64) | 慕雪的寒舍 一文中的依赖项安装步骤。参考博客里面的步骤安装opencv、eigen3、Pangolin6.0就可以了,不需要安装libtorch。

其中需要注意的是,如果你需要编译ROS的ORB_SLAM3,opencv不能安装3.4.5版本,必须安装3.2.0版本!好消息是,如果你是跟随者本站或者ROS官网的教程安装的ROS,那么opencv 3.2.0版本已经和ROS一起安装在你的系统里面了。

安装完毕依赖后,先以普通模式编译ORB_SLAM3,因为ROS版本依赖于普通版本才能进行编译,这一点必须要注意。

git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3

cd ORB_SLAM3
chmod +x build.sh
./build.sh
3.1.2. 修改build_ros.sh脚本

编译完毕普通版本后,才可以执行build_ros.sh脚本。但是先别急,cat这个脚本,看看里面写了啥

root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3# cat build_ros.sh 
echo "Building ROS nodes"

cd Examples/ROS/ORB_SLAM3
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make -j

其中第一个命令就有问题了,最新版本的ORB_SLAM3源码里面,Examples路径下已经没有ROS目录了,这个目录现在是Examples_old/ROS/ORB_SLAM3

如果你没有注意这个问题就开始执行build_ros.sh脚本,问题就会出现,因为Examples/ROS/ORB_SLAM3目录当前不存在,该脚本实际上是直接在项目根目录下创建了build目录然后cmake开始编译的,编译的完全不是ROS版本。

这个脚本里面还有另外一个坑,那就是make -j后面没有写任何数字。这会导致make无休止地使用系统资源,直到把你的整个系统内存和swap都吃光光。根据我找到的博客,ORB_SLAM3的编译最多能吃掉16GB内存,完全是个洪水猛兽。

最开始我没有注意这个脚本,以为它没有任何问题,就直接执行了,最终在编译时遇到了如下错误。

c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See  for instructions.

这个错误就是因为系统没有资源了。开另外一个终端,再启动编译,你可以轻易地观察到编译是怎么把整个系统内存给吃光光的,最终物理内存和swap都没了,操作系统自然会kill掉编译进程,从而导致了上述报错。

如果你直接搜索“ORB_SLAM3编译失败”等字样,可能会搜到相关教程让你加大swap文件,这是一个可选项,但还不够可选,因为在我的测试中,即便再给出2GB的swap文件,编译依旧会因为内存不足而失败。下面给出新增swap文件的命令。

# 安装
apt install util-linux
# 分配2G
sudo fallocate -l 2G /swapfile
# 给予权限
sudo chmod 600 /swapfile
# 激活权限(执行了之后swap就生效了)
sudo mkswap /swapfile
sudo swapon /swapfile
# 不需要的时候,使用如下命令删除swap文件
swapoff -v /swapfile
rm /swapfile

实际上,在物理内存大于8GB的环境中不需要这么麻烦,前文提到了脚本里面make没有写线程数,解决办法就是修正这个脚本,首先是修正目录,其次是将make后面加上-j4来限制make使用的资源,这样就能绕过内存不足导致的编译错误了。修改后的脚本如下:

echo "Building ROS nodes"

cd Examples_old/ROS/ORB_SLAM3
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make -j4

如果你的环境物理内存低于8GB,可以考虑在加大swap文件的同时进一步减少make使用的线程数,比如make -j2

3.1.3. 编译ROS版本

修正了build_ros.sh脚本之后,就可以开始编译ROS版本了。

chmod +x build_ros.sh
./build_ros.sh

再次提醒,ROS版本的编译依赖于普通版本,需要先编译普通版本!

3.2. 编译期间遇到的各种问题

部分问题参考:记录配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的问题

3.2.1. cmake错误ROS_PACKAGE_PATH

遇到的第一个错误应该是环境变量有关,编译ros版本的时候,需要将源码路径加入到环境变量中,才可以正常编译。

CMake Error at /opt/ros/melodic/share/ros/core/rosbuild/private.cmake:99 (message):
  [rosbuild] rospack found package "ORB_SLAM3" at "", but the current
  directory is "/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3".  You should
  double-check your ROS_PACKAGE_PATH to ensure that packages are found in the
  correct precedence order.
Call Stack (most recent call first):
  /opt/ros/melodic/share/ros/core/rosbuild/public.cmake:177 (_rosbuild_check_package_location)
  CMakeLists.txt:4 (rosbuild_init)

在ORB_SLAM3项目根目录下执行如下命令即可

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$PWD/Examples_old/ROS/ORB_SLAM3

修正之后即可正常开始编译

3.2.2. 头文件se3.hpp找不到

编译到30%的时候,会提示头文件找不到

[ 30%] Building CXX object CMakeFiles/Mono_Inertial.dir/src/ros_mono_inertial.cc.o
In file included from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/Frame.h:30:0,
                 from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/KeyFrame.h:28,
                 from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/MapPoint.h:23,
                 from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/FrameDrawer.h:24,
                 from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/Viewer.h:23,
                 from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/Tracking.h:26,
                 from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/System.h:31,
                 from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/ros_mono_inertial.cc:34:
/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/ImuTypes.h:29:10: fatal error: sophus/se3.hpp: No such file or directory
 #include 
          ^~~~~~~~~~~~~~~~****

这个第三方库sophus已经在Thirdparty文件夹里面自带了,刚刚我们编译普通版本的时候,其实也已经编译好了这个第三方库了。要做的就是进它的目录make install安装一下。

cd Thirdparty/Sophus/build/
make install

安装以后就解决这个问题了。

root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3# cd Thirdparty/Sophus/build/
root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/Thirdparty/Sophus/build# make install
[  8%] Built target test_sim2
[ 16%] Built target test_se2
[ 25%] Built target test_so3
[ 33%] Built target test_rxso2
[ 41%] Built target test_so2
[ 50%] Built target test_se3
[ 58%] Built target test_geometry
[ 66%] Built target test_rxso3
[ 75%] Built target test_sim3
[ 83%] Built target test_velocities
[ 91%] Built target test_common
[100%] Built target HelloSO3
Install the project...
-- Install configuration: "Release"
-- Installing: /usr/local/share/sophus/cmake/SophusTargets.cmake
-- Installing: /usr/local/share/sophus/cmake/SophusConfig.cmake
-- Installing: /usr/local/share/sophus/cmake/SophusConfigVersion.cmake
-- Installing: /usr/local/include/sophus/average.hpp
-- Installing: /usr/local/include/sophus/common.hpp
-- Installing: /usr/local/include/sophus/geometry.hpp
-- Installing: /usr/local/include/sophus/interpolate.hpp
-- Installing: /usr/local/include/sophus/interpolate_details.hpp
-- Installing: /usr/local/include/sophus/num_diff.hpp
-- Installing: /usr/local/include/sophus/rotation_matrix.hpp
-- Installing: /usr/local/include/sophus/rxso2.hpp
-- Installing: /usr/local/include/sophus/rxso3.hpp
-- Installing: /usr/local/include/sophus/se2.hpp
-- Installing: /usr/local/include/sophus/se3.hpp
-- Installing: /usr/local/include/sophus/sim2.hpp
-- Installing: /usr/local/include/sophus/sim3.hpp
-- Installing: /usr/local/include/sophus/sim_details.hpp
-- Installing: /usr/local/include/sophus/so2.hpp
-- Installing: /usr/local/include/sophus/so3.hpp
-- Installing: /usr/local/include/sophus/types.hpp
-- Installing: /usr/local/include/sophus/velocities.hpp
-- Installing: /usr/local/include/sophus/formatstring.hpp
3.2.3. OpenCV 版本不匹配

前文提到过,OpenCV必须安装 3.2.0 版本,是因为cv_bridge默认会指向ROS自带的3.2.0版本,而不是我们自己安装的其他版本,最终编译或者运行的时候就会导致链接错误或者coredump错误。

/usr/bin/ld: warning: libopencv_core.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so, may conflict with libopencv_core.so.3.4

如果你已经安装了其他版本的opencv,需要删掉它们。从源码安装的话,直接进入opencv源码的build目录执行make uninstall就可以卸载掉自己安装的opencv。

删掉了之后就会发现系统里面只剩下和ros一起安装的3.2.0版本opencv了,应该是下载ros环境的时候自动安装的。

root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3# pkg-config --modversion opencv
3.2.0

随后我们需要修改CMakeLists文件,让编译的时候使用opencv 3.2.0版本。首先是根目录下的CMakeLists,修改如下部分的版本号为3.2即可

# ORB_SLAM3/CMakeLists.txt
find_package(OpenCV 3.2)
   if(NOT OpenCV_FOUND)
      message(FATAL_ERROR "OpenCV > 3.2 not found.")
   endif()

然后是Examples_old/ROS/ORB_SLAM3里面的CMakeLists文件,修改如下部分为3.2.0版本

# ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
find_package(OpenCV 3.2.0 QUIET) # 修改为3.2.0
if(NOT OpenCV_FOUND)
   find_package(OpenCV 2.4.3 QUIET)
   if(NOT OpenCV_FOUND)
      message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
   endif()
endif()

接下来就要删除所有编译缓存,重新编译一遍。

rm -rf Thirdparty/g2o/build/
rm -rf Thirdparty/DBoW2/build/
rm -rf Thirdparty/Sophus/build/
rm -rf Vocabulary/*.bin
rm -rf ./build
rm -rf Examples_old/ROS/ORB_SLAM3/build

注意普通版本也需要重新编译!因为最开始编译的时候我的普通版本是基于opecv 3.4.5编译的,如果不重新基于opencv 3.2.0编译普通版本,编译ROS的时候就会提示libORB_SLAM3.so需要3.4.5版本的opencv才能正常链接,终究还是版本对不上。

3.2.4. AR代码错误(四处)

修复了opencv版本问题后,接下来就会遇到一堆由于Examples_old/ROS/ORB_SLAM3/src/AR路径下的代码问题导致的错误。如果你不需要使用MonoAR也就是单目AR功能,可以直接注释掉CMakeLists文件里面71行的如下部分,跳过AR代码的编译。

# ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
# Node for monocular camera (Augmented Reality Demo)
rosbuild_add_executable(MonoAR
 src/AR/ros_mono_ar.cc
 src/AR/ViewerAR.h
 src/AR/ViewerAR.cc
)

target_link_libraries(MonoAR
 ${LIBS}
)

注释掉之后,应该就可以成功编译其他部分了

[rosbuild] Including /opt/ros/melodic/share/roslisp/rosbuild/roslisp.cmake
[rosbuild] Including /opt/ros/melodic/share/roscpp/rosbuild/roscpp.cmake
[rosbuild] Including /opt/ros/melodic/share/rospy/rosbuild/rospy.cmake
Build type: Release
-- Using flag -std=c++11.
-- Configuring done
-- Generating done
-- Build files have been written to: /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/build
[  0%] Built target rospack_genmsg_libexe
[  0%] Built target rosbuild_precompile
[ 40%] Built target RGBD
[ 40%] Built target Stereo
[ 80%] Built target Mono_Inertial
[ 80%] Built target Stereo_Inertial
[100%] Built target Mono

如果你需要MonoAR,就需要上手改代码了。参考github.com/UZ-SLAMLab/ORB_SLAM3/issues/442,依次修复问题。

这部分修改很杂,你可以直接根据我的提交记录来修改:Fix compile error of ROS AR, used opencv 3.2.0 for ROS compile. · musnows/ORB_SLAM3@4e1cbdb · GitHub


1)类型Sophus::SE3cv::Mat不匹配

/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc: In member function 'void ImageGrabber::GrabImage(const ImageConstPtr&)':
/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc:151:41: error: conversion from 'Sophus::SE3f {aka Sophus::SE3}' to non-scalar type 'cv::Mat' requested
     cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
                   ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CMakeFiles/MonoAR.dir/build.make:198: recipe for target 'CMakeFiles/MonoAR.dir/src/AR/ViewerAR.cc.o' failed

修改ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc的151行,被注释掉的是源代码

    // cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
    cv::Mat Tcw;
    Sophus::SE3f Tcw_SE3f = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
    Eigen::Matrix4f Tcw_Matrix = Tcw_SE3f.matrix();
    cv::eigen2cv(Tcw_Matrix, Tcw);

2)'eigen2cv' is not a member of 'cv' 错误

/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc:155:9: error: 'eigen2cv' is not a member of 'cv'
     cv::eigen2cv(Tcw_Matrix, Tcw);
         ^~~~~~~~
/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc:155:9: note: suggested alternative: 'eigen'
     cv::eigen2cv(Tcw_Matrix, Tcw);
         ^~~~~~~~
         eigen

ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.ccORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.h顶部添加三个头文件

#include 
#include 
#include 

3)类型Eigen::Matrixcv::Mat不匹配

/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc: In member function 'void ORB_SLAM3::Plane::Recompute()':
/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:530:42: error: conversion from 'Eigen::Vector3f {aka Eigen::Matrix}' to non-scalar type 'cv::Mat' requested
             cv::Mat Xw = pMP->GetWorldPos();
                          ~~~~~~~~~~~~~~~~^~

修改ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:530处代码

// cv::Mat Xw = pMP->GetWorldPos();
cv::Mat Xw;
cv::eigen2cv(pMP->GetWorldPos(), Xw);

4)尾插错误 no matching function for call to 'std::vector::push_back(Eigen::Vector3f)'

这个问题也是类型不匹配

/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc: In member function 'ORB_SLAM3::Plane* ORB_SLAM3::ViewerAR::DetectPlane(cv::Mat, const std::vector&, int)':
/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:405:53: error: no matching function for call to 'std::vector::push_back(Eigen::Vector3f)'
                 vPoints.push_back(pMP->GetWorldPos());
                                                     ^

修改ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:405的代码

// vPoints.push_back(pMP->GetWorldPos());
cv::Mat WorldPos;
cv::eigen2cv(pMP->GetWorldPos(), WorldPos);
vPoints.push_back(WorldPos);

3.3. 成功编译

修改完毕上述四个问题后,就应该可以编译成功了。

编译完成后会多出很多可执行文件。

root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3# ls
Asus.yaml  CMakeLists.txt  Mono  MonoAR  Mono_Inertial  RGBD  Stereo  Stereo_Inertial  build  lib  manifest.xml  src

注意这些可执行文件是不能直接运行的,因为它们是针对ROS设计的文件。

root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3# ./Mono
[ERROR] [1739083807.698375008]: [registerPublisher] Failed to contact master at [localhost:11311].  Retrying...
^C
Usage: rosrun ORB_SLAM3 Mono path_to_vocabulary path_to_settings

4. 在ROS下运行项目

参考博客:ORB-SLAM3的CMake与ROS编译以及测试;ORB SLAM 2 demo 复现(普通模式 + ROS 模式) - 简书;

4.1. 下载TUM和EuRoC数据集

因为是在ROS环境下运行,所以数据集不能用之前下载的tgz格式的了,必须使用ROS专门的bag格式的数据集。

  • TUM RGB-D数据集:cvg.cit.tum.de/data/datasets/rgbd-dataset/download;
  • EuRoC双目数据集:robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_ha…

在TUM数据集的下载页面中,往下滑可以看到每个数据集的简单介绍,这里就能下载到bag格式的数据集。

下载完毕后,可以使用rosbag info命令查看数据集中有的topic信息:

  • Topic是一个命名的通信管道,用于在不同的ROS节点之间传递信息;
  • 每个Topic都有一个唯一的名称,节点可以通过这个名称来订阅这个topic的信息;
  • Topic中的数据以message的格式传输,message是ROS中定义好的数据结构,如 sensor_msgs/Imagegeometry_msgs/Pose 等;

举个例子,fr1/desk数据集的Topic信息如下,其中depth就是深度数据,rgb就是普通的彩色录像数据。

root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3# rosbag info datasets/TUM/rgbd_dataset_freiburg1_desk.bag
path:         datasets/TUM/rgbd_dataset_freiburg1_desk.bag
version:      2.0
duration:     23.8s
start:        May 10 2011 20:44:09.56 (1305031449.56)
end:          May 10 2011 20:44:33.32 (1305031473.32)
size:         371.7 MB
messages:     19893
compression:  bz2 [1210/1210 chunks; 29.85%]
uncompressed:   1.2 GB @ 52.3 MB/s
compressed:   370.9 MB @ 15.6 MB/s (29.85%)
types:        sensor_msgs/CameraInfo         [c9a58c1b0b154e0e6da7578cb991d214]
              sensor_msgs/Image              [060021388200f6f0f447d0fcd9c64743]
              sensor_msgs/Imu                [6a62c6daae103f4ff57a132d6f95cec2]
              tf/tfMessage                   [94810edda583a504dfda3829e70d7eec]
              visualization_msgs/MarkerArray [f10fe193d6fac1bf68fad5d31da421a7]
topics:       /camera/depth/camera_info     595 msgs    : sensor_msgs/CameraInfo        
              /camera/depth/image           595 msgs    : sensor_msgs/Image             
              /camera/rgb/camera_info       613 msgs    : sensor_msgs/CameraInfo        
              /camera/rgb/image_color       613 msgs    : sensor_msgs/Image             
              /cortex_marker_array         2360 msgs    : visualization_msgs/MarkerArray
              /imu                        11815 msgs    : sensor_msgs/Imu               
              /tf                          3302 msgs    : tf/tfMessage

而给出的EuRoC双目数据集的Topic如下,有两个cam就对应了左侧和右侧的两个相机。

root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/datasets# rosbag info MH_01_easy.bag 
path:        MH_01_easy.bag
version:     2.0
duration:    3:06s (186s)
start:       Jun 25 2014 03:02:59.81 (1403636579.81)
end:         Jun 25 2014 03:06:06.70 (1403636766.70)
size:        2.5 GB
messages:    47283
compression: none [2456/2456 chunks]
types:       geometry_msgs/PointStamped [c63aecb41bfdfd6b7e1fac37c7cbe7bf]
             sensor_msgs/Image          [060021388200f6f0f447d0fcd9c64743]
             sensor_msgs/Imu            [6a62c6daae103f4ff57a132d6f95cec2]
topics:      /cam0/image_raw    3682 msgs    : sensor_msgs/Image         
             /cam1/image_raw    3682 msgs    : sensor_msgs/Image         
             /imu0             36820 msgs    : sensor_msgs/Imu           
             /leica/position    3099 msgs    : geometry_msgs/PointStamped

假设我们使用自己的摄像头的话,也是利用ROS的工具将我们摄像头的数据输入到一个Topic中,这样就可以供系统的其他组件,比如SLAM系统来读取,以此实现在ROS系统上硬件输入和软件的读取。这便是使用ROS模式和普通模式的最大区别,普通模式下我们必须要直接提供程序的数据输入源,才能让程序运行起来;而ROS模式下我们可以先把整个SLAM系统启动起来,再通过我们想要的方式往SLAM系统订阅的Topic里面喂数据即可。

4.2. 单目运行

刚刚我们下载的TUM fr1/desk的数据集,即可以用作RGB-D模式的输入,又可以做单目摄像头的输入,因为深度数据是独立于RGB单目数据的。

刚刚我们直接运行Mono的时候,就打印出了一个Usage

root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3# ./Mono
[ERROR] [1739083807.698375008]: [registerPublisher] Failed to contact master at [localhost:11311].  Retrying...
^C
Usage: rosrun ORB_SLAM3 Mono path_to_vocabulary path_to_settings

我们要使用的就是这个命令,rosrun代表启动一个节点,ORB_SLAM3是我们当前使用的包名称,也就是CMakeLists里面注册的项目名称,Mono是我们要执行的可执行文件名称。后面的两个参数分别是词袋文件和相机的配置文件。

最终执行的命令如下,需要在两个终端中执行(在项目根目录执行)

# 打开终端A
roscore
# 打开终端B
rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples_old/Monocular/TUM1.yaml

执行了之后,就会启动ORB_SLAM3的Map Viewer,此时是黑屏的,因为么有任何数据被送到ORB_SLAM3订阅的Topic中。

再新建一个终端,执行如下命令,将TUM数据集bag文件里面的Topic绑定到ORB_SLAM3订阅的Topic上,这样就能获取到数据了。

rosbag play 
	datasets/TUM/rgbd_dataset_freiburg1_desk.bag 
	/camera/rgb/image_color:=/camera/image_raw

其中,最后一个参数/camera/rgb/image_color:=/camera/image_raw指代将bag文件中的/camera/rgb/image_color绑定到/camera/image_raw上,后者就是ORB_SLAM3订阅的相机原始数据的Topic,相当于将bag中已有的图像数据重新喂给了我们的SLAM系统。

因为ROS的Topic机制,这种喂进去的数据集和接一个摄像头得到的实时数据,对于订阅这个Topic的SLAM系统而言是完全一样的!

执行这个命令后,就能在GUI里面看到相机的数据流和SLAM的建图了

4.3. RGB-D运行

RGB-D相机也是使用相同的命令来执行,先在另外一个终端执行roscore,然后执行如下命令

rosrun ORB_SLAM3 RGBD Vocabulary/ORBvoc.txt Examples_old/RGB-D/TUM1.yaml

刚启动的时候也是黑屏

再开另外一个终端,开始喂我们的数据集,这里用了两个:=号,分别绑定了原始的RGB相机数据到/camera/rgb/image_raw ,绑定了深度数据到/camera/depth_registered/image_raw

rosbag play 
	datasets/TUM/rgbd_dataset_freiburg1_desk.bag 
	/camera/rgb/image_color:=/camera/rgb/image_raw 
	/camera/depth/image:=/camera/depth_registered/image_raw

随后GUI里面也开始显示图像了

等运行结束后,会发现此时SLAM的建图结果是不对的,所有的点都在很小的一块区域中

作为对比,下图为本地虚拟机在普通模式下运行时的RGB-D建图结果,很明显和上图完全不一样。

这是因为Examples_old/RGB-D/TUM1.yaml数据配置有问题。在TUM官网上提到了这两个数据集在ROS和非ROS中是不一样的,实际上这个文件里面也有注释

# Deptmap values factor 
DepthMapFactor: 5000 # 1.0 for ROS_bag

官网说明:cvg.cit.tum.de/data/datasets/rgbd-dataset/file_formats#intrinsic…

Color images and depth maps

We provide the time-stamped color and depth images as a gzipped tar file (TGZ).

  • The color images are stored as 640x480 8-bit RGB images in PNG format.
  • The depth maps are stored as 640x480 16-bit monochrome images in PNG format.
  • The color and depth images are already pre-registered using the OpenNI driver from PrimeSense, i.e., the pixels in the color and depth images correspond already 1:1.
  • The depth images are scaled by a factor of 5000, i.e., a pixel value of 5000 in the depth image corresponds to a distance of 1 meter from the camera, 10000 to 2 meter distance, etc. A pixel value of 0 means missing value/no data.

这里是深度值的校正系数(factor),使用时的计算公式为Z = depth_image[v,u] / factor,在ROS中要把它改成1才可以。

factor = 5000 # for the 16-bit PNG files
factor = 1    # for the 32-bit float images in the ROS bag files

将DepthMapFactor修改为1.0之后的建图就正常一些了

4.4. 双目运行

下载EuRoC对应的rosbag:MH_01_easy.bag,上文已经给出过该数据集对应的Topic了,其中要用到的 Topic 是左右两个摄像头的数据 /cam0/image_raw/cam1/image_raw。ORB_SLAM3 中双目 Stereo 接收的 Topic 分别为 /camera/left/image_raw/camera/right/image_raw,因此在运行时也需要绑定一下 Topic。

topics:      /cam0/image_raw    3682 msgs    : sensor_msgs/Image         
             /cam1/image_raw    3682 msgs    : sensor_msgs/Image         
             /imu0             36820 msgs    : sensor_msgs/Imu           
             /leica/position    3099 msgs    : geometry_msgs/PointStamped

双目的rosrun命令最后多了一个bool类型参数do_rectify,含义为是否进行矫正,根据需要选择true或false。

Usage: rosrun ORB_SLAM3 Stereo path_to_vocabulary path_to_settings do_rectify

执行如下命令,先启动Stereo双目模式下的SLAM,然后开始播放数据集,同样是使用:=分别绑定左侧和右侧两个摄像头的数据。

# 终端a
roscore
# 终端b
rosrun ORB_SLAM3 Stereo Vocabulary/ORBvoc.txt Examples_old/Stereo/EuRoC.yaml true
# 终端c
rosbag play MH_01_easy.bag /cam0/image_raw:=/camera/left/image_raw /cam1/image_raw:=/camera/right/image_raw

也是成功运行起来了

5. The end

本文介绍了如何在ROS环境下编译ORB_SLAM3,并使用TUM和EuRoC数据集测试单目、双目、RGB-D三种模式在ROS下运行的效果。希望对你有帮助!

更新:ORB_SLAM2的ROS运行命令和本文记录的完全一致,只需要把rosrun里面的包名改成ORB_SLAM2就可以了。下图是在ROS模式下运行ORB_SLAM2的RGB-D的截图。

本文地址:https://www.vps345.com/6135.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge 进程 操作系统 进程控制 Ubuntu python MCP 阿里云 网络 网络安全 网络协议 llama 算法 opencv 自然语言处理 神经网络 语言模型 ssh ubuntu deepseek Ollama 模型联网 API CherryStudio 科技 ai java 人工智能 个人开发 harmonyos 华为 开发语言 typescript 计算机网络 数据库 centos oracle 关系型 安全 分布式 Flask FastAPI Waitress Gunicorn uWSGI Uvicorn RTSP xop RTP RTSPServer 推流 视频 php android 面试 性能优化 jdk intellij-idea 架构 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 Dell R750XS 嵌入式硬件 单片机 c++ 温湿度数据上传到服务器 Arduino HTTP udp unity vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 华为云 物联网 rust http 学习 uni-app fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse 深度学习 YOLO 目标检测 计算机视觉 pycharm ide pytorch filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 ssl 前端框架 golang 后端 HCIE 数通 numpy tcp/ip macos adb vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 asm c# efficientVIT YOLOv8替换主干网络 TOLOv8 flutter Hyper-V WinRM TrustedHosts flask spring boot AI编程 AIGC 鸿蒙 websocket windows react.js 前端面试题 node.js 持续部署 oceanbase rc.local 开机自启 systemd 麒麟 redis mybatis Qwen2.5-coder 离线部署 ollama 大模型 mac github 编辑器 transformer ping++ 运维开发 Dify conda 机器学习 深度优先 图论 并集查找 换根法 树上倍增 ddos llm gpu算力 chatgpt llama3 Chatglm 开源大模型 pip 学习方法 zotero WebDAV 同步失败 代理模式 ffmpeg 音视频 docker 容器 list 数据结构 大数据 爬虫 数据挖掘 网络用户购物行为分析可视化平台 大数据毕业设计 1024程序员节 测试工具 web安全 笔记 银河麒麟服务器操作系统 系统激活 博客 windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 sql KingBase YOLOv12 漏洞 负载均衡 fpga开发 ESP32 鸿蒙系统 智能手机 NAS Termux Samba Linux LDAP aws googlecloud kubernetes k8s ecmascript KVM tomcat postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 计算机外设 电脑 软件需求 自动化 maven intellij idea Windsurf Cookie 实时音视频 AI Agent vscode 腾讯云 r语言 数据可视化 数据分析 .netcore word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 mongodb git ansible jenkins gitee nginx dubbo mysql 微服务 springcloud kamailio sip VoIP 大数据平台 微信 微信分享 Image wxopensdk cuda cudnn anaconda vim sqlserver rust腐蚀 嵌入式 linux驱动开发 arm开发 框架搭建 .net 豆瓣 追剧助手 迅雷 nas 进程信号 经验分享 firewalld 低代码 c语言 ollama下载加速 mcu iot 信息与通信 gitlab kafka HarmonyOS Next jmeter 软件测试 监控 自动化运维 gateway Clion Nova ResharperC++引擎 Centos7 远程开发 智能路由器 外网访问 内网穿透 端口映射 命名管道 客户端与服务端通信 多线程服务器 Linux网络编程 live555 rtsp rtp json html5 firefox 蓝耘科技 元生代平台工作流 ComfyUI pillow https WSL win11 无法解析服务器的名称或地址 小程序 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 Kali Linux 黑客 渗透测试 信息收集 产品经理 agi microsoft django web3.py 程序人生 C 环境变量 进程地址空间 代码调试 ipdb springsecurity6 oauth2 授权服务器 token sas 创意 社区 DeepSeek-R1 API接口 源码剖析 rtsp实现步骤 流媒体开发 远程控制 远程看看 远程协助 僵尸进程 rsyslog cpu 内存 实时 使用 VMware安装Ubuntu Ubuntu安装k8s C语言 系统架构 DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 apache YOLOv8 NPU Atlas800 A300I pro asi_bench WSL2 mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 camera Arduino 电子信息 开源 统信UOS bonding 链路聚合 飞牛NAS 飞牛OS MacBook Pro qt stm32项目 stm32 Ubuntu Server Ubuntu 22.04.5 debian PVE prometheus rabbitmq 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 集成学习 集成测试 状态管理的 UDP 服务器 Arduino RTOS spring cloud yum 服务器配置 生物信息学 openEuler make命令 makefile文件 bash 驱动开发 gitea Docker Compose docker compose docker-compose ESXi html ip命令 新增网卡 新增IP 启动网卡 go file server http server web server AI大模型 LLM iftop 网络流量监控 visual studio code 监控k8s集群 集群内prometheus TRAE 安卓 svn Invalid Host allowedHosts vue 程序员 远程连接 rdp 实验 王者荣耀 远程工作 DNS DevEco Studio minio 计算机 UOS 统信操作系统 SysBench 基准测试 ecm bpm spring 云电竞 云电脑 todesk 文件系统 路径解析 职场和发展 threejs 3D 交换机 硬件 设备 GPU PCI-Express java-ee kylin dify express 技能大赛 音乐服务器 Navidrome 音流 云原生 ci/cd 政务 分布式系统 监控运维 Prometheus Grafana 游戏服务器 Minecraft Erlang OTP gen_server 热代码交换 事务语义 实时互动 ceph MNN DeepSeek Qwen MacOS录屏软件 ip ui selete 高级IO mamba Vmamba postgresql freebsd eureka rocketmq 其他 中间件 可信计算技术 安全架构 网络攻击模型 系统安全 媒体 显卡驱动 部署 远程桌面 机器人 matlab MQTT协议 消息服务器 代码 DeepSeek行业应用 Heroku 网站部署 深度求索 私域 知识库 excel 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 dba tcpdump jupyter Dell HPE 联想 浪潮 gpt-3 文心一言 设计模式 软件工程 RAGFLOW RAG 检索增强生成 文档解析 大模型垂直应用 企业微信 Linux24.04 deepin ocr 命令 金融 硬件架构 医疗APP开发 app开发 思科模拟器 思科 Cisco 腾讯云大模型知识引擎 Deepseek 压力测试 测试用例 功能测试 ruoyi asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 kind AI写作 AI作画 react next.js 部署next.js QQ 聊天室 etcd 数据安全 RBAC 报错 playbook 剧本 Java muduo X11 Xming docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos 弹性计算 虚拟化 计算虚拟化 弹性裸金属 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 kali 共享文件夹 虚拟机 游戏程序 JAVA 鲲鹏 昇腾 npu 工业4.0 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 开发环境 EMUI 回退 降级 升级 线程 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 grafana 直流充电桩 充电桩 微信开放平台 微信公众平台 微信公众号配置 IPMI 远程登录 telnet unix RAID RAID技术 磁盘 存储 zabbix 安全威胁分析 微信小程序 vscode 1.86 网站搭建 serv00 jetty undertow Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 SSH Xterminal 缓存 灵办AI kvm 云服务器 裸金属服务器 弹性裸金属服务器 p2p 多进程 远程 执行 sshpass 操作 银河麒麟 kylin v10 麒麟 v10 单元测试 selenium 游戏机 virtualenv hugo Netty 即时通信 NIO SWAT 配置文件 服务管理 网络共享 华为od 图形化界面 n8n 工作流 workflow trae wireshark 能力提升 面试宝典 技术 IT信息化 GCC crosstool-ng micropython esp32 mqtt rpc nuxt3 边缘计算 智能硬件 wsl2 wsl IIS服务器 IIS性能 日志监控 tensorflow 半虚拟化 硬件虚拟化 Hypervisor Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 业界资讯 模拟退火算法 田俊楠 code-server MQTT mosquitto 消息队列 Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer 多层架构 解耦 ue4 着色器 ue5 虚幻 pyautogui 目标跟踪 OpenVINO 推理应用 sqlite pgpool 开机自启动 openssl 密码学 hibernate 课程设计 bot Docker 分析解读 Reactor C++ echarts 信息可视化 网页设计 jar gradle outlook 数据库系统 C# MQTTS 双向认证 emqx 大模型入门 大模型教程 webrtc remote-ssh 国产操作系统 ukui 麒麟kylinos openeuler W5500 OLED u8g2 TCP服务器 chfs ubuntu 16.04 统信 虚拟机安装 elasticsearch 宝塔面板 同步 备份 建站 网络穿透 火绒安全 VPS Nuxt.js 小艺 Pura X 图像处理 并查集 leetcode bug iBMC UltraISO protobuf 序列化和反序列化 安装 unity3d CLion IDE MacMini Mac 迷你主机 mini Apple webstorm 宠物 毕业设计 免费学习 宠物领养 宠物平台 跨域 okhttp CORS 雨云 NPS 强制清理 强制删除 mac废纸篓 孤岛惊魂4 uniapp 恒源云 curl wget vSphere vCenter 软件定义数据中心 sddc ios RTMP 应用层 致远OA OA服务器 服务器磁盘扩容 OD机试真题 华为OD机试真题 服务器能耗统计 xml arm 设置代理 实用教程 opcua opcda KEPServer安装 oneapi 大模型微调 open webui VR手套 数据手套 动捕手套 动捕数据手套 Ark-TS语言 linux 命令 sed 命令 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 具身智能 传统数据库升级 银行 大语言模型 LLMs devops springboot 服务器数据恢复 数据恢复 存储数据恢复 北亚数据恢复 oracle数据恢复 IPMITOOL BMC 硬件管理 FTP 服务器 3d 数学建模 SSH 服务 SSH Server OpenSSH Server ragflow XCC Lenovo cmos 华为认证 网络工程师 输入法 繁忙 服务器繁忙 解决办法 替代网站 汇总推荐 AI推理 移动云 MS Materials android studio av1 电视盒子 机顶盒ROM 魔百盒刷机 mariadb shell embedding visualstudio minicom 串口调试工具 VMware安装mocOS VMware macOS系统安装 SSL 域名 skynet gcc ArcTS 登录 ArcUI GridItem arkUI LORA NLP Trae AI 原生集成开发环境 Trae AI 硬件工程 嵌入式实习 chrome devtools chromedriver URL 本地部署 api web pyqt docker命令大全 5G 3GPP 卫星通信 Kylin-Server 服务器安装 指令 EasyConnect mq Cline 系统开发 binder 车载系统 framework 源码环境 nextjs reactjs RustDesk自建服务器 rustdesk服务器 docker rustdesk 黑客技术 Cursor 流式接口 LInux Google pay Apple pay opensearch helm 服务器主板 AI芯片 搜索引擎 ssrf 失效的访问控制 交互 WebRTC gpt openwrt ux 多线程 open Euler dde Linux PID hadoop 系统 黑苹果 pygame 小游戏 五子棋 xrdp sdkman string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap Docker Hub docker pull 镜像源 daemon.json TrinityCore 魔兽世界 NFS adobe 监控k8s 监控kubernetes elk Python 网络编程 聊天服务器 套接字 TCP 客户端 Socket nvidia 环境迁移 服务器管理 配置教程 网站管理 崖山数据库 YashanDB WebUI DeepSeek V3 Ubuntu 24.04.1 轻量级服务器 redhat tidb GLIBC pdf 数据集 群晖 文件分享 iis VSCode 大模型面经 大模型学习 雨云服务器 源码 英语 raid5数据恢复 磁盘阵列数据恢复 混合开发 环境安装 JDK 银河麒麟操作系统 国产化 远程过程调用 Windows环境 直播推流 服务器部署ai模型 sqlite3 Anolis nginx安装 linux插件下载 蓝桥杯 毕设 mysql离线安装 ubuntu22.04 mysql8.0 hive Hive环境搭建 hive3环境 Hive远程模式 三级等保 服务器审计日志备份 无桌面 命令行 串口服务器 centos-root /dev/mapper yum clean all df -h / du -sh risc-v 京东云 ipython 基础入门 编程 Redis Desktop Playwright 自动化测试 css 联想开天P90Z装win10 linux上传下载 bootstrap flash-attention 软考 网工 压测 ECS docker run 数据卷挂载 交互模式 vmware 卡死 自动化编程 宕机切换 服务器宕机 向日葵 k8s集群资源管理 云原生开发 CPU 主板 电源 网卡 matplotlib ros2 moveit 机器人运动 DOIT 四博智联 Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 cnn AI代码编辑器 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 ai小智 语音助手 ai小智配网 ai小智教程 esp32语音助手 diy语音助手 idm eNSP 网络规划 VLAN 企业网络 显示过滤器 ICMP Wireshark安装 safari linux环境变量 thingsboard iDRAC R720xd rime 相差8小时 UTC 时间 netty dell服务器 IIS .net core Hosting Bundle .NET Framework vs2022 XFS xfs文件系统损坏 I_O error es jvm k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm 磁盘监控 deepseek r1 c/c++ 串口 firewall openstack Xen cfssl composer Jellyfin FunASR ASR iphone 佛山戴尔服务器维修 佛山三水服务器维修 产测工具框架 IMX6ULL 管理框架 TrueLicense Logstash 日志采集 无人机 我的世界服务器搭建 用户缓冲区 模拟实现 Wi-Fi 支付 微信支付 开放平台 Typore 超融合 干货分享 黑客工具 密码爆破 nac 802.1 portal Spring Security 技术共享 我的世界 我的世界联机 数码 fd 文件描述符 矩阵 线性代数 电商平台 ROS 自动驾驶 服务器时间 聚类 ISO镜像作为本地源 程序 性能分析 eclipse cocoapods xcode 执法记录仪 智能安全帽 smarteye SenseVoice 版本 强化学习 prompt 网络结构图 yaml Ultralytics 可视化 yolov8 信号处理 Kali 渗透 虚拟局域网 Linux环境 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 pppoe radius gaussdb 大模型应用 WSL2 上安装 Ubuntu dns是什么 如何设置电脑dns dns应该如何设置 CH340 串口驱动 CH341 uart 485 xss OpenSSH 交叉编译 vpn H3C powerpoint Ubuntu22.04 开发人员主页 frp 人工智能生成内容 trea idea ArkTs ArkUI AI agent IM即时通讯 剪切板对通 HTML FORMAT 云服务 saltstack bcompare Beyond Compare 模拟器 教程 序列化反序列化 IPv4 子网掩码 公网IP 私有IP 匿名管道 SSH 密钥生成 SSH 公钥 私钥 生成 主从复制 ruby 游戏引擎 uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 Linux的基础指令 seleium 算力 阿里云ECS 个人博客 Mac内存不够用怎么办 edge浏览器 linux安装配置 VS Code 键盘 P2P HDLC 嵌入式Linux IPC 社交电子 EMQX 通信协议 双系统 GRUB引导 Linux技巧 apt less langchain 中兴光猫 换光猫 网络桥接 自己换光猫 junit 游戏开发 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? 显示管理器 lightdm gdm lio-sam SLAM uv glibc 阻塞队列 生产者消费者模型 服务器崩坏原因 AD 域管理 wps ubuntu24.04.1 链表 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 IO模型 软负载 AI-native Docker Desktop 读写锁 办公自动化 自动化生成 pdf教程 rnn HTTP 服务器控制 ESP32 DeepSeek 备选 网站 调用 示例 银河麒麟桌面操作系统 Kylin OS AD域 换源 国内源 Debian 毕昇JDK tcp 远程服务 minecraft seatunnel g++ g++13 x64 SIGSEGV SSE xmm0 稳定性 看门狗 vasp安装 查询数据库服务IP地址 SQL Server 分布式训练 语音识别 arcgis AutoDL Ubuntu共享文件夹 共享目录 Linux共享文件夹 运维监控 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP k8s二次开发 集群管理 wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 IMX317 MIPI H265 VCU Radius deekseek npm qt项目 qt项目实战 qt教程 rag ragflow 源码启动 推荐算法 银河麒麟高级服务器 外接硬盘 Kylin 根服务器 代理 clickhouse 华为机试 做raid 装系统 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 laravel OpenManus 宝塔 信号 DeepSeek r1 Open WebUI cd 目录切换 CVE-2024-7347 内网服务器 内网代理 内网通信 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 NLP模型 需求分析 规格说明书 策略模式 单例模式 自学笔记 小米 澎湃OS Android rustdesk miniapp 真机调试 调试 debug 断点 网络API请求调试方法 Node-Red 编程工具 流编程 飞书 dns web3 音乐库 飞牛 bat 反向代理 deep learning 单一职责原则 程序员创富 easyui spark HistoryServer Spark YARN jobhistory 实习 Headless Linux 相机 权限 虚拟显示器 7z asp.net大文件上传下载 CDN 自动化任务管理 AISphereButler keepalived ros 自定义客户端 SAS sonoma 自动更新 重启 排查 系统重启 日志 原因 xshell termius iterm2 neo4j 数据仓库 数据库开发 database AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 zookeeper flink nfs 飞牛nas fnos yum源切换 更换国内yum源 Windows ai工具 ldap armbian u-boot 服务网格 istio GIS 遥感 WebGIS vr 大大通 第三代半导体 碳化硅 回显服务器 UDP的API使用 免费域名 域名解析 项目部署到linux服务器 项目部署过程 ftp banner DocFlow h.264 cpp-httplib 软件构建 MI300x Linux的权限 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 vscode1.86 1.86版本 ssh远程连接 语法 迁移指南 LLM Web APP Streamlit 本地部署AI大模型 李心怡 big data SRS 流媒体 直播 影刀 #影刀RPA# SSL证书 sysctl.conf vm.nr_hugepages 捆绑 链接 谷歌浏览器 youtube google gmail 图形渲染 AnythingLLM AnythingLLM安装 视觉检测 VMware创建虚拟机 视频编解码 dash 正则表达式 Claude alias unalias 别名 c odoo 服务器动作 Server action qemu libvirt 代码托管服务 WebVM 僵尸世界大战 游戏服务器搭建 基础环境 regedit 开机启动 流水线 脚本式流水线 DenseNet 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 CrewAI log4j UOS1070e figma FTP服务器 v10 软件 webgl 小智AI服务端 xiaozhi TTS HarmonyOS 考研 can 线程池 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR GoogLeNet swoole 私有化 架构与原理 多个客户端访问 IO多路复用 TCP相关API 网络药理学 生信 gromacs 分子动力学模拟 MD 动力学模拟 USB网络共享 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors 互信 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 rclone AList webdav fnOS DIFY 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 epoll IDEA ssh漏洞 ssh9.9p2 CVE-2025-23419 tailscale derp derper 中转 triton 模型分析 cursor lua MCP server C/S windows日志 移动魔百盒 vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 USB转串口 邮件APP 免费软件 Unity Dedicated Server Host Client 无头主机 aarch64 编译安装 HPC Deepseek-R1 私有化部署 推理模型 RAGFlow 本地知识库部署 DeepSeek R1 模型 etl lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 dity make 常用命令 文本命令 目录命令 python3.11 历史版本 下载 安防软件 端口测试 域名服务 DHCP 符号链接 配置 性能测试 前后端分离 DBeaver kerberos sentinel 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 实战案例 searxng midjourney Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 perf 浏览器自动化 粘包问题 TCP协议 抗锯齿 拓扑图 云桌面 微软 AD域控 证书服务器 知识图谱 加解密 Yakit yaklang 镜像 nlp PX4 milvus 健康医疗 互联网医院 UDP 流量运营 navicat 带外管理 MVS 海康威视相机 Linux权限 权限命令 特殊权限 vu大文件秒传跨域报错cors Attention proxy模式 kernel fast llama.cpp onlyoffice 在线office 磁盘清理 MacOS 容器技术 jina 软链接 硬链接 iperf3 带宽测试 进程优先级 调度队列 进程切换 状态模式 ShenTong docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 云耀服务器 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK 虚拟现实 对比 工具 meld DiffMerge 开发 QT 5.12.12 QT开发环境 Ubuntu18.04 gnu grub 版本升级 扩容 代理服务器 SEO hexo 多端开发 智慧分发 应用生态 鸿蒙OS 嵌入式系统开发 项目部署 su sudo 大模型推理 AI Agent 字节智能运维 元服务 应用上架 deployment daemonset statefulset cronjob MDK 嵌入式开发工具 论文笔记 sublime text 信创 信创终端 中科方德 大模型部署 查看显卡进程 fuser ArtTS SVN Server tortoise svn HAProxy ABAP Linux find grep 钉钉 物联网开发 端口聚合 windows11 openvpn server openvpn配置教程 centos安装openvpn 极限编程 存储维护 NetApp存储 EMC存储 CentOS System V共享内存 进程通信 KylinV10 麒麟操作系统 Vmware docker desktop image 网络建设与运维 HiCar CarLife+ CarPlay QT RK3588 xpath定位元素 autodl 端口 查看 ss AI员工 docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 IMM word hosts nvm whistle 智能音箱 智能家居 rpa wpf 企业网络规划 华为eNSP wsgiref Web 服务器网关接口 Qwen2.5-VL vllm java-rocketmq 金仓数据库 2025 征文 数据库平替用金仓 ardunio BLE 抓包工具 HarmonyOS NEXT 原生鸿蒙 Xinference nosql 合成模型 扩散模型 图像生成 fstab 内网环境 OpenHarmony 鸿蒙开发 移动开发 win服务器架设 windows server perl 网卡的名称修改 eth0 ens33 Python基础 Python教程 Python技巧 沙盒 react native sequoiaDB docker部署Python zip unzip prometheus数据采集 prometheus数据模型 prometheus特点 CentOS Stream db 计算生物学 生物信息 基因组 网络爬虫 区块链 top Linux top top命令详解 top命令重点 top常用参数 本地化部署 ubuntu20.04 ros1 Noetic 20.04 apt 安装 多路转接 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 kotlin ssh远程登录 虚幻引擎 virtualbox visual studio 玩机技巧 软件分享 软件图标 问题解决 ubuntu24 vivado24 Sealos 论文阅读 ranger MySQL8.0 浏览器开发 AI浏览器 MySql WLAN harmonyOS面试题 rancher 防火墙 NAT转发 NAT Server 烟花代码 烟花 元旦 软件卸载 系统清理 性能调优 安全代理 欧标 OCPP 网络搭建 神州数码 神州数码云平台 云平台 树莓派 VNC 环境配置 Unity插件 iventoy VmWare OpenEuler css3 ip协议 PPI String Cytoscape CytoHubba ubuntu 18.04 MAC SecureCRT dock 加速 西门子PLC 通讯 React Next.js 开源框架 MAVROS 四旋翼无人机 conda配置 conda镜像源 数字证书 签署证书 智能电视 达梦 DM8 安装MySQL 通信工程 毕业 Reactor反应堆 风扇控制软件 热榜 服务器正确解析请求体 接口优化 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 离线部署dify IO 视频平台 录像 视频转发 视频流 macOS js 解决方案 开机黑屏 MobaXterm vnc yum换源 搭建个人相关服务器 电视剧收视率分析与可视化平台 搜狗输入法 中文输入法 centos 7 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 yolov5 mcp服务器 client close