楼主: light

关于gmsl相机的使用问题

[复制链接]

1

主题

36

帖子

117

积分

科员

Rank: 2

积分
117
 楼主| 发表于 2021-3-31 14:45:14 | 显示全部楼层
喵喵 发表于 2021-3-31 14:43
您说的正确
1.2使用mvcam.GetImagePtr接口目前我们运行超过5个小时正常
问题3是不要频繁启动相机,这个我 ...

后面换成apex2和新相机后,是否也需要满足上述条件?
回复

使用道具 举报

0

主题

26

帖子

90

积分

科员

Rank: 2

积分
90
发表于 2021-3-31 14:55:56 | 显示全部楼层
light 发表于 2021-3-31 14:45
后面换成apex2和新相机后,是否也需要满足上述条件?

是的,理论上应该是这样的,详细的情况还需要看测试结果,不同平台可能不完全一样。
回复

使用道具 举报

1

主题

36

帖子

117

积分

科员

Rank: 2

积分
117
 楼主| 发表于 2021-3-31 15:41:13 | 显示全部楼层
喵喵 发表于 2021-3-31 14:55
是的,理论上应该是这样的,详细的情况还需要看测试结果,不同平台可能不完全一样。 ...

另外还有个问题,你们5个小时测试正常,是用哪个版本测试的,是4.4-v1.3.0还是我们目前apex1的版本也就是4.4-v1.1.0+deb补丁包?明天apex2到了,我们是刷成哪个系统版本?我们尽量刷成和你们测试通过的系统版本一致。明天我们会用你们指定的api,apex2,新相机来测试时间戳问题。
回复

使用道具 举报

0

主题

26

帖子

90

积分

科员

Rank: 2

积分
90
发表于 2021-3-31 16:18:12 | 显示全部楼层
light 发表于 2021-3-31 15:41
另外还有个问题,你们5个小时测试正常,是用哪个版本测试的,是4.4-v1.3.0还是我们目前apex1的版本也就是 ...

1.我们用的是4.4-v1.1.0+deb包测试的
2.您用我们release的apex2版本测试就好版本是v4.4-v2.1.1,然后用我们指定的api测试就可以
回复

使用道具 举报

1

主题

36

帖子

117

积分

科员

Rank: 2

积分
117
 楼主| 发表于 2021-3-31 16:41:23 | 显示全部楼层
喵喵 发表于 2021-3-31 16:18
1.我们用的是4.4-v1.1.0+deb包测试的
2.您用我们release的apex2版本测试就好版本是v4.4-v2.1.1,然后用我 ...

好的,那我拿到apex2后就不用刷机了,直接开始测试。apex1上我也会在v1.1.0+deb包的情况下测一下,api我会都换成GetImagePtr。
回复

使用道具 举报

1

主题

36

帖子

117

积分

科员

Rank: 2

积分
117
 楼主| 发表于 2021-4-1 14:02:42 | 显示全部楼层
本帖最后由 light 于 2021-4-1 14:30 编辑
light 发表于 2021-3-31 15:41
另外还有个问题,你们5个小时测试正常,是用哪个版本测试的,是4.4-v1.3.0还是我们目前apex1的版本也就是 ...

您好,今天我在车上使用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时间戳后,时间戳反而不对了。

回复

使用道具 举报

0

主题

26

帖子

90

积分

科员

Rank: 2

积分
90
发表于 2021-4-1 14:35:25 | 显示全部楼层
light 发表于 2021-4-1 14:02
您好,今天我在车上使用4.4-v1.1.0+deb补丁包的状态,0143相机,把你们系统自带的例子修改为仅使用GetImag ...

1.在车上测试GPS授时也是同时开启的么
2.运行launch_can.sh脚本后,有其他程序要用can口首发数据么
3.返回和曝光差是106ms到66毫秒变化么
回复

使用道具 举报

1

主题

36

帖子

117

积分

科员

Rank: 2

积分
117
 楼主| 发表于 2021-4-1 14:42:27 | 显示全部楼层
喵喵 发表于 2021-4-1 14:35
1.在车上测试GPS授时也是同时开启的么
2.运行launch_can.sh脚本后,有其他程序要用can口首发数据么
3.返 ...

1.在车上测试GPS授时也是同时开启的么
>>>gps授时是一直开启的,车上测的时候一直用gps授时
2.运行launch_can.sh脚本后,有其他程序要用can口首发数据么
>>>只是使能can0,但是不运行can的收发程序,只启动你们相机的sample
3.返回和曝光差是106ms到66毫秒变化么
>>>对的,因为这个车测试的人比较多,不知道中间发生了什么变化,但可以肯定apex和相机都是原来的,记得以前运行你们的例子是差106左右的(忘了是在刷deb补丁前还是后),今天正常情况下只差66ms了,但是一旦发生重复时间戳问题,返回和曝光时间又会变成106,如果发生曝光时间戳运行中差80问题,返回和曝光时间戳又会重新变成66
回复

使用道具 举报

0

主题

26

帖子

90

积分

科员

Rank: 2

积分
90
发表于 2021-4-1 15:44:42 | 显示全部楼层
light 发表于 2021-4-1 14:42
1.在车上测试GPS授时也是同时开启的么
>>>gps授时是一直开启的,车上测的时候一直用gps授时
2.运行launch ...

好的我会按照你的方法复测一下,如果没有换过摄像头,曝光率和返回时间戳差值不应该变化的
回复

使用道具 举报

1

主题

36

帖子

117

积分

科员

Rank: 2

积分
117
 楼主| 发表于 2021-4-2 10:07:27 | 显示全部楼层
喵喵 发表于 2021-4-1 15:44
好的我会按照你的方法复测一下,如果没有换过摄像头,曝光率和返回时间戳差值不应该变化的 ...

我怀疑是安装完deb后导致的,因为没刷deb时候肯定是返回-曝光=100+ms,刷了之后没测过,昨天仔细看了下是差66ms。正好你们这次测试也可以关注一下,因为使用相同的镜像+deb包+0143相机,大家环境是一样的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点我注册

本版积分规则


快速回复 返回顶部 返回列表