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;
}
Код: Выделить всё
Код: Выделить всё
#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
Код: Выделить всё
[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
Мобильная версия