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,可以考虑压缩一下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2022-08-30 YOLOv7 源码解读之数据读取
2022-08-30 YOLOv3-YOLOv7 COCO 数据集解析