micro-ROS / micro_ros_setup

Support macros for building micro-ROS-based firmware.
Apache License 2.0
365 stars 133 forks source link

Microros client stops receiving data #686

Open Subun-01 opened 7 months ago

Subun-01 commented 7 months ago

Hey @pablogs9 , I am facing some sort of communication issue as follows.... Problem Description: I am facing difficulties when attempting to run three ESP32 devices simultaneously, each connecting to a MicroROS agent and publishing twist data to three separate bots. Despite having a strong WiFi signal and utilizing the UDP4 protocol on different ports for each ESP32 device (port 8888 and others), we encounter a recurring problem. Initially, when each ESP32 device is started individually, communication runs smoothly. However, after a short period, all three ESP32 devices cease to receive data.

Key Details:

Efforts Made:

Code on each ESP32(changing the node and topic names as well as ports accordingly):

include

include

include

include <rcl/rcl.h>

include <rcl/error_handling.h>

include <rclc/rclc.h>

include <rclc/executor.h>

include <geometry_msgs/msg/twist.h>

include <std_msgs/msg/bool.h> // Include Bool message type

rcl_subscription_t subscriber_cmd_vel; geometry_msgsmsgTwist msg; rcl_subscription_t subscriber_pen_down; std_msgsmsgBool pen_msg; rclc_executor_t executor; rclc_support_t support; rcl_allocator_t allocator; rcl_node_t node; rcl_timer_t timer;

Servo servo1; Servo servo2; Servo servo3; Servo servo_pen;

define servo1_pin 25

define servo2_pin 26

define servo3_pin 27

define servo_pen_pin 19

define LED_PIN LED_BUILTIN

define RCCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){error_loop();}}

define RCSOFTCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){}}

void error_loop(){ while(1){ digitalWrite(LED_PIN, !digitalRead(LED_PIN)); delay(100); } }

void cmd_vel_callback(const void msgin) { const geometry_msgsmsgTwist msg = (const geometry_msgsmsgTwist *)msgin; // Your processing logic for Twist messages goes here }

void pen_down_callback(const void msgin) { const std_msgsmsgBool pen_msg = (const std_msgsmsgBool *)msgin; // Your processing logic for Bool messages goes here }

void setup() { set_microros_wifi_transports("wifi", "password", "192.168..", 8888); // set_microros_tcp_transports("192.168.65.44", 8892); Serial.begin(9600); servo1.attach(servo1_pin); servo2.attach(servo2_pin); servo3.attach(servo3_pin); servo_pen.attach(servo_pen_pin); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH);
delay(2000);

allocator = rcl_get_default_allocator();

RCCHECK(rclc_support_init(&support, 0, NULL, &allocator)); RCCHECK(rclc_node_init_default(&node, "subscriber_node_3", "", &support));

RCCHECK(rclc_subscription_init_default( &subscriber_cmd_vel, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist), "/cmd_vel/bot3"));

RCCHECK(rclc_subscription_init_default( &subscriber_pen_down, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Bool), "/pen3_down"));

RCCHECK(rclc_executor_init(&executor, &support.context, 2, &allocator)); RCCHECK(rclc_executor_add_subscription(&executor, &subscriber_cmd_vel, &msg, &cmd_vel_callback, ON_NEW_DATA)); RCCHECK(rclc_executor_add_subscription(&executor, &subscriber_pen_down, &pen_msg, &pen_down_callback, ON_NEW_DATA)); }

void loop() { RCCHECK(rclc_executor_spin_some(&executor, RCL_MS_TO_NS(1)));

servo1.write(msg.linear.x + 90); servo2.write(msg.linear.y + 90); servo3.write(msg.linear.z + 90); // Process msg_pen_down (bool) if needed if (pen_msg.data) { servo_pen.write(95); } else { servo_pen.write(90); } }