变量不在回调中更新

时间:2012-08-16 10:00:34

标签: c++ callback publish-subscribe stage ros

我有代码来定义stageros的世界文件中的位置模型集的行为。我想通过订阅stageros发送的Odometry消息的px主题,在变量py pthetaodom中跟踪它在世界中的当前位置。像这样:

ros::Subscriber RobotOdometry_sub = n.subscribe<nav_msgs::Odometry>("robot_0/odom",1000,&Robot::ReceiveOdometry,this);

将其放在Robot对象的构造函数中。然后回调如下:

void Robot::ReceiveOdometry(nav_msgs::Odometry msg)
{
    //This is the call back function to process odometry messages coming from Stage.
    px = initialX + msg.pose.pose.position.x;
    py = initialY + msg.pose.pose.position.y;
    ptheta = angles::normalize_angle_positive(asin(msg.pose.pose.orientation.z) * 2);
    ROS_INFO("x odom %f y odom %f theta %f", px, py, ptheta);
}

这个回调似乎被称为没有问题。由回调打印的px,py和ptheta值也都是正确的,并且与它们在世界中的当前位置相对应。问题出现在其他功能中:

void Robot::OtherFunction() {
    while (ros::ok())
    {
        ros::spinOnce();
        ROS_INFO("x %f y %f theta %f", px, py, ptheta);
    }
}

这只是一个例子,但由于某种原因,从另一个函数打印的px,py和ptheta值似乎总是停留在初始的px,py和ptheta值上。即使ReceiveOdometry回调也连续打印正确的值。 px,py,ptheta值不同,就好像每个变量有两个不同的值。

ReceiveOdometry中的ROS_INFO正确打印当前位置。

来自OtherFunction的ROS_INFO打印初始位置,即使在ReceiveOdometry中连续设置px,py和ptheta,也不会发生任何变化。

有没有人知道是什么导致ReceiveOdometry回调中px,py和ptheta的更改不会转移到OtherFunction?希望这个问题有道理。

感谢。

2 个答案:

答案 0 :(得分:1)

在两个功能中打印并检查。你将使用两个不同的对象。

答案 1 :(得分:0)

可能正在进行一些优化,并且变量不是从内存中读取而是保存在缓存中,因为它们未在while循环内修改。 如果是这种情况,则将其声明为volatile会有所帮助。

About the volatile keyword