ДИСТРО ROS: Noetic
ПЛАТА Arduino: Arduino Mega2560
последовательная библиотека
Я использую ROS и Arduino для связи через последовательную библиотеку ROS, и во время тестирования связь нормальная. Однако после того, как я закончил писать функции чтения и записи hardware_interface::RobotHW (по сути, вызывая Serial.read и Serial.write()), я столкнулся с ошибкой, которую я не мог понять при ее использовании.
Когда узел «hardware_interface_node» запущен, он может изначально нормально выполнять RobotHW::read() и RobotHW::write() и анализировать данные. Но через несколько секунд данные не могут быть прочитаны, и может быть выполнен только RobotHW::write(). В этот момент мигает только индикатор RX на плате Arduino. Как показано на следующем рисунке.
введите здесь описание изображения
введите здесь описание изображения
- Я пробовал закомментировать функцию Serial.write() внутри функции RobotHW::write(), и после компиляции и запуска я обнаружил, что данные можно читать нормально.
введите здесь описание изображения - Я рассказал Copilot об этой проблеме, и он сказал мне, что это может быть проблема с многопоточностью. Итак, я написал тестовую программу, используя только последовательную библиотеку и ros::Timer. После компиляции и запуска проблем не возникло.
Код: Выделить всё
#include "serial/serial.h"
#include "ros/init.h"
#include "ros/node_handle.h"
#include "ros/ros.h"
#include
serial::Serial serial_;
std::string port;
int baudrate;
uint8_t rx_buffer[15];
uint8_t tx_buffer[15] = {0x55, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
0x8, 0x9, 0x10, 0x11, 0x12, 0x13, 0x14};
uint8_t computeChecksum(uint8_t *buffer) {
uint8_t checksum = 0;
for (size_t i = 0; i < sizeof(buffer) - 1; i++) {
checksum += buffer[i];
}
return checksum;
}
void read() {
serial_.read(rx_buffer, sizeof(rx_buffer));
ROS_WARN_STREAM("Data Received: "
Подробнее здесь: [url]https://stackoverflow.com/questions/78458153/some-questions-about-ros-and-arduino[/url]
Мобильная версия