2012-08-16 55 views
0

我有代碼來定義舞臺的世界文件中設置的位置模型的行爲。我想通過訂閱odom話題由stageros發送里程計的郵件跟蹤世界它的當前位置的變量pxpyptheta。像這樣:回調中未更新的變量

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); 
    } 
} 

這僅僅是一個例子,但由於某些原因的像素,從另一個功能印刷PY和ptheta值似乎總是在初始像素,PY和ptheta值被卡住。即使ReceiveOdometry回調也在不斷打印正確的值。 px,py,ptheta值不同,就好像每個變量有兩個不同的值。

來自ReceiveOdometry的ROS_INFO正確輸出當前位置。

ROS_INFO從OtherFunction打印初始位置,不會發生任何變化,即使PX,PY和ptheta不斷地被在ReceiveOdometry設置。

有誰知道是什麼原因造成的ReceiveOdometry回調不結轉到OtherFunction更改到PX,PY和ptheta?希望這個問題是有道理的。

謝謝。

+0

你確定它是'Robot'的同一個實例嗎?確保輸出'this'的值。 – hmjd 2012-08-16 10:05:46

+0

@hmjd是的,它是機器人的同一個實例。 – Jigglypuff 2012-08-16 10:13:32

+0

這可能是一個線程可見性問題。大概回調是從'OtherFunction()'的另一個線程上調用的? – hmjd 2012-08-16 10:17:16

回答

1

打印和檢查在兩種功能。你應該使用兩個不同的對象。

0

也許有一些優化正在進行,變量不會從內存中讀取,但保存在緩存中,因爲它們不是while循環內修改。 如果是這種情況,宣佈他們爲volatile會有所幫助。

About the volatile keyword