小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
利用micro-ros-agent通过serial运行,没有打印出来node
-
背景(可选):
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0
问题描述:
利用micro-ros-agent通过serial运行,没有打印出来node
具体细节和上下文:
直接复制/home/leo/Documents/PlatformIO/Projects/fishbot_motion_control/.pio/libdeps/featheresp32/micro_ros_platformio/examples/micro-ros_publisher/src/Main.cpp的代码,没有报错,但是在打印出来node
代码:
#include <Arduino.h>
#include <micro_ros_platformio.h>#include <rcl/rcl.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>#include <std_msgs/msg/int32.h>
#if !defined(MICRO_ROS_TRANSPORT_ARDUINO_SERIAL)
#error This example is only avaliable for Arduino framework with serial transport.
#endifrcl_publisher_t publisher;
std_msgs__msg__Int32 msg;rclc_executor_t executor;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
rcl_timer_t timer;#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)){}}// Error handle loop
void error_loop() {
while(1) {
delay(100);
}
}void timer_callback(rcl_timer_t * timer, int64_t last_call_time) {
RCLC_UNUSED(last_call_time);
if (timer != NULL) {
RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL));
msg.data++;
}
}void setup() {
// Configure serial transport
Serial.begin(115200);
set_microros_serial_transports(Serial);
delay(2000);allocator = rcl_get_default_allocator();
//create init_options
RCCHECK(rclc_support_init(&support, 0, NULL, &allocator));// create node
RCCHECK(rclc_node_init_default(&node, "micro_ros_platformio_node", "", &support));// create publisher
RCCHECK(rclc_publisher_init_default(
&publisher,
&node,
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
"micro_ros_platformio_node_publisher"));// create timer,
const unsigned int timer_timeout = 1000;
RCCHECK(rclc_timer_init_default(
&timer,
&support,
RCL_MS_TO_NS(timer_timeout),
timer_callback));// create executor
RCCHECK(rclc_executor_init(&executor, &support.context, 1, &allocator));
RCCHECK(rclc_executor_add_timer(&executor, &timer));msg.data = 0;
}void loop() {
delay(100);
RCSOFTCHECK(rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100)));
}尝试过的解决方法:
已经重新刷过硬件,设置设备类型是运动控制板,点击一键下载,显示写入成功 -
从你提供的信息来看,你已经成功地将Micro-ROS代码部署到了ESP32开发板上,并且使用了
micro_ros_agent
通过串口进行通信。然而,你没有在micro_ros_agent
的输出中看到任何关于节点的信息。这里有几个可能的原因和相应的解决步骤:-
检查串口连接:
- 确保你的ESP32开发板通过USB正确连接到电脑,并且
/dev/ttyUSB0
是正确的串口设备。 - 你可以使用
screen
或minicom
等工具来检查串口是否有数据输出。例如,使用screen /dev/ttyUSB0 115200
来查看串口输出。
- 确保你的ESP32开发板通过USB正确连接到电脑,并且
-
检查
micro_ros_agent
的日志级别:micro_ros_agent
默认可能不打印所有节点的信息。你可以尝试增加日志级别来看是否有更多输出。使用--verbose
选项来运行micro_ros_agent
,例如:ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0 --verbose
- 这将提供更详细的输出,可能包括节点的创建和连接信息。
-
检查Micro-ROS客户端代码:
- 确保你的Micro-ROS客户端代码(即ESP32上的代码)正确初始化了节点、发布者和定时器。
- 你的代码看起来是正确的,但确认没有编译错误或警告,并且所有宏定义(如
MICRO_ROS_TRANSPORT_ARDUINO_SERIAL
)都已正确设置。
-
检查ROS 2网络:
- 确保你的ROS 2主机(运行
micro_ros_agent
的机器)和ESP32开发板在同一个网络中(如果适用)。 - 如果使用WiFi或其他网络连接方式,确保网络配置正确无误。
- 确保你的ROS 2主机(运行
-
硬件和固件问题:
- 尝试在不同的电脑上连接ESP32,看是否是电脑或USB端口的问题。
- 尝试使用不同的USB线或USB转串口适配器。
-
代码调试:
- 在ESP32代码中添加更多的调试输出,例如使用
Serial.print
来打印关键步骤的状态。 - 这可以帮助你确认代码是否按预期执行到某个点。
- 在ESP32代码中添加更多的调试输出,例如使用
-
检查ROS 2版本兼容性:
- 确保你使用的
micro_ros_agent
和Micro-ROS客户端库的版本兼容。 - 有时候,库或工具的更新可能会引入不兼容的更改。
- 确保你使用的
如果以上步骤都不能解决问题,你可能需要更深入地检查代码或寻求Micro-ROS社区的帮助。在GitHub或相关的论坛和社区中提问,通常可以得到来自开发者和用户的帮助。
以上为生成回答,仅供参考~
-
-