SurfelMeshing Puma 部署过程

SurfelMeshing

源代码: https://github.com/puzzlepaint/surfelmeshing
数据集: https://vision.in.tum.de/data/datasets/rgbd-dataset/download
参考教程: https://www.cnblogs.com/Ker-win/p/14864883.html

第一步,下载代码,编译

一.安装依赖
1. cuda

要求CUDA (8, 10.1)
查看版本:nvcc -V

nvcc: NVIDIA ® Cuda compiler driver
Copyright © 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61

但编译的时候遇到问题,说找不到cuda,看CMakeError.log如下

The CUDA compiler
“/usr/local/cuda-8.0/bin/nvcc”
is not able to compile a simple test program.

于是找了测试CUDA的samples

cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery  
sudo make  
sudo ./deviceQuery 

输出如下,发现driver version是11.4的,runtime version是8.0的

Detected 1 CUDA Capable device(s)
Device 0: “NVIDIA GeForce MX350”
CUDA Driver Version / Runtime Version 11.4 / 8.0
CUDA Capability Major/Minor version number: 6.1

通过nvidia-smi命令看版本,也是11.4,这里是driver version

CUDA Version: 11.4

不知道什么问题,可能自己的显卡不支持,换了服务器电脑,也是8.0版本的,就没问题


后期补充:
是CMakeLists里这一段报错

if (CMAKE_CUDA_COMPILER)
  enable_language(CUDA)
  
  # Enable C++11 globally for CUDA code
  if(NOT DEFINED CMAKE_CUDA_STANDARD)
    set(CMAKE_CUDA_STANDARD 11)
    set(CMAKE_CUDA_STANDARD_REQUIRED ON)
  endif()
else()
  message(FATAL_ERROR "CMake did not find CUDA, which is required to build this program.")
endif()

也就是CMAKE_CUDA_COMPILER有问题,于是在这句前面加了一句指令指明nvcc位置

set(CMAKE_CUDA_COMPILER /usr/local/cuda-10.1/bin/nvcc)

就可以了.(备注:我自己电脑有两个cuda版本,8.0和10.1, github上写这俩都行,但我8.0还是会报错,报错内容如下,和之前log里写的一样,10.1就ok)

CMake Error at /usr/local/share/cmake-3.21/Modules/CMakeTestCUDACompiler.cmake:56 (message):
  The CUDA compiler

    "/usr/local/cuda-8.0/bin/nvcc"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /home/dudu/surfelmeshing/build_RelWithDebInfo/CMakeFiles/CMakeTmp
    
    Run Build Command(s):/usr/bin/make -f Makefile cmTC_a1200/fast && /usr/bin/make  -f CMakeFiles/cmTC_a1200.dir/build.make CMakeFiles/cmTC_a1200.dir/build
    make[1]: 进入目录“/home/dudu/surfelmeshing/build_RelWithDebInfo/CMakeFiles/CMakeTmp”
    Building CUDA object CMakeFiles/cmTC_a1200.dir/main.cu.o
    /usr/local/cuda-8.0/bin/nvcc    -arch=sm_61   -c /home/dudu/surfelmeshing/build_RelWithDebInfo/CMakeFiles/CMakeTmp/main.cu -o CMakeFiles/cmTC_a1200.dir/main.cu.o
    In file included from /usr/local/cuda-8.0/bin/..//include/cuda_runtime.h:78:0,
                     from <command-line>:0:
    /usr/local/cuda-8.0/bin/..//include/host_config.h:119:2: error: #error -- unsupported GNU version! gcc versions later than 5 are not supported!
     #error -- unsupported GNU version! gcc versions later than 5 are not supported!
      ^~~~~
    CMakeFiles/cmTC_a1200.dir/build.make:77: recipe for target 'CMakeFiles/cmTC_a1200.dir/main.cu.o' failed
    make[1]: *** [CMakeFiles/cmTC_a1200.dir/main.cu.o] Error 1
    make[1]: 离开目录“/home/dudu/surfelmeshing/build_RelWithDebInfo/CMakeFiles/CMakeTmp”
    Makefile:127: recipe for target 'cmTC_a1200/fast' failed
    make: *** [cmTC_a1200/fast] Error 2

  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:37 (enable_language)

2.Boost

这里包括下面都是通过编译的时候提示缺啥库,再一个个安

好用的搜库指令:aptitude search boost, apt-cache search glew

boost库有很多,网上有教程说用 sudo apt-get install libboost-all-dev
不过我这只缺serialization1.65.1,所以就sudo apt-get install libboost-serialization1.65.1

