ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

GummyBear's profile - activity

2018-05-25 04:12:45 -0500 received badge  Guru (source)
2018-05-25 04:12:45 -0500 received badge  Great Answer (source)
2016-12-29 23:55:11 -0500 received badge  Enlightened (source)
2016-12-29 23:55:11 -0500 received badge  Good Answer (source)
2016-07-01 13:15:19 -0500 received badge  Nice Answer (source)
2015-06-02 17:32:09 -0500 received badge  Necromancer (source)
2015-04-21 09:02:08 -0500 commented answer Compile roscore for ARM board

Alice, your custom ROS packages depend on ROS libraries, so you need the ARM version of those libraries to cross compile your packages. If you don't want to cross compile roscore, you could probably copy the ARM version of ROS to your build machine and link to that. I haven't tried that myself.

2015-03-27 11:20:04 -0500 received badge  Supporter (source)
2014-10-06 14:07:11 -0500 received badge  Teacher (source)
2014-10-06 14:07:11 -0500 received badge  Necromancer (source)
2014-10-06 13:45:02 -0500 answered a question Compile roscore for ARM board

I realize this answer is coming probably a month too late for you, but if you're still working on cross compiling ROS, here's a few tips:

Don't follow those instructions you found, because they are very old and outdated. I started with that document, but quickly found it wasn't relevant. Basically, you want to cross-compile a bare-bones ROS from source and then cross compile your own ROS packages. I have done this exact thing with ROS Hydro, targeting an Odroid U3 running Ubuntu 12.11. I can outline the steps for you here, but since you have a different system, details will change. The way I figured things out, you basically need to have cross-compiled versions of the dependencies for anything you want to cross-compile. At some basic level, you will install a toolchain, which should include cross-compiled standard libraries. Many dependencies you will need to build yourself, however.

Here's what you're going to need to do:

Step 1. Install your cross compiling toolchain. I don't know anything about the Wandboard, but it may use the same cross compiler toolchain that I used for the Odroid; I know the beaglebone uses the same one (g++-arm-linux-gnueabihf)

Step 2. Cross compile ROS dependencies. For bare-bones ROS Hydro, I needed the following dependencies: boost (1.56.0), Python (2.7.3), Bzip2, Poco, uuid, libtinyxml. Depending on what ROS packages you need, you might have different dependencies.

Step 3. After you cross compile all of those packages, you need to cross compile ROS. You basically just follow the building ROS from source instructions ( http://wiki.ros.org/hydro/Installatio... ). The only major difference that you will have is when you build, you want to pass in a toolchain.cmake file, which will instruct cmake to use the cross compiling tools instead of your typical system tools. For a bare-bones ROS, use the following rosinstall_generator and wstool commands to get the necessary source code (modified for your needs, of course):

$ rosinstall_generator ros_comm <ros_pkg_1> <ros_pkg_2> ... <ros_pkg_n> --rosdistro hydro --deps --wet-only --tar > hydro-my_ros_config-wet.rosinstall

$ wstool init -j8 src hydro-my_ros_config-wet.rosinstall

Now, when you build ROS, you should use a rostoolchain.cmake file that looks something like this:

#File rostoolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH /path/to/cross/compile/build/environment)

# Have to set this one to BOTH, to allow CMake to find rospack
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

This file just tells cmake how to look for things it needs. Think about CMAKE_FIND_ROOT_PATH as the starting point for your system. Cmake won't search down any path that doesn't begin with CMAKE_FIND_ROOT_PATH. So if you have boost libraries installed on your system under /usr/lib and you also cross compiled boost to /home/user/crosscompile/boost/. If your CMAKE_FIND_ROOT_PATH is set to /home/user/crosscompile, then it can find the cross compiled boost, which is what you need if you want to cross ... (more)

2014-08-25 14:35:57 -0500 answered a question How to get boost libraries to link in cross compile?

Here's how I effectively segregated my cross-compile libs from my system libs.

My folder structure looks like this:

/path-to-cross-compiler-workspace/ros_catkin_ws

/path-to-cross-compiler-workspace/boost/boost_1.56.0

/path-to-cross-compiler-workspace/boost/boost_arm (install location for cross-compiled Boost)

/path-to-cross-compiler-workspace/usr/lib

/path-to-cross-compiler-workspace/usr/include

And my rostoolchain.cmake file looks like this:

# File: /path-to-cross-compiler-workspace/ros_catkin_ws/rostoolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH /path-to-cross-compiler-workspace)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

set(BOOST_INCLUDEDIR /path-to-cross-compiler-workspace/boost/boost_arm/include) set(BOOST_LIBRARYDIR /path-to-cross-compiler-workspace/boost/boost_arm/lib)

I found that using CMAKE_FIND_ROOT_PATH essentially treats whatever location you set it to as '/' in a typical system, so you want to populate this area with your libs and headers for your cross-compile target. So when cmake is looking for libraries, anything under /path-to-cross-compiler-workspace/usr/lib should be found automatically. This is just like if you are building a project for your local machine, and cmake can easily find libraries installed under /usr/lib.

Because I chose to install Boost in a non-standard location (i.e. next to my boost sources instead) I had to set the BOOST_INCLUDEDIR* and BOOST_LIBRARYDIR* cmake variables. I could have installed boost to /path-to-cross-compiler-workspace/usr, and it should be the same.

** My understanding is that these are the variables to use that tell cmake where to find boost, which is different than BOOST_INCLUDE_DIRS and BOOST_LIBRARY_DIRS, which are set by cmake after it finds boost.