ROS开发中geometry_msgs::Point成员无法赋值给std_msgs::Float64问题
问题原因及修复方案
错误根本原因
std_msgs::Float64是ROS封装的浮点数消息结构体,实际存储数值的是其内部的data成员,不能直接和原生double(即float64)类型互相赋值geometry_msgs::Point的x/y/z成员本身就是原生double类型,不属于消息结构体,没有data成员,你报错的代码行尝试对double类型调用.data成员,自然触发编译错误
修复步骤
1. 调整变量作用域和赋值逻辑
你当前定义的pub是main函数内的局部变量,回调函数无法访问,且发布逻辑写在main中只会在程序启动时执行一次,此时还没收到订阅数据,需要调整为全局变量或者用类封装,这里提供最小修改方案:
#include <geometry_msgs/Point.h> #include <std_msgs/Float64.h> #include <ros/ros.h> // 全局变量,回调函数可直接访问 std_msgs::Float64 y; ros::Publisher pub; void controlMensajeRecibido(const geometry_msgs::Point& msg) { // 正确赋值:把原生double值赋值给std_msgs::Float64的data成员 y.data = msg.y; // 收到数据后发布 pub.publish(y); } int main(int argc, char **argv) { ros::init(argc, argv, "coordenadas"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("/ardrone/odometry/pose/pose/position", 1000, &controlMensajeRecibido); pub = nh.advertise<std_msgs::Float64>("/pid_y/state", 1000); ros::spin(); return 0; }
2. 额外校验项
如果修改后还是报错,确认你订阅的/ardrone/odometry/pose/pose/position话题的实际消息类型:
- 如果话题类型是
nav_msgs/Odometry,需要把回调函数的参数改为const nav_msgs::Odometry& msg,取值逻辑改为y.data = msg.pose.pose.position.y; - 如果你不需要长期存储消息,也可以直接在回调里定义局部
std_msgs::Float64变量赋值发布,不需要全局变量
内容的提问来源于stack exchange,提问作者Francina Carron
相关产品推荐
相关产品推荐

