ステージロスのワールドファイルに設定された位置モデルの動作を定義するコードがあります。変数内の世界での現在の位置を追跡し、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の値は、変数ごとに2つの異なる値があるかのように異なります。
ReceiveOdometryのROS_INFOは、現在の位置を正しく出力します。
OtherFunctionのROS_INFOは初期位置を出力し、px、py、およびpthetaがReceiveOdometryで継続的に設定されていても、まったく変更されません。
ReceiveOdometryコールバックのpx、py、pthetaの変更がOtherFunctionに引き継がれない原因を知っている人はいますか?うまくいけば、この質問は理にかなっています。
ありがとう。