我有代碼來定義舞臺的世界文件中設置的位置模型的行爲。我想通過訂閱odom
話題由stageros發送里程計的郵件跟蹤世界它的當前位置的變量px
py
和ptheta
。像這樣:回調中未更新的變量
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?希望這個問題是有道理的。
謝謝。
你確定它是'Robot'的同一個實例嗎?確保輸出'this'的值。 – hmjd 2012-08-16 10:05:46
@hmjd是的,它是機器人的同一個實例。 – Jigglypuff 2012-08-16 10:13:32
這可能是一個線程可見性問題。大概回調是從'OtherFunction()'的另一個線程上調用的? – hmjd 2012-08-16 10:17:16