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
好像找不到先前版本,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})
解释:
- include_directories:指定 TensorRT 的头文件所在路径
/usr/include/x86_64-linux-gnu
。 - link_directories:指定库文件的路径
/usr/lib/x86_64-linux-gnu
。 - find_library:查找 TensorRT 运行时库(
libnvinfer.so
)和其他相关库(如libnvinfer_plugin.so
)。 - target_link_libraries:将找到的库文件与目标程序链接。
完成后:
- 运行
cmake
重新生成构建文件。 - 编译你的项目:
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://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,可以考虑压缩一下。