Я использую в своем коде как библиотеку OpenCV, так и API C++ NAOqi. В частности, мне нужно использовать метод setAngles() для установки головных суставов робота. Выполнение этих строк:cv :: imshow, кажется, повреждает некоторые области памяти
//(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);
результаты в аварии со следующей ошибкой:
terminate called after throwing an instance of 'AL::ALError' what(): ALMotion::setAngles ALBroker::methodCall: method: setAngles, params: [["HeadYaw", "HeadPitch"], [0, 0], 0] ALMotion::setAngles ALMotion::setAngles fractionMaxSpeed: Expected a fraction of max speed between 0.0 and 1.0
т.е. это говорит о том, что третий аргумент setAngles()
не является значением в диапазоне от 0,0 до 1,0, как и ожидалось. На самом деле, он читает его как 0 (возможно, забрасывается до int
?). Конечно, это не так, как вы можете видеть из кода. «Смешной» аспект заключается в том, что, если я комментирую cv::imshow()
, код обычно работает и ошибок не возникает.
Кто-нибудь знает, почему это может произойти? По-видимому, нет никаких связей между операциями установки углов на роботе и отображением изображения через OpenCV. Вы можете мне помочь? Thanks
UPDATE: Возможно, я забыл сказать, что этот код находится внутри цикла while. В любом случае, используя атрибут post
объектов прокси NAOqi, я сделал метод 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);//*/
}
Я предполагаю, что ваш imgHeader Mat недействителен после 'cameraPtr-> releaseImage (cameraClient);', поскольку вы делаете только мелкое назначение указателя пикселей. попробуйте 'imgHeader = imgHeader.clone();' перед выпуском изображения камеры – berak
На самом деле, 'releaseImage' должен быть бесполезным с' getImageRemote', как сказано [здесь] (http://doc.aldebaran.com/1-14 /naoqi/vision/alvideodevice-api.html#ALVideoDeviceProxy::releaseImage__ssCR). Я попытался удалить его, но проблема все еще возникает. –
И даже так, это не похоже на то, чтобы быть точкой. Аварийная ошибка на методе 'setAngles()', потому что он видит неправильный третий аргумент. –