Wednesday, August 14, 2013

PCL cross compilation

This is work in progress..
Compiling PCL on Raspberry Pi gives an internal compiler error because of limited memory, so we need to cross compile it on a Linux PC.
Below are the steps documented for compilation of PCL on Pi that leads to the error.

The Point Cloud Library (or PCL) is a large scale, open project [1] for 2D/3D image and point cloud processing. The PCL framework contains numerous state-of-the art algorithms including filtering, feature estimation, surface reconstruction, registration, model fitting and segmentation http://pointclouds.org/about/



This is a guide of how to compile PCL on Raspberry Pi.

Step 0:
Download version 1.6.0 should be PCL-1.6.0-Source.tar.bz2.
Uncompress the tar-bzip archive, e.g. (replace 1.6.0 with the correct version number):
tar xvfj PCL-1.6.0-Source.tar.bz2

Step 1: Architecture changes
a) Edit src/pcl/cmake/pcl_find_sse.cmake and replace '-march=native' from line 10 with  
'-march=armv6 -mfloat-abi=hard -mfpu=vfp'. for Raspberry Pi
'-march=armv7-a -mtune=cortex-a9 -mfloat-abi=softfp -mfpu=neon' for ARM Cortex 9 CPUs

b) Edit the files
src/pcl/io/include/pcl/io/ply/byte_order.h
src/pcl/common/include/sensor_msgs/PointCloud2.h
and define PLY_LITTLE_ENDIAN, right after it checks if it was already defined:
#if (defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) || defined(__ppc__) || defined(_M_PPC) || defined(__ARCH_PPC))
#  define PCL_BIG_ENDIAN
#elif (defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_X86_) || defined(__THW_INTEL__) || defined(__I86__) || defined(__INTEL__)) \
  || (defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64)) \
        || (defined(__ANDROID__))
#  define PCL_LITTLE_ENDIAN
#else
#  define PCL_LITTLE_ENDIAN

#endif

http://www.ros.org/wiki/groovy/Installation/Raspbian/Source

Step 2: Install PCL dependencies:
sudo apt-get install libboost-all-dev  libeigen3-dev libflann-dev libvtk5-dev g++-multilib libusb-1.0-0-dev

Step 3:
  1. Change the directory to the PCL-1.6.0-Source (replace 1.6.0 with the correct version number) directory, and create a build directory in there:
    cd PCL-1.6.0-Source && mkdir build && cd build
  2. Run the CMake build system using the default options:cmake ..
  3. make 
  4. make install
http://pointclouds.org/downloads/source.html


Step 4 - Note enough memory?
installing another compiler version gcc 4.7 gives the same internal compiler error as with gcc 4.6 like just like in other places:
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=66&t=7104
sudo apt-get install gcc-4.7
sudo update-alternatives --config gcc
choose gcc 4.7 during config

Step 5: Try another ARM board

Step 6: CUDA support
if you happen to have an ARM board with an NVidia card ;)
you need to to install the CUDA repository package for Ubuntu 12.10 from the CUDA download site - this is the direct link, maybe it still works:
 http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/armhf/cuda-repo-ubuntu1204_5.5-0_armhf.deb
 and install it in a terminal:
$ sudo dpkg -i cuda-repo-ubuntu1210_5.5-0_amd64.deb
$ sudo apt-get update 
 $ sudo apt-get install cuda


Some posts about problems compiling on some ARM platforms:
http://www.pcl-users.org/Failure-to-compile-daily-builds-on-Pandaboard-td4020376.html
http://www.pcl-developers.org/unable-to-compile-PCL-for-ARM-Cortex-A9-td5707514.html


4 comments:

  1. Hi. I have to build PCL on Raspberry. There are some error messages with gcc4.6 now.

    I have two questions
    1. Do I have to install 4.7? Can I rollback to 4.6 after build process?
    2. Do you really build PCL for Raspberry successfully? Do you build the system on rasp or PC-linux? ( because you talk about memory limitation )

    ReplyDelete
  2. Hello,
    as I wrote in the the post, both gcc 4.6 and 4.7 give internal memory error, so PCL needs to be compiled on a PC (cross compiled).
    For, that some settings with Cmake need to be done, but I didn't found those out yet. If you find them out, could you please share them here?
    Thank you

    ReplyDelete
    Replies
    1. Hi Alex, I am also trying to cross-compile PCL for a Cortex-A53 ARM processor (it is embedded on a Xilinx Zynq MPSoC device). Did you manage eventually to cross-compile PCL on your x86 PC or you compiled it on the ARM CPU?

      Delete
  3. This is really interesting blog on arm board, You are a very skilled blogger. I've joined your rss feed and look forward to seeking more of your excellent post. Also, I've shared your web site in my social networks! Thank You!!!

    ReplyDelete