Обратный вызов многомассивного массива rosserial arduino не запускаетсяC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Обратный вызов многомассивного массива rosserial arduino не запускается

Сообщение Anonymous »

Окружающая среда
ROS DISTRO: Noetic

Плата Arduino: Arduino Mega2560

Описание проблемы< /h1>
Я пытался использовать библиотеку rosserial для последовательной связи. Я протестировал отправку некоторых типов данных, таких как std_msgs/Int32 и std_msgs/Int16, и связь работала нормально, функции обратного вызова запускались нормально. Однако когда я попытался отправить данные типов std_msgs/Int16MultiArray и std_msgs/Int32MultiArray, функции обратного вызова абонентского узла на Arduino не сработали.

Код
Следующий блок кода представляет собой содержимое файла int32MultiArrayTest.cpp. Эта программа работает на ROS Noetic.

Код: Выделить всё

#include 
#include 

void sub_cb(const std_msgs::Int32MultiArray::ConstPtr &msg) {
ROS_INFO("Result: %d %d %d %d", msg->data[0], msg->data[1], msg->data[2],
msg->data[3]);
//   ROS_INFO("Steps: %d", msg->data);
}

int main(int argc, char **argv) {
ros::init(argc, argv, "/int32_node");
ros::NodeHandle nh;
ros::Publisher pub =
nh.advertise("/int32_topic", 5);
ros::Subscriber sub =
nh.subscribe("/arduino_add", 5, sub_cb);
ros::Rate loop_rate(1);
std_msgs::Int32MultiArray msg;
msg.data = {1, 2, 3, 4};
msg.layout.dim.push_back(std_msgs::MultiArrayDimension());
msg.layout.dim[0].size = 4;
msg.layout.dim[0].label="Steps";
msg.layout.dim[0].stride=1;
while (ros::ok()) {
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
Следующий блок кода представляет собой содержимое файла run_int32test.launch. Следующий блок кода представляет собой содержимое файла rosSerialTest.ino. Он работает на Arduino Mega2560.

Код: Выделить всё

#include 
#include 
#include 

#define LED_PIN 9

std_msgs::Int32MultiArray sum_msg;

ros::NodeHandle nh;

ros::Publisher pub("/arduino_add", &sum_msg);

long steps[4] = {0, 0, 0, 0};

void messageCb(const std_msgs::Int32MultiArray &msg) {
digitalWrite(LED_PIN, HIGH);
for (size_t i = 0; i < 4; i++)
steps[i] = msg.data[i];
}

ros::Subscriber sub("/int32_topic", &messageCb);

void setup() {
pinMode(LED_PIN, LOW);
digitalWrite(LED_PIN, LOW);
nh.getHardware()->setBaud(9600);
nh.initNode();
nh.advertise(pub);
nh.subscribe(sub);
nh.spinOnce();
delay(1);
}

void loop() {
sum_msg.data = steps;
sum_msg.data_length = 4;
pub.publish(&sum_msg);
nh.spinOnce();
delay(1);
}
Что я пробовал
  • Я попробовал запустить приведенный выше код и получил следующий результат.

Код: Выделить всё

[INFO][1716035508.688977485]: Result: 0 0 0 0
[INFO][1716035508.688985089]: Result: 0 0 0 0
[INFO][1716035508.689395577]: Result: 0 0 0 0
[INFO][1716035508.689496259]: Result: 0 0 0 0
  • Я попробовал изменить тип данных в приведенном выше коде на std_msgs/Int16MultiArray, скомпилировал и запустил его и получил следующий результат.< /li>

Код: Выделить всё

[INFO][1716035508.688977485]: Result: 0 0 0 0
[INFO][1716035508.688985089]: Result: 0 0 0 0
[INFO][1716035508.689395577]: Result: 0 0 0 0
[INFO][1716035508.689496259]: Result: 0 0 0 0
Однако, подождав некоторое время (не менее 2 минут), сработала функция обратного вызова абонентского узла на Arduino, и я получил следующее результат.

Код: Выделить всё

[INFO][1716035508.688977485]: Result: 1 2 3 4
[INFO][1716035508.688985089]: Result: 1 2 3 4
[INFO][1716035508.689395577]: Result: 1 2 3 4
[INFO][1716035508.689496259]: Result: 1 2 3 4
  • Я попробовал заставить Arduino отправлять только данные типа std_msgs/Int32MultiArray длиной 4, и данные были успешно получен хост-компьютером. Однако, когда я попытался заставить хост-компьютер отправлять только данные типа std_msgs/Int32MultiArray длиной 4, Arduino должен был получить данные и запустить функцию обратного вызова подписки, чтобы зажечь светодиод. После запуска программы я обнаружил, что функция обратного вызова не срабатывает.
Заранее спасибо
Спасибо за вашу помощь! Любые предложения очень ценятся. Я обязательно обновлю этот пост, указав решение, как только решу проблему, чтобы другие тоже могли получить от него пользу.

Подробнее здесь: https://stackoverflow.com/questions/785 ... es-not-run
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»