3.Eigen

sudo apt-get install libeigen3-dev
最低要求2.91.0,矩阵库

4. opengl

sudo apt-get install libopengl0(好像不对)
sudo apt-get install libgl1-mesa-dev

5.GLEW

sudo apt-get install libglew-dev ,opengl扩展

6. qt5
sudo apt-get install qt5-default
sudo apt-get install libqt5x11extras5 (可能不用)
 sudo apt-get install libqt5x11extras5-dev
二. 编译

编译时如果电脑有装anaconda,要将bashrc里的anaconda注释掉,并将anaconda文件夹改个名字,防止path覆盖问题.
另外github给的编译命令里有个cuda架构,查询自己gpu对应的架构:
https://en.m.wikipedia.org/wiki/CUDA
比如mx350是6.1,设置为sm_61即可

build成功之后记得make生成可执行文件…

第二步, 运行

运行时cuda11.3报错如下

Stack trace:
29 0x561454efb28a _start + 42
28 0x7f28cfa97bf7 __libc_start_main + 231
27 0x561454efafbd main + 109
26 0x561454f85ba8 vis::WrapQtEventLoopAround(std::function<int (int, char**)>, int, char**) + 184
25 0x7f28d1062984 QCoreApplication::exec() + 148
24 0x7f28d10598da QEventLoop::exec(QFlagsQEventLoop::ProcessEventsFlag) + 314
23 0x7f28d10b485f QEventDispatcherGlib::processEvents(QFlagsQEventLoop::ProcessEventsFlag) + 95
22 0x7f28ce39f7fc g_main_context_iteration + 44
21 0x7f28ce39f770 /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0(+0x4c770) [0x7f28ce39f770]
20 0x7f28ce39f537 g_main_context_dispatch + 743
19 0x7f28d10b5233 /usr/lib/x86_64-linux-gnu/libQt5Core.so.5(+0x2e4233) [0x7f28d10b5233]
18 0x7f28d105e01d QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) + 493
17 0x7f28d105b8a8 QCoreApplication::notifyInternal2(QObject*, QEvent*) + 280
16 0x7f28d2026104 QApplication::notify(QObject*, QEvent*) + 676
15 0x7f28d201e83c QApplicationPrivate::notify_helper(QObject*, QEvent*) + 156
14 0x7f28d2170bcb QMainWindow::event(QEvent*) + 347
13 0x7f28d205d1a8 QWidget::event(QEvent*) + 872
12 0x7f28d204567f QWidgetPrivate::syncBackingStore() + 79
11 0x7f28d202e0a5 /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5(+0x1640a5) [0x7f28d202e0a5]
10 0x7f28d202d714 /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5(+0x163714) [0x7f28d202d714]
9 0x7f28d205618a QWidgetPrivate::sendPaintEvent(QRegion const&) + 58
8 0x7f28d105b8a8 QCoreApplication::notifyInternal2(QObject*, QEvent*) + 280
7 0x7f28d2026104 QApplication::notify(QObject*, QEvent*) + 676
6 0x7f28d201e83c QApplicationPrivate::notify_helper(QObject*, QEvent*) + 156
5 0x7f28d205d038 QWidget::event(QEvent*) + 504
4 0x7f28d207d86d /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5(+0x1b386d) [0x7f28d207d86d]
3 0x561454f86da2 vis::RenderWidgetOpenGL::paintGL() + 834
2 0x561454f50605 vis::SurfelMeshingRenderWindow::Render() + 2165
1 0x561454f4fc7b vis::SurfelMeshingRenderWindow::InitializeForCUDAInteropInRenderingThread() + 1003
0 0x7f28d2786cb3 loguru::StreamLogger::~StreamLogger() + 109
21:13:58.975 surfel_meshing_render_w:677 FATL| Cuda Error: unknown error

正常效果如下,使用rgbd_dataset_freiburg1_xyz数据集, 其中follow_input_camera false就是建的图不动相机动,如果true或者不加的话就是以相机视角为第一视角建图.
如果遇到显存不够的问题,加上--max_surfel_count 10000000,默认20000000

19:39:23.024 cuda_buffer_inl.h:40 FATL| Cuda Error: out of memory
已放弃 (核心已转储)

./build_RelWithDebInfo/applications/surfel_meshing/SurfelMeshing ./rgbd_dataset_freiburg1_xyz/ groundtruth.txt --follow_input_camera false --max_surfel_count 10000000

在这里插入图片描述

PUMA

源代码:https://github.com/PRBonn/puma

第一步,Installation

