0

ステージロスのワールドファイルに設定された位置モデルの動作を定義するコードがあります。変数内の世界での現在の位置を追跡し、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の値は、変数ごとに2つの異なる値があるかのように異なります。

ReceiveOdometryのROS_INFOは、現在の位置を正しく出力します。

OtherFunctionのROS_INFOは初期位置を出力し、px、py、およびpthetaがReceiveOdometryで継続的に設定されていても、まったく変更されません。

ReceiveOdometryコールバックのpx、py、pthetaの変更がOtherFunctionに引き継がれない原因を知っている人はいますか?うまくいけば、この質問は理にかなっています。

ありがとう。

4

2 に答える 2

2

両方の機能でこれを印刷して確認します。2 つの異なるオブジェクトを使用する必要があります。

于 2012-08-16T10:44:25.457 に答える
0

何らかの最適化が行われており、変数はメモリから読み取られず、whileループ内で変更されないためキャッシュに保持されている可能性があります。その場合は、それらを宣言するvolatileと役立ちます。

volatileキーワードについて

于 2012-08-20T19:46:41.823 に答える