You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:12:01