我有一个运行在pc上的节点,它以字符串的形式发布了std_msgs/String,它发布了M、R、S,我有下面的Arduino代码。
#include <ros.h>
#include <std_msgs/Empty.h>
#include <std_msgs/String.h>
ros::NodeHandle nh;
void messageCb( const std_msgs::String & toggle_msg)
{
nh.loginfo("recived new message ");
nh.loginfo(toggle_msg.data);
if(toggle_msg.data == "M")
{
nh.loginfo("Recived M if-statment ");
}
else if(toggle_msg.data == "R")
{
nh.loginfo("Recived R if-statment ");
}
else if(toggle_msg.data == "S")
{
nh.loginfo("Recived S if-statment ");
}
}
ros::Subscriber<std_msgs::String> sub("talker_vision", &messageCb );
void setup()
{
pinMode(13, OUTPUT);
nh.initNode();
nh.subscribe(sub);
}
void loop()
{
nh.spinOnce();
delay(1);
}我收到了nh.loginfo(toggle_msg.data);的M,R,S,但是当我申请条件时
if(toggle_msg.data == "M")
{
nh.loginfo("Recived M if-statment ");
}没有输出。
发布于 2022-06-28 16:32:58
您面临的问题是在这里比较两个字符串,它们被定义为char*,而不是使用Arduino经典的String类型。您可以看到消息,例如在这里生成的中字符串的类型。
比较
const char* str1 = "abc";
const char* str2 = "abc";
bool equal = str1 == str2;将始终为假,因为您正在比较内存位置,而不是字符串本身。
所以你有两个选择:
创建两个Arduino字符串对象并进行比较
String arduinoString1 = String(str1);
String arduinoString2 = String(str2);
bool equal = arduinoString1 == arduinoString2;或者更好的方法是使用标准的字符串比较器strcmp (文档)函数作为在这里描述,例如。
bool equal = strcmp(str1, str2) == 0;https://stackoverflow.com/questions/72751650
复制相似问题