ETH3D / badslam

Bundle Adjusted Direct RGB-D SLAM
BSD 3-Clause "New" or "Revised" License
703 stars 116 forks source link

Compiling for arm? #29

Open C-Aniruddh opened 5 years ago

C-Aniruddh commented 5 years ago

Can this project be compiled on the Jetson nano?

puzzlepaint commented 5 years ago

I don't know, I haven't tried.

magnusbarata commented 4 years ago

It seems like arm is not yet supported. I have installed all the dependencies, and had succeeded on generating cmake files, but gets the c++: error: unrecognized command line option ‘-msse2’ error on compile. Then I tried to remove -msse option from CMakeLists.txt and recompile but still no luck. Here is part of the error message:

[  0%] Built target Dependencies
[  0%] Generating pnglibconf.c
[  0%] Building CXX object CMakeFiles/loguru.dir/libvis/third_party/loguru/loguru.cpp.o
[  0%] Generating pngprefix.h
[  0%] Generating scripts/pnglibconf.c
[  0%] Generating scripts/symbols.out
[  0%] Generating pnglibconf.out
[  1%] Generating scripts/symbols.chk
[  3%] Generating pnglibconf.h
[  4%] Generating scripts/prefix.out
[  4%] Generating scripts/sym.out
[  6%] Generating scripts/vers.out
[  7%] Generating scripts/intprefix.out
[  7%] Generating libpng.sym
[  9%] Generating libpng.vers
[  9%] Built target genfiles
[ 10%] Automatic MOC and RCC for target DBoW2
[ 10%] Built target DBoW2_autogen
Scanning dependencies of target png
[ 10%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/png.c.o
[ 12%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngerror.c.o
[ 12%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngget.c.o
[ 12%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngmem.c.o
[ 14%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngpread.c.o
[ 14%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngread.c.o
[ 15%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngrio.c.o
[ 15%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngrtran.c.o
[ 17%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngrutil.c.o
[ 17%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngset.c.o
[ 18%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngtrans.c.o
[ 18%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngwio.c.o
[ 20%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngwrite.c.o
[ 20%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngwtran.c.o
[ 20%] Building C object libvis/third_party/libpng/CMakeFiles/png.dir/pngwutil.c.o
...
...
...
[ 37%] Built target DBoW2
[ 39%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/image_display.cc.o
[ 39%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/image_display_qt_widget.cc.o
[ 40%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/image_display_qt_window.cc.o
[ 40%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/image_io.cc.o
[ 42%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/image_io_libpng.cc.o
[ 42%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/image_io_netpbm.cc.o
[ 43%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/image_io_qt.cc.o
[ 43%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/libvis.cc.o
[ 43%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/opengl.cc.o
[ 45%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/opengl_context.cc.o
[ 45%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/opengl_context_glx.cc.o
[ 46%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/opengl_context_qt.cc.o
[ 46%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/patch_match_stereo.cc.o
[ 48%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/qt_thread.cc.o
[ 48%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/render_display.cc.o
[ 50%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/render_window.cc.o
[ 50%] Building CXX object CMakeFiles/libvis.dir/libvis/src/libvis/render_window_qt.cc.o
In file included from /usr/include/aarch64-linux-gnu/qt5/QtGui/qopengl.h:105:0,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/qopenglwidget.h:49,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/QOpenGLWidget:1,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:34,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GLES3/gl31.h:526:60: error: ‘void __glewActiveTexture(GLenum)’ redeclared as different kind of symbol
 GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture);
                                                            ^
In file included from /home/optimizer/badslam/./libvis/src/libvis/opengl.h:48:0,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:32,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GL/glew.h:16749:40: note: previous declaration ‘void (* __glewActiveTexture)(GLenum)’
 GLEW_FUN_EXPORT PFNGLACTIVETEXTUREPROC __glewActiveTexture;
                                        ^~~~~~~~~~~~~~~~~~~
In file included from /usr/include/aarch64-linux-gnu/qt5/QtGui/qopengl.h:105:0,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/qopenglwidget.h:49,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/QOpenGLWidget:1,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:34,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GLES3/gl31.h:527:74: error: ‘void __glewAttachShader(GLuint, GLuint)’ redeclared as different kind of symbol
 GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader);
                                                                          ^
In file included from /home/optimizer/badslam/./libvis/src/libvis/opengl.h:48:0,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:32,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GL/glew.h:16864:39: note: previous declaration ‘void (* __glewAttachShader)(GLuint, GLuint)’
 GLEW_FUN_EXPORT PFNGLATTACHSHADERPROC __glewAttachShader;
                                       ^~~~~~~~~~~~~~~~~~
In file included from /usr/include/aarch64-linux-gnu/qt5/QtGui/qopengl.h:105:0,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/qopenglwidget.h:49,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/QOpenGLWidget:1,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:34,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GLES3/gl31.h:528:99: error: ‘void __glewBindAttribLocation(GLuint, GLuint, const GLchar*)’ redeclared as different kind of symbol
 GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name);
                                                                                                   ^
In file included from /home/optimizer/badslam/./libvis/src/libvis/opengl.h:48:0,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:32,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GL/glew.h:16865:45: note: previous declaration ‘void (* __glewBindAttribLocation)(GLuint, GLuint, const GLchar*)’
 GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONPROC __glewBindAttribLocation;
                                             ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/aarch64-linux-gnu/qt5/QtGui/qopengl.h:105:0,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/qopenglwidget.h:49,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/QOpenGLWidget:1,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:34,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GLES3/gl31.h:529:71: error: ‘void __glewBindBuffer(GLenum, GLuint)’ redeclared as different kind of symbol
 GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer);
                                                                       ^
In file included from /home/optimizer/badslam/./libvis/src/libvis/opengl.h:48:0,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:32,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GL/glew.h:16845:37: note: previous declaration ‘void (* __glewBindBuffer)(GLenum, GLuint)’
 GLEW_FUN_EXPORT PFNGLBINDBUFFERPROC __glewBindBuffer;
                                     ^~~~~~~~~~~~~~~~
In file included from /usr/include/aarch64-linux-gnu/qt5/QtGui/qopengl.h:105:0,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/qopenglwidget.h:49,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/QOpenGLWidget:1,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:34,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GLES3/gl31.h:530:81: error: ‘void __glewBindFramebuffer(GLenum, GLuint)’ redeclared as different kind of symbol
 GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer);
...
...
...
In file included from /home/optimizer/badslam/./libvis/src/libvis/opengl.h:48:0,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:32,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GL/glew.h:17831:45: note: previous declaration ‘void (* __glewVertexAttribFormat)(GLuint, GLint, GLenum, GLboolean, GLuint)’
 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATPROC __glewVertexAttribFormat;
                                             ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/aarch64-linux-gnu/qt5/QtGui/qopengl.h:105:0,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/qopenglwidget.h:49,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/QOpenGLWidget:1,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:34,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GLES3/gl31.h:1516:118: error: ‘void __glewVertexAttribIFormat(GLuint, GLint, GLenum, GLuint)’ redeclared as different kind of symbol
 GL_APICALL void GL_APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset);
                                                                                                                      ^
In file included from /home/optimizer/badslam/./libvis/src/libvis/opengl.h:48:0,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:32,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GL/glew.h:17832:46: note: previous declaration ‘void (* __glewVertexAttribIFormat)(GLuint, GLint, GLenum, GLuint)’
 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATPROC __glewVertexAttribIFormat;
                                              ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/aarch64-linux-gnu/qt5/QtGui/qopengl.h:105:0,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/qopenglwidget.h:49,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/QOpenGLWidget:1,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:34,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GLES3/gl31.h:1517:91: error: ‘void __glewVertexAttribBinding(GLuint, GLuint)’ redeclared as different kind of symbol
 GL_APICALL void GL_APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex);
                                                                                           ^
In file included from /home/optimizer/badslam/./libvis/src/libvis/opengl.h:48:0,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:32,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GL/glew.h:17830:46: note: previous declaration ‘void (* __glewVertexAttribBinding)(GLuint, GLuint)’
 GLEW_FUN_EXPORT PFNGLVERTEXATTRIBBINDINGPROC __glewVertexAttribBinding;
                                              ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/aarch64-linux-gnu/qt5/QtGui/qopengl.h:105:0,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/qopenglwidget.h:49,
                 from /usr/include/aarch64-linux-gnu/qt5/QtWidgets/QOpenGLWidget:1,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:34,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GLES3/gl31.h:1518:88: error: ‘void __glewVertexBindingDivisor(GLuint, GLuint)’ redeclared as different kind of symbol
 GL_APICALL void GL_APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor);
                                                                                        ^
In file included from /home/optimizer/badslam/./libvis/src/libvis/opengl.h:48:0,
                 from /home/optimizer/badslam/./libvis/src/libvis/render_window_qt_opengl.h:32,
                 from /home/optimizer/badslam/libvis/src/libvis/render_window.cc:33:
/usr/include/GL/glew.h:17834:47: note: previous declaration ‘void (* __glewVertexBindingDivisor)(GLuint, GLuint)’
 GLEW_FUN_EXPORT PFNGLVERTEXBINDINGDIVISORPROC __glewVertexBindingDivisor;
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~
CMakeFiles/libvis.dir/build.make:494: recipe for target 'CMakeFiles/libvis.dir/libvis/src/libvis/render_window.cc.o' failed
make[3]: *** [CMakeFiles/libvis.dir/libvis/src/libvis/render_window.cc.o] Error 1
make[3]: *** Waiting for unfinished jobs....
CMakeFiles/Makefile2:146: recipe for target 'CMakeFiles/libvis.dir/all' failed
make[2]: *** [CMakeFiles/libvis.dir/all] Error 2
CMakeFiles/Makefile2:875: recipe for target 'applications/badslam/CMakeFiles/badslam.dir/rule' failed
make[1]: *** [applications/badslam/CMakeFiles/badslam.dir/rule] Error 2
Makefile:435: recipe for target 'badslam' failed
make: *** [badslam] Error 2

Any help? Thanks in advance.

puzzlepaint commented 4 years ago

Seems that GLEW conflicts with Qt's OpenGL support. One way to address this might be to try to separate the includes, such that no file includes both glew.h and Qt's opengl.h. Another, possibly simpler, way might be to drop GLEW altogether and use Qt's OpenGL functions instead. See the corresponding Qt documentation for QOpenGLWidget. Basically, one could obtain an OpenGL function object at the start of functions dealing with OpenGL, like:

QOpenGLFunctions* f = QOpenGLContext::currentContext()->functions();

and then prefix all gl functions with f->.

donalj commented 4 years ago

On ARM architectures, the Qt5 version you get with apt-get install qt5-default is built with GLES which is where the conflicts arise. You can build Qt5 from source using following the steps here and at Step 3 do

./configure -opengl desktop 

If you do this I would recommend cross-compiling as it took 4-5 hours for Qt5 to build on my Nano.

Make sure to also modify CMakeLists.txt as like @magnusbarata said, the -msse* options are for x86/x86-64 and is not supported on ARM. You can either remove these lines from the CMakeLists.txt or wrap them in an

  if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
    set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:-msse2>")
    set(LIBVIS_WARNING_OPTIONS "${LIBVIS_WARNING_OPTIONS};$<$<COMPILE_LANGUAGE:CXX>:-msse3>")
  endif()  
magnusbarata commented 4 years ago

Thank you for your reply @puzzlepaint and @donalj. Both answers provide solution for compiling with jetson nano. In the end, it seems like the slam work is too heavy for jetson nano.

tkircher commented 4 years ago

@donalj Did you get this working on the Jetson Nano?

donalj commented 4 years ago

@donalj Did you get this working on the Jetson Nano?

@tkircher sorry for the late response. I did, but like mentioned above, it was too heavy for the Nano. I did manage to get it to run with some of the example datasets but when using physical cameras (kinect v2 and Realsense d435i) it couldn't handle it. If you want to try I think I made a set of instructions on how to build/run it for the Nano that I could give.

tkircher commented 4 years ago

@donalj I just got the Kinect Azure DK working in RTAB-Map, just a few minutes ago.

https://github.com/tkircher/rtabmap

Should be merged in main tomorrow. I'm curious to know how you got badslam working on the Nano. I got it compiled but it never seemed to do anything. I didn't have the energy to track down whatever issue I was having, but it does make amazingly great point clouds on my i7 workstation.

tkircher commented 4 years ago

I should mention, I'm especially curious in trying one more time to get badslam working, because I'm getting an Xavier NX soonish which has better performance.

jcyhcs commented 2 years ago

@tkircher
hi,professor, have you success run badslam on jetson xavier nx? i have success run on jetson nano, but jetson nano too weak

mississippia commented 2 years ago

I have succeed compiled badslam on a TX2 NX and tested it with a Kinect Azure DK on realtime. The key is to compile Qt5 form source with desktop configuration of openGL. It will run but won't last. Since Tx2 has a 4GB GPU memory, and badslam takes 3.5GB+ in initialization, and 10MB+ per second during running, if GPU memory safety threshold is set to 250 MB, then badslam can run for less than 2 minutes. More to it , RGBD input won't work, use a IR image stream input. badslam It's my office, pretty abstract...

puzzlepaint commented 2 years ago

Regarding the initial GPU memory consumption, notice that this is largely due to the pre-allocation of ample memory for surfel storage. However, under normal conditions, the default number of surfels won't be reached. In the screenshot above, only a tiny fraction of the 25 million pre-allocated surfels are actually used, as seen from the corresponding display in the window's status bar. To reduce the initial memory consumption, the number of surfels pre-allocated can thus be reduced. This may be done with the --max_surfel_count command-line parameter.

mississippia commented 2 years ago

badslam_tx2 @puzzlepaint I changed the max surfel count, it works. Now I can run with RGB stream input. Tx2 is a little bit slow, badslam runs with a significant delay.