Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

microROSをRaspberry Pi Picoでつかってみる その3:PicoからROS2にデータを送る

実際のところ

2番ピンのHIGH/LOWを見て、それを10秒ごとに送る

環境構築

microROSをRaspberry Pi Picoでつかってみる その2:通信環境を構築 - Bye Bye Moore
micro_ros_raspberrypi_pico_sdkの環境をそのまま活用。
以下、ディレクトリはmicro_ros_raspberrypi_pico_sdkにいる状態で実行します。

pico_micro_ros_example.c

MakeFileを弄るのを横着して、大元のファイルを上書きにて実施

#include <rcl/rcl.h>
#include <std_msgs/msg/int8.h>
#include "pico/stdlib.h"

#define GPIO_PIN 2

void main(void) {
    // Initialize micro-ROS
    rcl_init_options_t init_options = rcl_get_zero_initialized_init_options();
    RCCHECK(rcl_init_options_init(&init_options, rclc_get_default_allocator()))
    rcl_context_t context = rcl_get_zero_initialized_context();
    RCCHECK(rcl_context_init(&context, &init_options, rclc_get_default_allocator()))
    rcl_node_t node = rcl_get_zero_initialized_node();
    rcl_node_options_t node_ops = rcl_node_get_default_options();
    RCCHECK(rcl_node_init(&node, "pico_node", "", &context, &node_ops))

    // Initialize publisher
    rcl_publisher_t publisher = rcl_get_zero_initialized_publisher();
    rcl_publisher_options_t publisher_ops = rcl_publisher_get_default_options();
    const rosidl_message_type_support_t * type_support = ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int8);
    RCCHECK(rcl_publisher_init(&publisher, &node, type_support, "/pico_gpio", &publisher_ops))

    // Initialize GPIO
    gpio_init(GPIO_PIN);
    gpio_set_dir(GPIO_PIN, GPIO_IN);

    while (1) {
        std_msgs__msg__Int8 msg;
        msg.data = gpio_get(GPIO_PIN);

        rcl_publish(&publisher, &msg, NULL);

        sleep_ms(10000);  // Sleep for 10 seconds
    }
}

ビルド

横着のお陰でやる事も同じ。素晴らしい。

cd micro_ros_raspberrypi_pico_sdk
mkdir build
cd build
cmake ..
make

書き込み

BOOTSELボタンを長押ししてブートローダモードにして書き込み。

cp pico_micro_ros_example.uf2 /media/$USER/RPI-RP2