micro-ROS / micro-ROS/micro_ros_espidf_component

Multi-Thread Publisher with custrom transport

Ouverte
#252 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
C
Étoiles
419
Forks
124
Merge moyen
21 h 35 min
PR mergées (30 j)
3

Description

- 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.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par main.c à l’appel de rclc_support_init_with_options et examinez esp32_serial_transport.c autour des lignes 17 et 25, où le backtrace signale l’échec. Examinez la modification de colcon.meta qui active UCLIENT_PROFILE_MULTITHREAD ainsi que le chemin d’initialisation du transport personnalisé. La tâche est terminée lorsque l’ESP32-S3 démarre sans le panic LoadProhibited avec le transport personnalisé et le publisher multithread.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
c
Domaine
embedded-iot
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.