RAFT-VINS 复现

 


代码库:https://github.com/USTC-AIS-Lab/RAFT-VINS/tree/main

1. 寻找基础镜像

https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tensorrt/layers 这里我们查看 tensorrt 的版本,我们找到:22.07-py3

LABEL com.nvidia.tensorrt.version=8.4.1.5+cuda11.6.2.010

docker pull nvcr.io/nvidia/tensorrt:22.07-py3
# 测试镜像
docker run -it -rm --env DISPLAY=$DISPLAY --volume /tmp/.X11-unix:/tmp/.X11-unix --privileged --gpus all --volume /home/h/docker_workspace:/workspace --workdir /workspace --name test nvcr.io/nvidia/tensorrt:22.07-py3 /bin/bash
# 查看常用软件版本
vim test.sh
chmod 777 test.sh
#!/bin/bash
# Function to check and print the version of a command
check_version() {
local cmd=$1
local version_cmd=$2
local version_regex=$3
local name=$4
if command -v $cmd &> /dev/null; then
version=$($version_cmd | grep -oP "$version_regex")
echo "| $name | $version |"
else
echo "| $name | None |"
fi
}
# Start of the markdown table
echo "| Software | Version |"
echo "|----------|---------|"
# Ubuntu version
# 检查 lsb_release 是否可用
if command -v lsb_release &> /dev/null
then
# 使用 lsb_release 获取 Ubuntu 版本
ubuntu_version=$(lsb_release -d | awk -F"\t" '{print $2}')
echo "| Ubuntu Version | $ubuntu_version |"
else
# 如果 lsb_release 不可用,则使用 /etc/os-release 文件获取版本信息
# echo "lsb_release 命令未找到,使用 /etc/os-release 文件"
ubuntu_version=$(grep 'PRETTY_NAME' /etc/os-release | awk -F'=' '{print $2}' | tr -d '"')
echo "| Ubuntu Version | $ubuntu_version |"
fi
# Architecture
architecture=$(uname -m)
echo "| Architecture | $architecture |"
# Check versions for various software
check_version gcc "gcc --version" "^gcc.*[0-9]+\.[0-9]+\.[0-9]+" "GCC"
check_version git "git --version" "^git version [0-9]+\.[0-9]+\.[0-9]+" "Git"
check_version cmake "cmake --version" "^cmake version [0-9]+\.[0-9]+\.[0-9]+" "CMake"
check_version python2 "python2 --version" "[0-9]+\.[0-9]+\.[0-9]+" "Python2"
check_version python3 "python3 --version" "[0-9]+\.[0-9]+\.[0-9]+" "Python3"
# Check for Python3 libraries
if python3 -c "import torch" &> /dev/null; then
torch_version=$(python3 -c "import torch; print(torch.__version__)")
echo "| Torch | $torch_version |"
else
echo "| Torch | None |"
fi
if python3 -c "import tensorflow" &> /dev/null; then
tensorflow_version=$(python3 -c "import tensorflow as tf; print(tf.__version__)")
echo "| TensorFlow | $tensorflow_version |"
else
echo "| TensorFlow | None |"
fi
if python3 -c "import onnx" &> /dev/null; then
onnx_version=$(python3 -c "import onnx; print(onnx.__version__)")
echo "| ONNX | $onnx_version |"
else
echo "| ONNX | None |"
fi
check_version pip3 "pip3 --version" "pip [0-9]+\.[0-9]+" "Pip3"
check_version rosversion "rosversion -d" ".*" "ROS"
check_version ros2 "ros2 --version" ".*" "ROS2"
check_version docker "docker --version" "Docker version [0-9]+\.[0-9]+\.[0-9]+" "Docker"
check_version docker-compose "docker-compose --version" "docker-compose version [0-9]+\.[0-9]+\.[0-9]+" "Docker Compose"
check_version conda "conda --version" "conda [0-9]+\.[0-9]+\.[0-9]+" "Conda"
check_version nvidia-smi "nvidia-smi" "Driver Version: [0-9]+\.[0-9]+" "NVIDIA Driver"
check_version nvcc "nvcc --version" "release [0-9]+\.[0-9]+" "CUDA"
# Check cuDNN version
cudnn_version_file="/usr/include/cudnn_version.h"
if [ -f "$cudnn_version_file" ]; then
cudnn_major=$(grep "#define CUDNN_MAJOR" $cudnn_version_file | awk '{print $3}')
cudnn_minor=$(grep "#define CUDNN_MINOR" $cudnn_version_file | awk '{print $3}')
cudnn_patchlevel=$(grep "#define CUDNN_PATCHLEVEL" $cudnn_version_file | awk '{print $3}')
echo "| cuDNN | $cudnn_major.$cudnn_minor.$cudnn_patchlevel |"
else
echo "| cuDNN | None |"
fi
# check_version tensorrt "dpkg -s tensorrt" "Version: [0-9]+\.[0-9]+\.[0-9]+" "TensorRT"
# 使用 dpkg 来检查 TensorRT 版本
# check_version "TensorRT" "dpkg -l | grep TensorRT" "[0-9]+\.[0-9]+\.[0-9]+" "TensorRT"
# 检查是否安装了 TensorRT 的 Python 库并获取版本信息
tensorrt_version=$(python3 -c "try:
import tensorrt as trt
print(trt.__version__)
except ImportError:
print('TensorRT module not installed')" 2>/dev/null)
# 输出 TensorRT 版本信息
if [[ $tensorrt_version == "TensorRT module not installed" ]]; then
echo "| TensorRT | None |"
else
echo "| TensorRT | $tensorrt_version |"
fi
# Check for Boost
if dpkg -s libboost-all-dev &> /dev/null; then
boost_version=$(dpkg -s libboost-all-dev | grep 'Version' | awk '{print $2}')
echo "| Boost | $boost_version |"
else
echo "| Boost | None |"
fi
# Check for Eigen3
if dpkg -s libeigen3-dev &> /dev/null; then
eigen_version=$(dpkg -s libeigen3-dev | grep 'Version' | awk '{print $2}')
echo "| Eigen3 | $eigen_version |"
else
echo "| Eigen3 | None |"
fi
# 尝试使用 pkg-config 检查 OpenCV 版本
if command -v pkg-config &> /dev/null && pkg-config --exists opencv; then
opencv_version=$(pkg-config --modversion opencv)
echo "| OpenCV3 | $opencv_version |"
else
# 如果 pkg-config 不可用,使用 dpkg 检查 OpenCV 版本
opencv_version=$(dpkg -l | grep "opencv" | grep -oP "[0-9]+\.[0-9]+\.[0-9]+" | head -n 1)
if [ -z "$opencv_version" ]; then
echo "| OpenCV3 | None |"
else
echo "| OpenCV3 | $opencv_version |"
fi
fi
# Check for OpenCV4
if command -v pkg-config &> /dev/null && pkg-config --exists opencv4; then
opencv_version=$(pkg-config --modversion opencv)
echo "| OpenCV4 | $opencv_version |"
else
# 如果 pkg-config 不可用,使用 dpkg 检查 OpenCV 版本
opencv_version=$(dpkg -l | grep "opencv4" | grep -oP "[0-9]+\.[0-9]+\.[0-9]+" | head -n 1)
if [ -z "$opencv_version" ]; then
echo "| OpenCV4 | None |"
else
echo "| OpenCV4 | $opencv_version |"
fi
fi

2. 更改容器环境

export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
apt update
apt install pkg-config
apt-get install lsb-release

#### 2.1 安装 opencv3.4.20

cd /workspace/opencv/opencv-3.4.20/build
rm CMakeCache.txt
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.20/modules ..
make install
ldconfig

再运行上面的脚本,查看容器安装哪些包。

| OpenCV3 | 3.4.20 |

2.2 Eigen3

apt-get install libeigen3-dev
# 安装在 /usr/include/eigen3

2.3 ceres-solver

apt-get install liblapack-dev libsuitesparse-dev libgflags-dev libgoogle-glog-dev libgtest-dev libcxsparse3 -y
wget ceres-solver.org/ceres-solver-1.14.0.tar.gz
tar -zxvf ceres-solver-1.14.0.tar.gz
cd ceres-solver-1.14.0 && mkdir build && cd build
cmake ..
make install -j16
cd ../..
rm ceres-solver-1.14.0.tar.gz

2.4 ros

sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
apt install curl -y
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add -
apt update
apt install ros-noetic-desktop-full -y # 我选了两次 chinese
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
cat ~/.bashrc # 查看下是否将路径添加成功
source ~/.bashrc
apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential -y
apt install python3-rosdep -y
rosdep init
rosdep update
roscore

会自带 opencv 4.2

2.5 libtorch

cuda 版本是:11.7

image

好像找不到先前版本,libtorch 是向下兼容的。

解压到 RAFT-VINS 目录下。

rm libtorch-shared-with-deps-2.4.0+cu118.zip

查看容器的环境:

Software Version
Ubuntu Version Ubuntu 20.04.4 LTS
Architecture x86_64
GCC gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
Git git version 2.25.1
CMake cmake version 3.16.3
Python2 2.7.18
Python3 3.8.10
Torch None
TensorFlow None
ONNX None
Pip3 pip 22.1
ROS noetic
ROS2 None
Docker None
Docker Compose None
Conda None
NVIDIA Driver Driver Version: 535.183
CUDA release 11.7
cuDNN 8.4.1
TensorRT 8.4.1.5
Boost 1.71.0.0ubuntu2
Eigen3 3.3.7-2
Ceres 1.14.0
OpenCV3 None
OpenCV4 4.2.0

3. 代码修改和测试

mkdir -p VINS_MONO/RAFT_vins_ws/src
cd VINS_MONO/RAFT_vins_ws/src
git clone https://github.com/USTC-AIS-Lab/RAFT-VINS.git # 挺大的 378.69 MiB
cd ..

修改: feature_tracker/CMakeLists.txt:


3. 1 TensorRT 配置

find /usr -name "NvInfer.h"
/usr/include/x86_64-linux-gnu/NvInfer.h
find /usr -name "libnvinfer.so"
/usr/lib/x86_64-linux-gnu/libnvinfer.so

现在你已经找到了 TensorRT 的头文件和库文件路径:

  • 头文件路径:/usr/include/x86_64-linux-gnu/NvInfer.h
  • 库文件路径:/usr/lib/x86_64-linux-gnu/libnvinfer.so

你可以手动在 CMakeLists.txt 中配置 TensorRT 的路径,直接指定头文件和库文件位置。

下面是如何在 CMake 中使用这些路径的示例:

更新 CMakeLists.txt

在你的 CMakeLists.txt 中,添加以下配置来手动指定 TensorRT 的路径:

# 添加头文件路径
include_directories("/usr/include/x86_64-linux-gnu")
# 链接库文件路径
link_directories("/usr/lib/x86_64-linux-gnu")
# 查找并链接 TensorRT 库
find_library(TensorRT_LIBRARY nvinfer PATHS /usr/lib/x86_64-linux-gnu)
# 如果有其他 TensorRT 依赖库(如 nvinfer_plugin),可以类似这样添加:
find_library(TensorRT_PLUGIN_LIBRARY nvinfer_plugin PATHS /usr/lib/x86_64-linux-gnu)
# 链接到目标库
target_link_libraries(your_target ${TensorRT_LIBRARY} ${TensorRT_PLUGIN_LIBRARY})

解释:

  1. include_directories:指定 TensorRT 的头文件所在路径 /usr/include/x86_64-linux-gnu
  2. link_directories:指定库文件的路径 /usr/lib/x86_64-linux-gnu
  3. find_library:查找 TensorRT 运行时库(libnvinfer.so)和其他相关库(如 libnvinfer_plugin.so)。
  4. target_link_libraries:将找到的库文件与目标程序链接。

完成后:

  1. 运行 cmake 重新生成构建文件。
  2. 编译你的项目:
mkdir build && cd build
cmake ..
make

这样 CMake 应该可以找到并链接 TensorRT 库。如果你的项目需要更多的 TensorRT 相关库(例如 ONNX 解析器),可以类似地添加它们的路径和库。


3. 2 libtorch 配置

set (Torch_DIR /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/libtorch-shared-with-deps-2.4.0+cu118/libtorch/share/cmake/Torch)

其他配置:

include_directories(/home/zj/workspace/paper_final/vins_ws_v4/src/VINS-Mono/feature_tracker/src/raftflow/include) # to
include_directories(/workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/include)
target_link_libraries(feature_tracker ${catkin_LIBRARIES} ${OpenCV_LIBS} ${TORCH_LIBRARIES} ${TensorRT_LIBRARY} ${CUDA_LIBRARIES}
/workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so)

4. 编译

catkin_make

报错1:

/workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/libtorch-shared-with-deps-2.4.0+cu118/libtorch/include/torch/csrc/api/include/torch/all.h:4:2: error: #error C++17 or later compatible compiler is required to use PyTorch.

检查编译器版本

gcc --version # 9.4

GCC 7.1 及以上版本和 Clang 5.0 及以上版本支持 C++17.

set(CMAKE_CXX_FLAGS "-std=c++17")

报错2:/workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/include/logging.h:22:10: fatal error: sampleOptions.h: No such file or directory

可能是需要 TensorRT 的一些例子代码。

TensorRT 的 GA 和 EA 啥区别?
GA(General Availability)表示软件已经正式发布,可以广泛使用。EA(Early Access)表示软件还在早期访问阶段,可能包含一些未完成的功能或存在一些已知问题。

https://developer.nvidia.com/nvidia-tensorrt-8x-download

TensorRT 8.4 GA for Linux x86_64 and CUDA 11.0, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6 and 11.7 TAR Package

本来我还想重新装下 TensorRT, 直到我搜索了下 根目录:

find / -name "samples"
/opt/tensorrt/samples

这不就在这里嘛!!!

修改 CMakeLists.txt`:

set(TensorRT_INCLUDE_DIRS
"/usr/include/x86_64-linux-gnu"
"/opt/tensorrt/samples/common")
# 添加头文件路径
include_directories(${TensorRT_INCLUDE_DIRS})
# 查找并链接 TensorRT 库
find_library(TensorRT_LIBRARIES nvinfer PATHS /usr/lib/x86_64-linux-gnu)

报错3:

一大推错误。

点击查看代码
[100%] Linking CXX executable /workspace/VINS_MONO/RAFT_vins_ws/devel/lib/feature_tracker/feature_tracker
/usr/bin/ld: CMakeFiles/feature_tracker.dir/src/feature_tracker_node.cpp.o: in function `c10::intrusive_ptr_target::~intrusive_ptr_target()':
feature_tracker_node.cpp:(.text._ZN3c1020intrusive_ptr_targetD2Ev[_ZN3c1020intrusive_ptr_targetD5Ev]+0xdd): undefined reference to `c10::detail::torchInternalAssertFail(char const*, char const*, unsigned int, char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: CMakeFiles/feature_tracker.dir/src/feature_tracker_node.cpp.o: in function `c10::ivalue::Object::~Object()':
feature_tracker_node.cpp:(.text._ZN3c106ivalue6ObjectD2Ev[_ZN3c106ivalue6ObjectD5Ev]+0x1db): undefined reference to `c10::detail::torchInternalAssertFail(char const*, char const*, unsigned int, char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: CMakeFiles/feature_tracker.dir/src/feature_tracker_node.cpp.o: in function `c10::ivalue::Object::~Object()':
feature_tracker_node.cpp:(.text._ZN3c106ivalue6ObjectD0Ev[_ZN3c106ivalue6ObjectD5Ev]+0x1eb): undefined reference to `c10::detail::torchInternalAssertFail(char const*, char const*, unsigned int, char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::_pad_enum::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, long, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::_upsample_nearest_exact1d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::arange::call(c10::Scalar const&, c10::optional<c10::ScalarType>, c10::optional<c10::Layout>, c10::optional<c10::Device>, c10::optional<bool>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::_upsample_nearest_exact2d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, c10::optional<double>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::SymInt::operator<(long) const'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::upsample_bilinear2d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, bool, c10::optional<double>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::softmax_int::call(at::Tensor const&, long, c10::optional<c10::ScalarType>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::clone::call(at::Tensor const&, c10::optional<c10::MemoryFormat>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::arange_start::call(c10::Scalar const&, c10::Scalar const&, c10::optional<c10::ScalarType>, c10::optional<c10::Layout>, c10::optional<c10::Device>, c10::optional<bool>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::SymInt::operator!=(long) const'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::_upsample_bilinear2d_aa::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, bool, c10::optional<double>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::upsample_linear1d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, bool, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::to_dtype::call(at::Tensor const&, c10::ScalarType, bool, bool, c10::optional<c10::MemoryFormat>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::avg_pool2d::call(at::Tensor const&, c10::ArrayRef<long>, c10::ArrayRef<long>, c10::ArrayRef<long>, bool, bool, c10::optional<long>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::upsample_nearest1d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::_upsample_bicubic2d_aa::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, bool, c10::optional<double>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `torch::jit::Method::operator()(std::vector<c10::IValue, std::allocator<c10::IValue> >, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, c10::IValue, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, c10::IValue> > > const&) const'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::scalar_tensor::call(c10::Scalar const&, c10::optional<c10::ScalarType>, c10::optional<c10::Layout>, c10::optional<c10::Device>, c10::optional<bool>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::upsample_nearest3d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, c10::optional<double>, c10::optional<double>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::upsample_nearest2d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, c10::optional<double>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::Error::Error(c10::SourceLocation, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::to_dtype_layout::call(at::Tensor const&, c10::optional<c10::ScalarType>, c10::optional<c10::Layout>, c10::optional<c10::Device>, c10::optional<bool>, bool, bool, c10::optional<c10::MemoryFormat>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::Warning::Warning(c10::variant<c10::Warning::UserWarning, c10::Warning::DeprecationWarning>, c10::SourceLocation, char const*, bool)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::sum_dim_IntList::call(at::Tensor const&, c10::OptionalArrayRef<long>, bool, c10::optional<c10::ScalarType>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::_upsample_nearest_exact3d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, c10::optional<double>, c10::optional<double>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::Warning::Warning(c10::variant<c10::Warning::UserWarning, c10::Warning::DeprecationWarning>, c10::SourceLocation const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::detail::torchCheckFail(char const*, char const*, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::linspace::call(c10::Scalar const&, c10::Scalar const&, long, c10::optional<c10::ScalarType>, c10::optional<c10::Layout>, c10::optional<c10::Device>, c10::optional<bool>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::empty_like::call(at::Tensor const&, c10::optional<c10::ScalarType>, c10::optional<c10::Layout>, c10::optional<c10::Device>, c10::optional<bool>, c10::optional<c10::MemoryFormat>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `torch::jit::Object::find_method(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::zeros::call(c10::ArrayRef<c10::SymInt>, c10::optional<c10::ScalarType>, c10::optional<c10::Layout>, c10::optional<c10::Device>, c10::optional<bool>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `torch::jit::load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, c10::optional<c10::Device>, bool)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::upsample_bicubic2d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, bool, c10::optional<double>, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::upsample_trilinear3d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, bool, c10::optional<double>, c10::optional<double>, c10::optional<double>)'
collect2: error: ld returned 1 exit status
make[2]: *** [RAFT-VINS/feature_tracker/CMakeFiles/feature_tracker.dir/build.make:386: /workspace/VINS_MONO/RAFT_vins_ws/devel/lib/feature_tracker/feature_tracker] Error 1
make[1]: *** [CMakeFiles/Makefile2:1835: RAFT-VINS/feature_tracker/CMakeFiles/feature_tracker.dir/all] Error 2
make: *** [Makefile:141: all] Error 2
Invoking "make -j56 -l56" failed

初步判断是 libtorch 的 C++ ABI 兼容性问题,可能需要重新编译 libtorch

https://www.cnblogs.com/odesey/p/18389413

https://download.pytorch.org/libtorch/cu117/ 这里下载: libtorch-cxx11-abi-shared-with-deps-1.13.1%2Bcu117.zip

然后编译

报错4:

点击查看代码
[ 95%] Linking CXX executable /workspace/VINS_MONO/RAFT_vins_ws/devel/lib/feature_tracker/feature_tracker
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::_pad_enum::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, long, c10::optional<double>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::split_with_sizes::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, long)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::adaptive_avg_pool3d::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::SymBool::guard_bool(char const*, long) const'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::Warning::Warning(c10::variant<c10::Warning::UserWarning, c10::Warning::DeprecationWarning>, c10::SourceLocation, char const*, bool)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::warn(c10::Warning const&)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `c10::Warning::Warning(c10::variant<c10::Warning::UserWarning, c10::Warning::DeprecationWarning>, c10::SourceLocation const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::split_sizes::call(at::Tensor const&, c10::ArrayRef<c10::SymInt>, long)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `at::_ops::select_int::call(at::Tensor const&, long, c10::SymInt)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `long c10::detail::maybe_wrap_dim_slow<long>(long, long, bool)'
/usr/bin/ld: /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/lib/liboptical_flow.so: undefined reference to `torch::jit::load(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, c10::optional<c10::Device>, bool)'
collect2: error: ld returned 1 exit status
make[2]: *** [RAFT-VINS/feature_tracker/CMakeFiles/feature_tracker.dir/build.make:395: /workspace/VINS_MONO/RAFT_vins_ws/devel/lib/feature_tracker/feature_tracker] Error 1
make[1]: *** [CMakeFiles/Makefile2:1835: RAFT-VINS/feature_tracker/CMakeFiles/feature_tracker.dir/all] Error 2
make: *** [Makefile:141: all] Error 2

报错少多了。。。

初步判断是 liboptical_flow.so 出问题了,可能需要自己编译下。

cd /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow
mkdir build && cd build

修改 /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/src/raftflow/CMakeLists.txt

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=/opt/ros/noetic ..
make -j8

然后我们得到了新的 lib/liboptical_flow.so 文件。

替换掉 /workspace/VINS_MONO/RAFT_vins_ws/src/RAFT-VINS/feature_tracker/CMakeLists.txt 文件中的路径。

然后再 编译即可。

我们成功了。

roslaunch vins_estimator euroc.launch

报错5:

[08/30/2024-10:03:26] [I] [TRT] Loaded engine size: 1 MiB
[08/30/2024-10:03:26] [E] [TRT] 1: [stdArchiveReader.cpp::StdArchiveReader::30] Error Code 1: Serialization (Serialization assertion magicTagRead == kMAGIC_TAG failed.Magic tag does not match)
[08/30/2024-10:03:26] [E] [TRT] 4: [runtime.cpp::deserializeCudaEngine::50] Error Code 4: Internal Error (Engine deserialization failed.)
can not create engine
create ExecutionContext

原因是转换和推理的镜像TRT版本不同.

应该是 tensorrt 的版本不一致,导致我无法直接使用 该 engine。因此,需要在自己的环境下重新转下 onnx 到 engine。

所幸:https://github.com/USTC-AIS-Lab/RAFT-VINS/tree/raftcpp 分支里面有构建 engine 的代码。

修改相应的 build_orin.cpp 和 CMakeLists.txt

./buildengine_orin # 生成相应的 engine

修改 RAFT-VINS 的 engine 路径,并且在 里面进行编译。

然后再在 外面 catkin_make

我们成功了。光流可以跑起来了。

5. 导出和验证 docker 镜像

docker stop 65ed
docker commit 65edf2f raft-vins:20.04
docker run -it --rm --net=host --env DISPLAY=$DISPLAY --volume /tmp/.X11-unix:/tmp/.X11-unix --privileged --gpus all --volume /home/h/docker_workspace:/workspace --workdir /workspace --name test raft-vins:20.04 /bin/bash
docker exec -it e03 /bin/bash # 进入容器,不干扰别的终端
# 再运行第三步即可。

非常完美,我们验证通过了。

现在的缺点是:我们的镜像太大了,有 14G,可以考虑压缩一下。

posted @   Zenith_Hugh  阅读(118)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2022-08-30 YOLOv7 源码解读之数据读取
2022-08-30 YOLOv3-YOLOv7 COCO 数据集解析

喜欢请打赏

扫描二维码打赏

微信打赏

点击右上角即可分享
微信分享提示