SSブログ

【備忘録】 micro-ROS の micro_ros_agent と micro-ROS static library の作り方 [ロボット]

micro-ROS の micro_ros_agent と micro-ROS の static library を作ってみたので、その手順を忘れないように記録として残しておきます。基本的には、次のサイトの手順通りです。

micro-ROS_architecture.png


環境は、Ubuntu 22.04 LTS で ROS2 のバージョンは humble です。

Teensy with Arduino
Creating custom static micro-ROS library

■ micro_ros_setup の設定

micro_ros_agent と micro-ROS static library をビルドするための micro_ros_setup の環境を設定します。

# Source the ROS 2 installation
source /opt/ros/$ROS_DISTRO/setup.bash

# Create a workspace and download the micro-ROS tools
mkdir microros_ws
cd microros_ws
git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup

# Update dependencies using rosdep
sudo apt update && rosdep update
rosdep install --from-paths src --ignore-src -y

# Install pip if you need
sudo apt-get install python3-pip

# Build micro-ROS tools and source them
colcon build
source install/local_setup.bash



■ micro_ros_agent のビルド

micro_ros_agent のビルド環境をダウンロードし、ビルドします。

# Download micro-ROS agent packages
ros2 run micro_ros_setup create_agent_ws.sh

# Build micro_ros_agent
ros2 run micro_ros_setup build_agent.sh
source install/local_setup.bash


私の環境では、次のエラー出てビルドが失敗してしまいました。

$HOME/microros_ws/src/uros/micro-ROS-Agent/micro_ros_agent/src/agent/graph_manager/graph_typesupport.cpp:47:54: error: cannot bind non-const lvalue reference of type ‘bool&’ to a value of type ‘char’
   47 |     m_typeSize = 4 + callbacks_->max_serialized_size(full_bounded);
      |                                                      ^~~~~~~~~~~~
$HOME/microros_ws/src/uros/micro-ROS-Agent/micro_ros_agent/src/agent/graph_manager/graph_typesupport.cpp:139:54: error: cannot bind non-const lvalue reference of type ‘bool&’ to a value of type ‘char’
  139 |     m_typeSize = 4 + callbacks_->max_serialized_size(full_bounded);
      |                               


これは次のファイルの47行目と139行目を次のように変更したらビルドが通りました。

$HOME/microros_ws/src/uros/micro-ROS-Agent/micro_ros_agent/src/agent/graph_manager/graph_typesupport.cpp
 46     // char full_bounded;
 47     bool full_bounded;
....
139     // char full_bounded;
140     bool full_bounded;
....


micro_ros_agent は次のコマンドで起動することができます。

# run micro_ros_agent by a serial communication
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0



■ micro-ROS static library の環境準備

micro-ROS static library の開発環境をダウンロードします。

# Download micro-ROS firmware packages
ros2 run micro_ros_setup create_firmware_ws.sh generate_lib



ビルドするための設定ファイルを2つ作成します。

touch my_custom_toolchain.cmake
touch my_custom_colcon.meta



それぞれのファイルの設定例を示します。今回はSPRESENSEを前提とした設定ファイルです。

my_custom_colcon.meta
{
    "names": {
        "tracetools": {
            "cmake-args": [
                "-DTRACETOOLS_DISABLED=ON",
                "-DTRACETOOLS_STATUS_CHECKING_TOOL=OFF"
            ]
        },
        "rosidl_typesupport": {
            "cmake-args": [
                "-DROSIDL_TYPESUPPORT_SINGLE_TYPESUPPORT=ON"
            ]
        },
        "rcl": {
            "cmake-args": [
                "-DBUILD_TESTING=OFF",
                "-DRCL_COMMAND_LINE_ENABLED=OFF",
                "-DRCL_LOGGING_ENABLED=OFF"
            ]
        }, 
        "rcutils": {
            "cmake-args": [
                "-DENABLE_TESTING=OFF",
                "-DRCUTILS_NO_FILESYSTEM=OFF",
                "-DRCUTILS_NO_THREAD_SUPPORT=OFF",
                "-DRCUTILS_NO_64_ATOMIC=ON",
                "-DRCUTILS_AVOID_DYNAMIC_ALLOCATION=ON"
            ]
        },
        "microxrcedds_client": {
            "cmake-args": [
                "-DUCLIENT_PIC=OFF",
                "-DUCLIENT_PROFILE_UDP=OFF",
                "-DUCLIENT_PROFILE_TCP=OFF",
                "-DUCLIENT_PROFILE_DISCOVERY=OFF",
                "-DUCLIENT_PROFILE_SERIAL=OFF",
                "-UCLIENT_PROFILE_STREAM_FRAMING=ON",
                "-DUCLIENT_PROFILE_CUSTOM_TRANSPORT=ON"
            ]
        },
        "rmw_microxrcedds": {
            "cmake-args": [
                "-DRMW_UXRCE_MAX_NODES=1",
                "-DRMW_UXRCE_MAX_PUBLISHERS=5",
                "-DRMW_UXRCE_MAX_SUBSCRIPTIONS=5",
                "-DRMW_UXRCE_MAX_SERVICES=1",
                "-DRMW_UXRCE_MAX_CLIENTS=1",
                "-DRMW_UXRCE_MAX_HISTORY=4",
                "-DRMW_UXRCE_TRANSPORT=custom"
            ]
        }
    }
}



