|
本帖最后由 light 于 2021-4-1 14:30 编辑
您好,今天我在车上使用4.4-v1.1.0+deb补丁包的状态,0143相机,把你们系统自带的例子修改为仅使用GetImagePtr这个接口,然后增加本次曝光时间戳和上次曝光时间戳差值的打印以及本次api返回时间戳和本次曝光时间戳的打印,发现仍然偶发运行过程中时间戳重复以及运行过程中时间戳相差80ms的情况,结果比较随机。调试过程中我试了很多种可能,根据经验建议你们按照下面的方式进行测试。
1、apex1开机,预先在${HOME}下建立一个launch_can.sh文件,文件内容如下:
sudo route add -net 224.0.0.0 netmask 224.0.0.0 eth0
sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan
sudo ip link set can0 type can bitrate 500000 berr-reporting on loopback off
sudo ip link set up can0
保存后,运行./launch_can.sh,然后输入密码。这个脚本中的第一条语句是因为我们使用通信的中间件,在没有网络的时候为了可以通信需要输入第一条语句,后面几条语句是你们官网给出的启动can0的语句,每次开机后先./launch_can.sh运行这个脚本。
2、运行脚本后直接使用你们自带的例子进行测试,我修改了你们的例子,你们可以按照如下一样修改。
int main(int argc, char *argv[]) {
sample_context_t ctx;
ctx.cam_fmt = " ";
ctx.cam_devname = "/dev/video0";
ctx.cam_h = 720;
ctx.cam_w = 1280;
ctx.window_num = 1;
ctx.fps = 25;
if (!parse_cmdline(&ctx, argc, argv)) {
return -1;
}
uint imgWidth{640};
uint imgHeight{360};
string imgFmt = {"ABGR32"};
miivii::MvGmslCamera mvcam(ctx.cam_devname, ctx.window_num, ctx.cam_w, ctx.cam_h, ctx.fps, imgWidth, imgHeight,
imgFmt);
bool group_a_key(true), group_b_key(false);
std::cout << "Camera type in group A is " << mvcam.GetCameraType(group_a_key) << std::endl;
std::cout << "Camera type in group B is " << mvcam.GetCameraType(group_b_key) << std::endl;
std::string windowName("DisplayCamera ");
for (uint32_t i = 0; i < ctx.window_num; i++) {
cv::namedWindow(windowName + std::to_string(i), cv::WindowFlags::WINDOW_AUTOSIZE);
cv::moveWindow(windowName + std::to_string(i), 200 * i, 200 * i);
}
cv::Mat outMat[ctx.window_num];
uint8_t *outbuf[ctx.window_num];
cv::Mat imgbuf[ctx.window_num];
signal(SIGINT, &handler);
bool quit = false;
uint64_t timestamp{};
double last_timestamp = 0.0;
double curr_timestamp = 0.0;
double send_timestamp = 0.0;
struct timeval cur_time;
while (!quit) {
if (exitRequested) {
quit = true;
break;
}
if (mvcam.GetImagePtr(outbuf, timestamp)) {
gettimeofday(&cur_time, NULL);
for (uint32_t i = 0; i < ctx.window_num; i++) {
if (imgFmt == "YUYV") {
imgbuf = cv::Mat(imgHeight, imgWidth, CV_8UC2, outbuf);
cv::Mat mrgba(imgHeight, imgWidth, CV_8UC3);
cv::cvtColor(imgbuf, mrgba, cv::COLOR_YUV2BGR_YUYV);
cv::imshow(windowName + std::to_string(i), mrgba);
} else if (imgFmt == "ABGR32") {
imgbuf = cv::Mat(imgHeight, imgWidth, CV_8UC4, outbuf);
cv::cvtColor(imgbuf, imgbuf, cv::COLOR_RGBA2BGR);
cv::imshow(windowName + std::to_string(i), imgbuf);
}
}
curr_timestamp = static_cast<double>(timestamp)/1e9;
send_timestamp = cur_time.tv_sec + cur_time.tv_usec/1e6;
std::cout << (uint64_t)((send_timestamp-curr_timestamp)*1000) << " ms" << std::endl;
if(curr_timestamp - last_timestamp > 0.09){
std::cerr<<"FATAL ERROR CAMERA STAMP IS EXTREAMLY LARGE!!!"<<(curr_timestamp - last_timestamp)<<std::endl;
}else if(curr_timestamp - last_timestamp > 0.05){
std::cerr<<"CAMERA STAMP IS TOO LARGE!!! "<<(curr_timestamp - last_timestamp)<<std::endl;
}else if(curr_timestamp - last_timestamp < 0.03){
std::cerr<<"CAMERA STAMP IS TOO SMALL!!! "<<(curr_timestamp - last_timestamp)<<std::endl;
}else{
}
last_timestamp = curr_timestamp;
} else {
std::cerr << "Can't get image form camera." << std::endl;
}
if (cv::waitKey(1) == 27) {// Wait for 'esc' key press to exit
break;
}
}
return 0;
}
3、使用命令启动, ./cameras_opencv_demo -r 25 -d /dev/video0 -s 1280x720 > log.txt 输出重定位到txt文件,api返回时间和曝光时间的差值会记录在txt,两帧相邻曝光时间差如果大于50ms或者小于30ms会直接在终端显示。每次启动运行30分钟,30分钟没出现,关闭,执行相同命令再执行30分钟,启动10次,如果不出现,那么重启机器,然后整个1,2,3步骤重新来一遍。
总结下来就是,多次重启,每次重启后,运行./launch_can.sh,并多次启动你们的api,这样的测试方式应该是比较接近我目前的测试方法。
另外还有一个疑问就是以前测的时候api返回和曝光差106ms,今天测试都是66,相机还是原来的0143,导致我补了40ms时间戳后,时间戳反而不对了。
|
|