Tutoriel pour la compilation croisée d’un noeud ROS2 pour Raspberry Pi 3
Ce tutoriel explique comment compiler et exécuter un noeud ROS2 sur votre PC pour la cible Raspberry Pi 3 avec Ubuntu Server 22.04. La machine hôte tourne avec le système d’exploitation Ubuntu 22.04.
Prérequis
- Une machine hôte avec Ubuntu 22.04 installé
- Une Raspberry Pi 3 avec Ubuntu Server 22.04 installé
1. Installation de la chaîne de compilation croisée:
Ouvrez une fenêtre de terminal sur un PC (machine hôte) et exécutez les commandes suivantes pour installer la chaîne de compilation croisée pour les micro-contrôleurs ARM :
sudo apt install g++-aarch64-linux-gnu
sudo apt install gcc-aarch64-linux-gnu
2. Copie des bibliothèques Raspberry Pi:
Exécutez la commande suivante pour copier les fichiers de bibliothèque nécessaires de votre Raspberry Pi vers votre PC :
rsync -vR –progress -rl –delete-after –safe-links ubuntu@192.168.1.PI:/{lib,usr,etc/ld.so.conf.d,opt} $HOME/ros2rootfs
Notes:
- Remplacez
192.168.1.PI
par l’adresse IP réelle de votre Raspberry Pi. - Assurez-vous de mettre à jour le répertoire
$HOME/ros2rootfs
chaque fois que vous installez ou désinstallez une application sur votre Raspberry Pi avec la commandersync
.
3. Création du workspace et du package ROS2:
- Créez un nouveau workspace ROS2 nommé
~/cc_ros
. - Dans le workspace, créez un package pour votre noeud ROS2 en suivant les instructions de la documentation ROS2.
4. Configuration du fichier PI.cmake:
Créez un fichier nommé PI.cmake
dans le répertoire ~/cc_ros
. Ce fichier contiendra les paramètres de compilation croisée. Ajoutez le contenu suivant :
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(tools /usr) # warning change toolchain path here.
set(rootfs_dir $ENV{HOME}/ros2rootfs)
set(CMAKE_FIND_ROOT_PATH ${rootfs_dir})
set(CMAKE_SYSROOT ${rootfs_dir})
set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIC -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}
-L${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} -L${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wl,-rpath-link,${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE} -L${CMAKE_SYSROOT}/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
## Compiler Binary
SET(BIN_PREFIX ${tools}/bin/aarch64-linux-gnu)
SET (CMAKE_C_COMPILER ${BIN_PREFIX}-gcc)
SET (CMAKE_CXX_COMPILER ${BIN_PREFIX}-g++ )
SET (CMAKE_LINKER ${BIN_PREFIX}-ld CACHE STRING "Set the cross-compiler tool LD" FORCE)
SET (CMAKE_AR ${BIN_PREFIX}-ar CACHE STRING "Set the cross-compiler tool AR" FORCE)
SET (CMAKE_NM {BIN_PREFIX}-nm CACHE STRING "Set the cross-compiler tool NM" FORCE)
SET (CMAKE_OBJCOPY ${BIN_PREFIX}-objcopy CACHE STRING "Set the cross-compiler tool OBJCOPY" FORCE)
SET (CMAKE_OBJDUMP ${BIN_PREFIX}-objdump CACHE STRING "Set the cross-compiler tool OBJDUMP" FORCE)
SET (CMAKE_RANLIB ${BIN_PREFIX}-ranlib CACHE STRING "Set the cross-compiler tool RANLIB" FORCE)
SET (CMAKE_STRIP {BIN_PREFIX}-strip CACHE STRING "Set the cross-compiler tool RANLIB" FORCE)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)