我在代码中同时使用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”实例后调用terminate
what():ALMotion::设置角度
ALBroker::methodCall:方法:setAngles,参数:[[“HeadYaw”,“HeadPitch”],[0,0],0]
ALMotion::设置角度
ALMotion::设置角度
fractionMaxSpeed:最大速度的分数应介于0.0和1.0之间
i、 e.它说
setAngles()
不是预期的介于0.0和1.0之间的值。实际上,它将其读作0(可能被强制转换为
int
?). 当然,从代码中可以看出,这不是真的。“有趣”的是,如果我评论
cv::imshow()
,代码正常工作,不会出现错误。
有人知道为什么会发生这种情况的可能原因吗?显然,在机器人上设置角度和通过OpenCV显示图像的操作之间没有联系。你能帮助我吗?
谢谢
更新:也许我忘了说这段代码在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);//*/
}