my_custom_toolchain.cmake
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_CROSSCOMPILING 1)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

# SET HERE THE PATH TO YOUR C99 AND C++ COMPILERS
set(CMAKE_C_COMPILER $ENV{TOOLCHAIN_PREFIX}gcc)
set(CMAKE_CXX_COMPILER $ENV{TOOLCHAIN_PREFIX}g++)

set(NUTTX_INCLUDE_DIR "$ENV{HOME}/.arduino15/packages/SPRESENSE/tools\
/spresense-sdk/3.0.1/spresense/release/nuttx/include")
set(ARDUINO_INCLUDE_DIR "$ENV{HOME}/.arduino15/packages/SPRESENSE/hardware/\
spresense/3.0.1/cores/spresense")

set(CMAKE_C_COMPILER_WORKS 1 CACHE INTERNAL "")
set(CMAKE_CXX_COMPILER_WORKS 1 CACHE INTERNAL "")

# SET HERE YOUR BUILDING FLAGS
set(FLAGS "-c -fno-builtin -mabi=aapcs -Wall -fno-strict-aliasing -Os \
-fno-strength-reduce -fomit-frame-pointer -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 \
-mfloat-abi=hard -mthumb -nostdlib -pipe -ggdb -gdwarf-3 -ffunction-sections \
-fdata-sections -DCONFIG_WCHAR_BUILTIN -DCONFIG_HAVE_DOUBLE -D__NuttX__ \
-D'RCUTILS_LOG_MIN_SEVERITY=RCUTILS_LOG_MIN_SEVERITY_NONE\
'" CACHE STRING "" FORCE)

set(CMAKE_C_FLAGS_INIT "-w -MMD -std=gnu11 ${FLAGS} -DCLOCK_MONOTONIC=0 \
-D'__attribute__(x)='" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_INIT "-w -MMD -std=gnu++11 ${FLAGS} -fno-exceptions \
-fno-rtti -fpermissive -DCLOCK_MONOTONIC=0 \
-D'__attribute__(x)='" CACHE STRING "" FORCE)

include_directories(BEFORE SYSTEM ${NUTTX_INCLUDE_DIR} ${ARDUINO_CINLUDE_DIR})

set(__BIG_ENDIAN__ 0)


$TOOLCHAIN_PREFIX は、".bashrc"の中で定義されています。

.bashrc
export TOOLCHAIN_PREFIX='$HOME/.arduino15/packages/
SPRESENSE/tools/gcc-arm-none-eabi/9.2.1/linux/bin/arm-none-eabi-'




micro-ROS static library をビルドします。

# Build micro-ROS static library
ros2 run micro_ros_setup build_firmware.sh $(pwd)/my_custom_toolchain.cmake $(pwd)/my_custom_colcon.meta



ビルドに成功すると、次の場所に static library と必要な include ファイルが生成されます。

firmware/build/libmicroros.a
firmware/include

これでひととおり micro-ROS で開発する環境を整えることができました![わーい(嬉しい顔)]





ロボットプログラミングROS2の実装・実践 -実用ロボットの開発- (設計技術シリーズ96)

ロボットプログラミングROS2の実装・実践 -実用ロボットの開発- (設計技術シリーズ96)

  • 作者: 内木場 文男
  • 出版社/メーカー: 科学情報出版株式会社
  • 発売日: 2021/07/21
  • メディア: 単行本



ROS2の基礎とJetBotの制御: ROS2 Foxyを使ったプログラミング

ROS2の基礎とJetBotの制御: ROS2 Foxyを使ったプログラミング

  • 作者: 大西和則
  • 出版社/メーカー:
  • 発売日: 2021/06/19
  • メディア: Kindle版



タグ:ROS2 micro-ROS
nice!(9)  コメント(0) 
共通テーマ:趣味・カルチャー