ros avt 相机的各种问题

github上的源码     https://github.com/srv/avt_vimba_camera

调试这个包时遇到的问题。

运行节点:roslaunch avt_vimba_camera mono_camera.launch
需要在rviz中订阅:/camera/image_color

-----------------以下记录 从调试以来的各种问题----------------
1.在ros wiki 上下载的avt_vimba_camera 包编译时 出现  缺少 polled_camera 包。
    下载polled_camera 包,编译,并在avt_vimba_camera包中的cmakelist.txt中 find_package(..... 中添加 polled_camera)
2.运行roslaunch avt_vimba_camera mono_camera.launch 时出现:[vimba system] :could not start vimba system,TL not loadded.
    原因是 没有安装  translation layer。这里使用网络接口。
    首先,官网下载 完整SDK.
    然后,执行Downloads/Vimba_2_1/VimbaGigETL 目录下的  Install.sh 和 SetGenTLPath.sh 
    重启。
3.如何查看相机的IP地址?
    1.如果相机IP没有被改过,应该是默认192.168.2.100。只需要将电脑(ubuntu下)讲有线链接的IP地址配置在与相机IP同一网段,如192.168.2.101
    2.如果修改了IP,并忘记。将相机插在路由器中,查看路由中显示的相机IP即可。然后设置电脑IP。目前相机SN:02-2617A-07148 IP:192.168.1.250(20150034)
4.单目demo(roslaunch avt_vimba_camera mono_camera.launch)  存在的问题是,发布出来的图像/camera/image_color,从RVIZ中看到的图像是灰色。
    1.avt_vimba_camera这个包的程序中,并没有提供显示的相关代码。每当获取一阵图像直接进行发布。所以具体是相机设置为灰度图还是发布图像的时候的问题?
        a.查找相机设置原因
            I.通过下载的SDK TOOLS /home/miranda/Downloads/Vimba_2_1/Tools/Viewer/Bin/x86_64bit/   VimbaViewer工具,调整相机  自动曝光 彩图模式等。然后记录 彩图模式  触发模式  等参数。
            II.在avt_vimaba_camera这个包中的程序,有一个控制debug信息的变量,我们将其设置为true.这样可以查看一些相机设置信息,并与上位机Viewer中的参数对比。debug信息打印使能在 mono_camera.cpp中,实例化MonoCamera的时候,nhp_.param("show_debug_prints", show_debug_prints_, true);设置了show_debug_prints_ 为true.   roslaunc ..... 运行节点后,在terminal中可以查看打印信息。 最终对比发现 相机参数设置与viewer中完全一致,但图像仍然时灰色的。
        b.查找从获得一阵图像,至发布图像。这一段过程中的代码是否有bug.
            I.mono_camera.cpp 中的 frameCallback函数 就是 每当获得一阵图像后,会被调用的回调函数,用于将 AVT SDK 获得的图像data 转换成  sensor_msgs::image 类型。用于发布
            II.frameCallback中,api_.frameToImage(vimba_frame_ptr, img)   frameToImage函数就是 将vimba_frame_ptr 中数据转换成 img(sensor_msgs::Image img)。
            III. frameToImage 在avt_vimba_api.h 中实现。可以发现,首先获得 数据buffer      vimba_frame_ptr->GetBuffer(buffer_ptr); buffer_ptr 指针指向的区域存放了 从 相机SDK 得到的 图像数据。
            V.然后使用了sensor_msgs::fillImage()   fillImage 这个函数来讲数据填充至 要发布的图像中。按理说,这个函数 没有任何问题,但是
            fillImage(image,                                                    //要发布的图像 
                                   sensor_msgs::image_encodings::BAYER_BGGR8,               // buffer_ptr中的数据 关于BGR三个数据的存放方式
                                   height,                                                  // 图像高度
                                   width,                                                    // 图像宽度
                                   step,                                                     // 步长,这个参数有待商榷,step的值等于 图像宽度,但我认为是 width * 3.  but 不对
                                   buffer_ptr);                                              // 存放图像的数据 buffer
                尝试换过 数据存放方式,也就是sensor_msgs::image_encodings::BAYER_××× 但是仍然时灰色图像。
        C.万般无奈之下,上了一下 github  发现有人做过  avt  数据转 mat. 
            I. 首先 新建一个 avt_trans_image.cpp 实现 TransformImage2 将AVT buffer 图像转换成 mat需要的数据。写TransformImage.h 申明该函数,供其他程序调用。
            II.将 AVT SDK /home/miranda/Downloads/Vimba_2_1目录下的 VimbaImageTransform 拷贝至/home/miranda/catkin_ws_cameras/src/avt_vimba_camera  然后在 /home/miranda/catkin_ws_cameras/src/avt_vimba_camera的cmakelist中去配置  相关库 和 OPENCV 库
            III.在avt_vimba_api.h中 将 原来的 fillImage 函数 替换掉。用以下代码替换
                std::vector TransformedData;                     //存放Mat需要的图像实际数据
                     TransformImage2(vimba_frame_ptr,TransformedData,"BGR24");    // 利用增加的函数,按照BGR24转换 数据 放在TransformedData
                     cv::Mat m_ConvertImage(height, width, CV_8UC3, &*TransformedData.begin());// 定义 一个 mat 图像 并初始化宽度 高度 通道 以及 图像数据
                     //m_ConvertImage.copyTo(Image);  //debug 用
                     //imwrite("/home/miranda/images/demo.jpg",m_ConvertImage);//debug 用
                     cv_bridge::CvImage img_bridge = cv_bridge::CvImage(std_msgs::Header(), "bgr8", m_ConvertImage);// 用cv_bridge 将mat数据 抓换成 CvImage
                     img_bridge.toImageMsg(image);// 将 CvImage 转换成 sensor_msgs::image.

                        V.可以发现,从RVIZ中 发现图像变成彩色的。因此 主要问题肯定在  原来的代码使用的 fillImage 的 问题。可能有些转换 没有做就直接使用了 fillImage。

******************************************************更换相机要更改三个地方:launch文件里的 ip guid camera_info_url,后面两个要改成相机机身上的sn号码************************************************

------------------OVER---------------------------------

你可能感兴趣的:(ros)