1

コードで OpenCV ライブラリと C++ NAOqi API の両方を使用しています。特に、setAngles()メソッドを使用して、ロボットの頭の関節を設定する必要があります。次の行を実行します。

//(1) set desired joint values on the desired joint names
pan = 0.0;
tilt = 0.0;
AL::ALValue names = AL::ALValue::array(PAN_JOINT,TILT_JOINT);
AL::ALValue angles = AL::ALValue::array(pan,tilt);
cout << "pan: " << pan << endl;
cout << "tilt: " << tilt << endl;
motionPtr->setAngles(names,angles,0.1f);

//(2) capture image from subscribed camera
AL::ALValue img = cameraPtr->getImageRemote(cameraClient);
imgHeader.data = (uchar*) img[6].GetBinary();
cameraPtr->releaseImage(cameraClient);

//(3) show image
imshow("test",imgHeader);
waitKey(30);

次のエラーでクラッシュします。

'AL::ALError' のインスタンスをスローした後に呼び出される終了 what(): ALMotion::setAngles ALBroker::methodCall: method: setAngles, params: [["HeadYaw", "HeadPitch"], [0, 0], 0 ] ALMotion::setAngles ALMotion::setAngles fractionMaxSpeed: 0.0 から 1.0 の間の最大速度の割合が予想されます

つまり、 の 3 番目の引数がsetAngles()期待どおりの 0.0 と 1.0 の間の値ではないことを示しています。実際には、それは 0 として読み取られます (おそらくint? にキャストされます)。もちろん、コードからわかるように、これは正しくありません。「面白い」側面は、 にコメントを付けるとcv::imshow()、コードが正常に機能し、エラーが発生しないことです。

これが発生する可能性のある理由を知っている人はいますか? どうやら、ロボットに角度を設定する操作と、OpenCV を介して画像を表示する操作との間に関連性はありません。手伝って頂けますか?ありがとう

更新: このコードが while ループの中にあることを忘れていたのかもしれません。とにかく、postNAOqi プロキシ オブジェクトの属性を使用して、メソッドsetAnglesを並列スレッドでバックグラウンドで実行させました。このようにして、画像は適切に表示され、エラーは発生しません。ただし、ロボットの関節は設定されておらず、ロボットは静止しています。繰り返しますが、 が呼び出されない場合、これは発生しませんcv::imshow。while ループ全体が含まれる完全な関数を次に示します。

//these are member variables of a class
double pan = 0.0;
double tilt = 0.0;
Mat imgHeader = Mat(320,240,CV8UC3);
bool headset = false;

//main loop
while(!headset){

    motionPtr->setStiffnesses("Head", 1.0f);
    int dtilt, dpan;
    int res;
    /**** Get inputs from joystick ***/
    res = joy->readEv();
    if(res != -1){
        if(jse->type & JS_EVENT_BUTTON){
            if((int)jse->number == X_BUTTON){//tilt down
                dtilt = -1;
            }
            else if((int)jse->number == TRIANGLE_BUTTON){//tilt up
                dtilt = 1;
            }
            else if((int)jse->number == START_BUTTON){//tilt down
                (firstKeyIgnored) ? (headset = true) : (firstKeyIgnored = true) ;
            }
            else{
                dtilt = 0;
            }
        }

        updateTilt(dtilt); //<-- it just changes the value of the member variable `tilt`

    }


    AL::ALValue names = AL::ALValue::array(PAN_JOINT,TILT_JOINT);
    AL::ALValue angles = AL::ALValue::array(pan,tilt);
    int id;
    id = motionPtr->post.setAngles(names,angles,0.1f);


    //capture image from subscribed camera
    ALimg = cameraPtr->getImageRemote(cameraClient);
    imgHeader.data = (uchar*) ALimg[6].getObject();
    imshow("test",imgHeader);
    waitKey(30);//*/
}
4

1 に答える 1

0

問題は半解決。私はUbuntu 14.04を使用しており、12.04までサポートされているように見えるNaoqi 1.14を使用しています。Ubuntu 12.04 を渡すと、実際にはこのエラーが発生しなくなります。Naoqi 2.1 を使用して、Ubuntu 14.04 で実行できるかどうかを確認する必要があるかもしれません。

于 2016-02-29T14:57:54.537 に答える