ROS Arduino端if条件无法匹配接收到的std_msgs/String消息
问题根因
rosserial Arduino库中std_msgs::String类型的data字段是char*字符指针,直接用==运算符和字符串常量做比较时,实际对比的是两个指针的内存地址,而非指针指向的字符串实际内容,因此即使收到的字符内容匹配,判断条件也不会触发。nh.loginfo(toggle_msg.data)能正常打印出M/R/S,是因为日志函数会自动读取指针指向的连续字符内存直到字符串结束符,和指针本身的地址没有关系,不代表指针相等。
修复方案
使用C标准库的字符串比较函数strcmp()对比两个字符指针指向的实际内容,当函数返回值为0时,代表两个字符串完全一致。
修正后的消息回调代码如下:
void messageCb( const std_msgs::String & toggle_msg) { nh.loginfo("received new message "); nh.loginfo(toggle_msg.data); if(strcmp(toggle_msg.data, "M") == 0) { nh.loginfo("Received M if-statment "); } else if(strcmp(toggle_msg.data, "R") == 0) { nh.loginfo("Received R if-statment "); } else if(strcmp(toggle_msg.data, "S") == 0) { nh.loginfo("Received S if-statment "); } }
补充排查点
如果替换后判断仍不生效,优先检查PC端发布的消息是否携带不可见的冗余字符:
- 常见冗余字符包括换行符
\n、回车符\r、首尾空格 - 排查时可以在打印接收内容前后加固定标识,比如执行
nh.loginfo("[recv start]"); nh.loginfo(toggle_msg.data); nh.loginfo("[recv end]");,如果打印出的字符和标识不在同一行、或者中间存在空白间隔,说明发布端发送的内容有冗余,需要先在PC端发布节点中清理字符串的多余字符后再发送。
内容的提问来源于stack exchange,提问作者Mubashir
相关产品推荐
相关产品推荐

