The microros is fully initialized from the dev computer showing the micro_ros_node in the ros2 node list and even in rqt_graph encoder_pos -> micro_ros_node, but for some reason the portenta h7 is not serial printing anything even "inside call back"
#include <micro_ros_arduino.h>
#include <rcl/rcl.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
#include <std_msgs/msg/int64_multi_array.h>
#define LED_PIN 13
// ROS 2 objects
rcl_subscription_t subscriber;
std_msgs__msg__Int64MultiArray msg;
rclc_executor_t executor;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
// Error blink loop
void error_loop() {
while (1) {
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
delay(100);
}
}
// Subscriber callback
void subscription_callback(const void * msgin) {
Serial.print("inside call back);
const std_msgs__msg__Int64MultiArray * m =
(const std_msgs__msg__Int64MultiArray *)msgin;
Serial.print("[Callback] Array size: ");
Serial.println(m->data.size);
for (size_t i = 0; i < m->data.size; i++) {
Serial.print("Data[");
Serial.print(i);
Serial.print("] = ");
Serial.println(m->data.data[i]);
}
}
#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 setup() {
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
digitalWrite(LED_PIN, LOW);
// Configure WiFi transport to micro-ROS agent
set_microros_wifi_transports(
(char*)"",
(char*)"",
(char*)"192.168.0.22",
8888
);
allocator = rcl_get_default_allocator();
// Initialize ROS 2 support
RCCHECK(rclc_support_init(&support, 0, NULL, &allocator));
// Create node
RCCHECK(rclc_node_init_default(&node, "micro_ros_node", "", &support));
// Initialize subscriber
RCCHECK(rclc_subscription_init_default(
&subscriber,
&node,
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int64MultiArray),
"encoders_pos"
));
// Initialize executor and add subscriber
RCCHECK(rclc_executor_init(&executor, &support.context, 1, &allocator));
RCCHECK(rclc_executor_add_subscription(&executor, &subscriber, &msg, &subscription_callback, ON_NEW_DATA));
Serial.println("Subscriber ready, waiting for /encoders_pos...");
}
void loop() {
delay(100);
// Spin executor to handle incoming messages
RCSOFTCHECK(rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100)));
}