最近收到了地平线新出的RDK Module,也是适时的体验一下。

之前研电赛的过程中,我们采用x3pi板端的tros和上位机ros2 foxy,将板端图像和目标检测的结果上传到上位机,实现了x3pi和上位机的通信,基于ros的消息通信机制,整个通信流程非常的迅速且无感,相较于自己基于网络协议设计通信机制要方便很多。

因此用本文重新梳理一下tros在x86端和板端的使用流程,首先实现RDK Module tros的基础消息通信。

tros交叉编译

由于个人不太擅长使用docker,因此还是在自己的虚拟机中重新搭建了tros的交叉编译环境,并实现了交叉编译。

交叉编译环境配置

    • sudo apt-get install -y build-essential make cmake libpcre3 libpcre3-dev bc bison \
      flex python-numpy mtd-utils zlib1g-dev debootstrap \
      libdata-hexdumper-perl libncurses5-dev zip qemu-user-static \
      curl git liblz4-tool apt-cacher-ng libssl-dev checkpolicy autoconf \
      android-sdk-libsparse-utils android-sdk-ext4-utils mtools parted dosfstools udev rsync
      

    • 下载并解压交叉编译工具链到/opt目录下

    • curl -fO http://archive.sunrisepi.tech/toolchain/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu.tar.xz
      sudo tar -xvf gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu.tar.xz -C /opt
      

    • 配置交叉编译工具链的环境变量,把以下命令添加到环境变量文件 ~/.bashrc 或者 ~/.bash_profile 的末尾


export CROSS_COMPILE=/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu- export LD_LIBRARY_PATH=/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH export PATH=$PATH:/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/ export ARCH=arm64

tros源码交叉编译

    • source /home/lza/cc_ws/tros_ws/install/setup.bash
      

    • 获取tros源码

    • mkdir ~/cc_ws/tros_ws
      cd ~/cc_ws/tros_ws
      git clone https://github.com/HorizonRDK/robot_dev_config.git -b develop
      vcs-import src < ./robot_dev_config/ros2_release.repos
      

  • 交叉编译

以下部分操作均在虚拟机中完成,非docker

## 拷贝create_soft_link.py
mkdir -p install && cp ./robot_dev_config/create_soft_link.py install/

## 使用build.sh编译X3版本tros.b
bash ./robot_dev_config/build.sh -p X3

在编译过程中碰到没有安全路径

fatal: unsafe repository(xxx is owned by someone else.)

添加git安全设置

git config --global --add safe.directory /mnt/test/lza/code_liu/cc_ws/tros_ws/src/eProsima/Fast-DDS
git config --global --add safe.directory /mnt/test/lza/code_liu/cc_ws/tros_ws/src/eProsima/Fast-DDS/thirdparty/asio
git config --global --add safe.directory /mnt/test/lza/code_liu/cc_ws/tros_ws/src/eProsima/Fast-DDS/thirdparty/tinyxml2

编译成功后会提示总计N packages编译通过。
编译成功后的tros库在install中,后续如果需要基于tros在板端部署程序,就需要根据install中的库进行交叉编译。



编译成功后的tros库在install中,后续如果需要基于tros在板端部署程序,就需要根据install中的库进行交叉编译。

最简单的ros2示例(发布者和接收者)

ros2中最经典的示例就是发布者和接受者示例,此处我将x86虚拟机设置为接收者,RDK Module设置为发布者。接收者和发布者的程序均采用c++,并在虚拟机上进行编译or交叉编译。

发布者接收者示例基于ros2官方教程:http://dev.ros2.fishros.com/doc/Tutorials/Writing-A-Simple-Cpp-Publisher-And-Subscriber.html

x86端接收者程序

x86端程序与ros2官方教程保持一致,文件结构如下图所示:


编译具体流程如下,注意x86端已完成tros x86版安装:

source /opt/tros/setup.bash
colcon build --packages-select cpp_pubsub

RDK Module端发布者程序

发布者程序也与官方教程保持一致,文件结构如下图所示:


编译流程具体如下:

  • 保证前文所述tros交叉编译已完成,确认好编译完成的install目录
  • 在ros2官方教程上添加aarch64_toolchainfile.cmake,该文件用于指定交叉编译发布者程序时的交叉编译工具链及交叉编译的tros库,aarch64_toolchainfile.cmake的具体内容如下:

注意:本文件需要修改TROS_PATH的路径为自己的路径

# Copyright (c) 2018, ARM Limited.
# SPDX-License-Identifier: Apache-2.0

# 设置TROS交叉编译的路径
set(TROS_PATH /home/lza/cc_ws/tros_ws)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION 1)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
# specify the cross compiler
set(CMAKE_C_COMPILER $ENV{CROSS_COMPILE}gcc)
set(CMAKE_CXX_COMPILER $ENV{CROSS_COMPILE}g++)
# where is the target environment
set(CMAKE_FIND_ROOT_PATH ${TROS_PATH}/install ${TROS_PATH}/build ${TROS_PATH}/../sysroot_docker)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_CROSSCOMPILING_EMULATOR qemu-aarch64-static)
set(CMAKE_SYSROOT ${TROS_PATH}/../sysroot_docker)
set(BUILD_TESTING off)
set(BUILD_HBMEM ON)
set(PYTHON_SOABI cpython-38-aarch64-linux-gnu)

# This assumes that pthread will be available on the target system
# (this emulates that the return of the TRY_RUN is a return code "0"
set(THREADS_PTHREAD_ARG "0"
  CACHE STRING "Result from TRY_RUN" FORCE)

完成aarch64_toolchainfile.cmake文件修改后,具体的编译流程如下:

source /home/lza/cc_ws/tros_ws/install/setup.bash

export TARGET_ARCH=aarch64
export TARGET_TRIPLE=aarch64-linux-gnu
export CROSS_COMPILE=/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/$TARGET_TRIPLE-

colcon build --packages-select cpp_pubsub --merge-install --cmake-force-configure --cmake-args \
--no-warn-unused-cli -DCMAKE_TOOLCHAIN_FILE=\
`pwd`/aarch64_toolchainfile.cmake

运行程序

x86电脑端

完成程序编译后,可以对程序进行测试,在x86电脑端,运行如下指令,对消息进行监听

source /opt/tros/setup.bash
source install/local_setup.bash
ros2 run cpp_pubsub listener

RDK Module端

将编译好的RDK Module端发布者程序挂载到RDK Module上

source /opt/tros/setup.bash
source install/local_setup.bash
ros2 run cpp_pubsub talker

运行结果

最终运行结果如下图所示