选择非docker方法,按照github上的Installation Instructions安装

Open3D

运行作者准备好的脚本bash 3rdparty/Open3D.sh,这个脚本的目的是帮你clone他使用的open3d的代码,安装open3d需要的依赖并编译,猜测和自己clone一下open3d的代码然后编译效果一样(大致,这个脚本还有一个打补丁)

遇到的问题

  1. 脚本里有一句下面这句话,这里在克隆open3d的时候用了克隆所有submodule的参数,导致我以为有submodule,于是就想用git方式下载而非直接下zip,但我git不行,于是按上面的方法配置代理,最后发现其实没有submodule,直接下zip也行.(在.git/config里有写)

git clone --depth 1 --recurse-submodules
https://github.com/nachovizzo/Open3D.git /tmp/Open3D -b nacho/generalized_icp &&
cd /tmp/Open3D/

  1. 当我git失败,手动下载之后,运行这个bash,说找不到文件,以为是我放的位置不对,要放在puma工作路径下,最后发现还是因为上面git那句话,最后有个cd切换工作路径,而因为该路径下已经有我粘过去的文件,cd命令没有执行,导致工作路径不对.自己加一句cd就好了

3rdparty/Open3D.sh: 第 76 行: cd: 3rdparty/PoissonRecon/PoissonRecon/: 没有那个文件或目录
+ sed -i s/sudo// util/install_deps_ubuntu.sh
sed: 无法读取 util/install_deps_ubuntu.sh: 没有那个文件或目录

  1. 同样也是跳过了那句话,但我自己在/tmp/Open3D/路径下补了PoissonRecon这个包,于是执行到了后面的打补丁环节,但由于种种原因并不打的上补丁,还不知道为啥

error: 打补丁失败:Src/FEMTree.Initialize.inl:190
error: Src/FEMTree.Initialize.inl:补丁未应用
error: 打补丁失败:Src/FEMTree.IsoSurface.specialized.inl:1855
error: Src/FEMTree.IsoSurface.specialized.inl:补丁未应用

  1. 使用git代理按照脚本克隆好了代码,但因为后面几句还是没通过,所以得重新跑,那么就需要补充cd那句.补充之后虽然还是找不到PoissonRecon(可能得自己粘一下),但可以运行到后面的安装和编译了,安装没问题,编译时有cmake版本的问题(安装依赖没问题后下一次可以把那句话注了这样快一点)

CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
CMake 3.19 or higher is required. You are running version 3.10.2

把cmakelist里的版本要求从3.19改为3.10是不行的,里面有旧版本不支持的东西,只能升级cmake
cmake下载链接:https://cmake.org/download/#latest
官方安装教程:https://cmake.org/install/#download-verification
这里采用源码安装,装在usr/local下,装的当前最新版

tar zxvf cmake-3.21.3.tar.gz
sudo mv cmake-3.21.3 /下载路径 /usr/local
cmake .   或 cmake -DCMAKE_INSTALL_PREFIX=/usr/local .
make         
make install

采用cmake --version检测是否更新
注意:据说如果用 cmake 编译过 ros ,执行autoremove cmake会把之前用 cmake 编译过的包都删掉.另外,不需要用软链接

  1. 在4的时候其实还有一个权限不够的错误,看了下是有几个命令需要sudo权限,于是我就赋予了这个脚本777的权限并用sudo ./Open3D.sh运行就好了

  2. 因为系统默认python2,找不到python3路径,在bashrc里加以下两句,不知道哪句有用

export PATH=/usr/bin/python3.6:$PATH export

PYTHONPATH=/usr/bin/python3.6:$PYTHONPATH

  1. 编译的时候要在github上下载很多包,但又下载不下来,就按照他的提示,缺啥自己下然后放进去,如果终端没有链接,就去对应的cmake文件里找.我整理了一份全都下载好的.
    如果想把全都下好的拷出来,注意先把sh脚本里最后一句删除去掉,否则编译成功之后就直接删除了.
Embree

没啥问题,同样要赋予sudo权限运行

puma

第一句成功了,第二句不行,说No module named pybind11.setup_helpers,这是因为pip默认的python2,故pybind11装到python2里了.pybind11是python调用cpp文件的,故一定要装.建议使用alternatives工具直接更换默认python版本,详见我的博客–三. 安装篇.
第二句一定要运行,这里包括编译拓展的cpp库和安装其他python库,使用了主目录的setup.config和setup.py两个文件.关于这句话的具体意思见https://pip.pypa.io/en/stable/cli/pip_install/

pip install pybind11
pip install --user .

在这里插入图片描述

