ROSPod is what we've dubbed our effort to get ROS running on the iPod Touch/iPhone (iROS is already taken). This is still an work in progress/proof of concept, but we hope in the coming months to make it a stable platform for ROS development. The iPod Touch and iPhone combine a high-quality display with different modes of interaction that make it appealing for robotics interfaces. This page documents our current efforts, for those who wish to try it at home. You will of course need to familiarize yourself first with Apple's iPhone/iPod Touch development process.

We don't really have much of a cross-compilation framework in place yet for ROS, so most of the time spent getting things working was due to figuring out how that worked with the iPhone, CMake, etc. The largest chunk of time by far though was getting our 3rdparty dependencies built (APR and boost were the big offenders). Total time to cross-compile was a couple days worth of part-time work.

Once we had things compiled it took about 30 minutes and twenty lines of code on top of the accelerometer demo to get tilt-based control working on the iPhone.

Below are some notes on the details of how we got things working.

Experimental Setup



export CPPFLAGS=-B/Developer/Platforms/iPhoneSimulator.platform/Developer/usr
export CXXFLAGS=-B/Developer/Platforms/iPhoneSimulator.platform/Developer/usr
export CPP=/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/cpp
export CXX=/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/g++
export CFLAGS=-B/Developer/Platforms/iPhoneSimulator.platform/Developer/usr
export CC=/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc
export INSTALL_DIR=$HOME/iphonedev/simulator/install



./configure --prefix=$INSTALL_DIR --disable-shared


./configure --prefix=$INSTALL_DIR --disable-shared --with-apr=$INSTALL_DIR


./configure --prefix=$INSTALL_DIR --disable-shared --with-apr=$INSTALL_DIR --with-apr-util=$INSTALL_DIR


Note that this is not actually correct, see the iphone device instructions for what is more likely correct

bjam --toolset=darwin macosx-version=iphonesim-2.2 --prefix=$INSTALL_DIR install



export CXXFLAGS="-B/Developer/Platforms/iPhoneOS.platform/Developer/usr -arch armv6 -miphoneos-version-min=2.2 -gdwarf-2 -mthumb -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk -pipe"
export CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp
export CXXCPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp
export CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin9-g++-4.0.1
export CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin9-gcc-4.0.1
export RANLIB=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib
export AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar
export STRIP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/strip
export LIBTOOL=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/libtool
export INSTALL_DIR=$HOME/iphonedev/iphone/install
export CPATH=$INSTALL_DIR/include:$CPATH



Edit line 84 of include/apr_general.h to be: #if defined(CRAY) || (defined(__arm) && !(defined(LINUX) || defined(__APPLE__)))

./configure --prefix=$INSTALL_DIR --disable-shared --enable-static --host=arm-apple-darwin ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes apr_cv_tcp_nodelay_with_cork=no apr_cv_process_shared_works=no apr_cv_mutex_robust_shared=no ac_cv_sizeof_struct_iovec=8 apr_cv_mutex_recursive=yes 


./configure --prefix=$INSTALL_DIR --disable-shared --enable-static --host=arm-apple-darwin ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes apr_cv_tcp_nodelay_with_cork=no apr_cv_process_shared_works=no apr_cv_mutex_robust_shared=no ac_cv_sizeof_struct_iovec=8 --with-apr=$INSTALL_DIR --with-expat=builtin


Edit lines 480 and 488 of src/main/cpp/charsetdecoder.cpp and src/main/cpp/charsetencoder.cpp respectively to be: #if APR_HAS_XLATE

/configure --prefix=$INSTALL_DIR --disable-shared --enable-static --host=arm-apple-darwin ac_cv_file__dev_zero=yes ac_cv_func_setpgrp_void=yes apr_cv_tcp_nodelay_with_cork=no apr_cv_process_shared_works=no apr_cv_mutex_robust_shared=no ac_cv_sizeof_struct_iovec=8 --with-apr=$INSTALL_DIR --with-apr-util=$INSTALL_DIR


Use the experimental CMake build system (first in 1.38)

rm -rf libs/mpi
rm -rf libs/wave
rm -rf libs/program_options
(these don't compile for the iphone)

mkdir build && cd build
ccmake ..

Set it up to only build static libs, set the install dir as you like, 'c' then 'g' to save an exit

make modularize

edit libs/detail/include/boost/detail/spinlock.hpp, replace line 35 with:
#if defined(__APPLE__) && defined(__arm__)
#  include <boost/detail/spinlock_pt.hpp>
#elif defined(__GNUC__) && defined( __arm__ ) && !defined( __thumb__ )

make install


On the ROS side, I got things working by building them in order (and also only building static libs). The executables won't link correctly, but it doesn't matter because there's no way to run them anyway. I also had to copy various tools (all the executables in genmsg_cpp for example) from a native ROS build, and kept the native ROS build in my path rather than the cross-compile one (for rospack). I also had to disable python message generation with ROS_LANG_DISABLE=rospy

In XCode I set up all the necessary include dirs (to each ROS package) and added the static libraries directly to the project.

Wiki: rospod (last edited 2009-08-14 20:51:42 by localhost)