micro-ROS / micro-ROS/micro_ros_espidf_component

Multi-Thread Publisher with custrom transport

オープン
#252 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
C
スター
419
フォーク
124
平均マージ
21時間 35分
マージ済み PR(30日)
3

説明

- Hardware description: ESP32-s3
- Version or commit hash: Humble

I pulled int32_publisher_custom_transport from the examples and replaced micro_ros_task() with the micro_ros_task() given by the multithread_publisher example. So, the code be like:

```
#include
#include
#include

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_system.h"
#include "driver/uart.h"

#include
#include
#include
#include
#include

#include
#include
#include "esp32_serial_transport.h"

#define RCCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){printf("Failed status on line %d: %d. Aborting.\n",__LINE__,(int)temp_rc);vTaskDelete(NULL);}}
#define RCSOFTCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){printf("Failed status on line %d: %d. Continuing.\n",__LINE__,(int)temp_rc);}}

rcl_publisher_t publisher_1;
rcl_publisher_t publisher_2;

void thread_1(void * arg)
{
std_msgs__msg__Int32 msg;
msg.data = 0;
while(1){
RCSOFTCHECK(rcl_publish(&publisher_1, &msg, NULL));
msg.data++;
usleep(1000000);
}
}

void thread_2(void * arg)
{
std_msgs__msg__Int32 msg;
msg.data = 0;
while(1){
RCSOFTCHECK(rcl_publish(&publisher_2, &msg, NULL));
msg.data--;
usleep(500000);
}
}

void micro_ros_task(void * arg)
{
rcl_allocator_t allocator = rcl_get_default_allocator();
rclc_support_t support;

rcl_init_options_t init_options = rcl_get_zero_initialized_init_options();
RCCHECK(rcl_init_options_init(&init_options, allocator));

// create init_options
RCCHECK(rclc_support_init_with_options(&support, 0, NULL, &init_options, &allocator));

// create node
rcl_node_t node;
RCCHECK(rclc_node_init_default(&node, "multithread_node", "", &support));

// create two publishers
RCCHECK(rclc_publisher_init_default(
&publisher_1,
&node,
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
"multithread_publisher_1"));

RCCHECK(rclc_publisher_init_default(
&publisher_2,
&node,
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
"multithread_publisher_2"));

xTaskCreate(thread_1,
"thread_1",
CONFIG_MICRO_ROS_APP_STACK,
NULL,
CONFIG_MICRO_ROS_APP_TASK_PRIO,
NULL);

xTaskCreate(thread_2,
"thread_2",
CONFIG_MICRO_ROS_APP_STACK,
NULL,
CONFIG_MICRO_ROS_APP_TASK_PRIO + 1,
NULL);

while(1){
sleep(100);
}

// free resources
RCCHECK(rcl_publisher_fini(&publisher_1, &node));
RCCHECK(rcl_publisher_fini(&publisher_2, &node));
RCCHECK(rcl_node_fini(&node));

vTaskDelete(NULL);
}

static size_t uart_port = UART_NUM_0;

void app_main(void)
{
#if defined(RMW_UXRCE_TRANSPORT_CUSTOM)
rmw_uros_set_custom_transport(
true,
(void *) &uart_port,
esp32_serial_open,
esp32_serial_close,
esp32_serial_write,
esp32_serial_read
);
#else
#error micro-ROS transports misconfigured
#endif // RMW_UXRCE_TRANSPORT_CUSTOM

xTaskCreate(micro_ros_task,
"uros_task",
CONFIG_MICRO_ROS_APP_STACK,
NULL,
CONFIG_MICRO_ROS_APP_TASK_PRIO,
NULL);
}
```

I added `"-DUCLIENT_PROFILE_MULTITHREAD=ON",` on the colcon.meta and rebuilt the micro-ros components. However, ESP comes up with the following exception handler:
```

Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled.

Core 0 register dump:
PC : 0x42008849 PS : 0x00060d30 A0 : 0x8200b647 A1 : 0x3fca2200
0x42008849: esp32_serial_open at /home/bob/int32_publisher_custom_transport/main/esp32_serial_transport.c:25

A2 : 0x3fc97ea8 A3 : 0x3fc96b60 A4 : 0x00000000 A5 : 0x3fc96a78
A6 : 0x00000004 A7 : 0x00000000 A8 : 0x00000001 A9 : 0x3fca21f0
A10 : 0x3fca2200 A11 : 0x3fca2200 A12 : 0x0000001c A13 : 0x3fca221c
A14 : 0x00000004 A15 : 0x00000001 SAR : 0x0000001d EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x400570e8 LEND : 0x400570f3 LCOUNT : 0x00000000
0x400570e8: memset in ROM
0x400570f3: memset in ROM



Backtrace: 0x42008846:0x3fca2200 0x4200b644:0x3fca2240 0x42009b03:0x3fca2260 0x420091ac:0x3fca2280 0x4200e884:0x3fca22b0 0x42008cba:0x3fca2370 0x4200872c:0x3fca2390 0x4037baad:0x3fca2420
0x42008846: esp32_serial_open at /home/bob/int32_publisher_custom_transport/main/esp32_serial_transport.c:17
0x4200b644: uxr_init_custom_transport at ??:?
0x42009b03: rmw_uxrce_transport_init at ??:?
0x420091ac: rmw_init at ??:?
0x4200e884: rcl_init at ??:?
0x42008cba: rclc_support_init_with_options at ??:?
0x4200872c: micro_ros_task at /home/bob/int32_publisher_custom_transport/main/main.c:59
0x4037baad: vPortTaskWrapper at /home/bob/esp/v5.2.2/esp-idf/components/freertos/FreeRTOS-Kernel/portable/xtensa/port.c:134


ELF file SHA256: ff38db6d6

Rebooting...
���ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0xc (RTC_SW_CPU_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
Saved PC:0x4037597c

```

Are multithread flag only for UDP transports?
Thank you.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

main.c の rclc_support_init_with_options 呼び出しから始め、バックトレースが失敗を報告している esp32_serial_transport.c の 17 行目と 25 行目付近を調査してください。UCLIENT_PROFILE_MULTITHREAD を有効にする colcon.meta の変更と、カスタムトランスポートの初期化パスを確認してください。カスタムトランスポートとマルチスレッド publisher を使用した状態で、ESP32-S3 が LoadProhibited panic を起こさずに起動すれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
c
領域
embedded-iot
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
35/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。