第二步, Converting from .bin to .ply

因为没采用装docker的方式,因此指定dataset路径和build docker container都不需要做了.其他的docker命令都改为正常运行python代码就好
这里注意他要求的文件路径,如果有缺库的话说明前面pip install --user .没装好

第三步, Running the puma pipeline

python3 '/home/dudu/puma/apps/pipelines/slam/puma_pipeline.py' --dataset ./data/mai_city/ply --sequence 00 --n_scans 40

不知道这里–n_scan填多少应该怎么看

报错

No module named ‘puma.cpp.normal_map’

这个就是那个cpp库,pybind11需要编写setup.py,但如果手动运行这个python文件还是会报错,因此还是需要按照pip install --user .来.如果成功的话就可以正常运行

关于pybind11详见官方文档:https://pybind11.readthedocs.io/en/stable/basics.html#compiling-the-test-cases

第四步,可视化

下载open3d:http://www.open3d.org/,选deb包然后dpkg就行
缺libglfw3包,用sudo apt-get install libglfw3安装,如果找不到该软件包的话就先update一下.
打开:Open3D

PUMA560是一种六轴机械臂,可以用MATLAB进行建模和控制。下面是一个简单的示例,演示如何使用MATLAB进行PUMA560的圆弧轨迹规划。 步骤1:定义机器人 首先,我们需要定义PUMA560机器人的DH参数和初始姿态。这可以通过Robotics System Toolbox中的robotics.RigidBodyTree函数完成。 ```matlab % Define PUMA560 robot p560 = robotics.RigidBodyTree('DataFormat','column','MaxNumBodies',3); % Define DH parameters for PUMA560 L1 = Link('d', 0.67, 'a', 0, 'alpha', pi/2, 'offset', 0); L2 = Link('d', 0, 'a', 0.4318, 'alpha', 0, 'offset', pi/2); L3 = Link('d', 0, 'a', 0.0203, 'alpha', -pi/2, 'offset', 0); L4 = Link('d', 0.4331, 'a', 0, 'alpha', pi/2, 'offset', 0); L5 = Link('d', 0, 'a', 0, 'alpha', -pi/2, 'offset', 0); L6 = Link('d', 0.068, 'a', 0, 'alpha', 0, 'offset', 0); % Add links to PUMA560 robot p560 = addLink(p560, L1, 'base'); p560 = addLink(p560, L2, 'L1'); p560 = addLink(p560, L3, 'L2'); p560 = addLink(p560, L4, 'L3'); p560 = addLink(p560, L5, 'L4'); p560 = addLink(p560, L6, 'L5'); % Set the base position and orientation of the robot q0 = [0 0 0 0 0 0]; p560.base = transl(0.5,0.5,0)*trotx(pi/2); ``` 步骤2:定义圆弧轨迹 接下来,我们需要定义机器人的圆弧轨迹。在此示例中,我们将使用一个半径为0.1米的圆弧。 ```matlab % Define circle parameters radius = 0.1; theta = linspace(0,pi/2,20); x = radius*cos(theta) + 0.5; y = radius*sin(theta) + 0.5; z = zeros(size(x)); % Plot circle plot3(x,y,z,'LineWidth',2); xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)'); hold on; ``` 步骤3:规划机器人运动 现在我们可以使用MATLAB Robotics System Toolbox中的ikine函数来计算机器人的逆运动学。然后,我们可以使用trajectory函数来生成机器人的轨迹,以便控制机器人沿着圆弧轨迹移动。 ```matlab % Plan robot motion along circle qMatrix = zeros(20,6); for i=1:20 T = transl(x(i), y(i), z(i))*troty(-pi/2); qMatrix(i,:) = p560.ikine(T,'q0',q0); end traj = trajectory(robotics.Rate(20),'Waypoints',qMatrix,'TimeOfArrival',linspace(0,2,20)); ``` 步骤4:控制机器人运动 最后,我们可以使用 Robotics System Toolbox中的JointTrajectoryControl函数来控制机器人沿着圆弧轨迹移动。 ```matlab % Control robot motion along circle ctrl = robotics.JointTrajectoryController(p560); ctrl.Trajectory = traj; ctrl.TimeSource = 'Input port'; ctrl.Name = 'PUMA560'; % Control robot while true t = tic; q = ctrl(); waitfor(rate); elapsed = toc(t); end ``` 这里我们使用了一个while循环来控制机器人的运动,该循环将持续到用户停止程序。在每次循环中,我们计算机器人的下一个位置,并等待一定时间,以便机器人移动到下一个位置。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值