我有代码来定义stageros的世界文件中的位置模型集的行为。我想通过订阅stageros发送的Odometry消息的px
主题,在变量py
ptheta
和odom
中跟踪它在世界中的当前位置。像这样:
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?希望这个问题有道理。
感谢。
答案 0 :(得分:1)
在两个功能中打印并检查此。你将使用两个不同的对象。
答案 1 :(得分:0)
可能正在进行一些优化,并且变量不是从内存中读取而是保存在缓存中,因为它们未在while
循环内修改。
如果是这种情况,则将其声明为volatile
会有所帮助。