【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
实际ros开发的时候,现场有很多特征都可以用来进行采集和标定。比如说地面,对于外资企业或者管理比较规范的企业来说,一般robot行驶区域都是非常有特点的。这个时候如果利用lidar的slam不好做,可以使用camera图像去补充进行相关的slam操作。二维码导航就是这么来的。当然,要做到这一点,光源控制必须得到很好的解决才行。
当然,上面说的都是slam,事实上camera还可以用来进行识别、定位、判断、检测,发挥用途的地方很多。它可以帮我们实现robot其他传感器所不具备的功能,建议可以好好掌握。今天我们就先学习下,应该怎么用ros捕捉到camera图像。
处理图片基本都是基于opencv进行的,相关库的安装在前期执行./install_for_noetic.sh的时候,已经做好了。
1、编写cv_image_node.cpp文件
#include <ros/ros.h>
#include <cv_bridge/cv_bridge.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
void Cam_RGB_Callback(const sensor_msgs::ImageConstPtr& msg)
{
cv_bridge::CvImagePtr cv_ptr;
try
{
cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
}
catch(cv_bridge::Exception &e)
{
ROS_ERROR("cv_bridge exception:%s", e.what());
return;
}
Mat imgOriginal = cv_ptr->image;
imshow("RGB", imgOriginal);
waitKey(1);
}
int main(int argc, char* argv[])
{
ros::init(argc, argv, "cv_image_node");
ros::NodeHandle nh;
ros::Subscriber rgb_sub = nh.subscribe("/kinect2/qhd/image_color_rect", 1, Cam_RGB_Callback);
namedWindow("RGB");
ros::spin();
}
代码部分还是比较简单的,最主要的内容就是ng订阅了一个/kinect2/qhd/image_color_rect的话题,我们可以对这个话题注册一个Cam_RGB_Callback的回调函数。在这个函数里面,拿到imageOriginal的指针之后,就可以显示出图像来。
2、更新CMakeLists.txt
需要编译cv_image_node.cpp文件,有三个地方需要修改一下。第一,确保CMake查找到cv_bridge、OpenCV,
## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS message_generation roscpp rospy std_msgs genmsg tf cv_bridge)
find_package(OpenCV REQUIRED)
第二,在include_directories里面,把OpenCV的头文件目录加进去,
include_directories(include ${OpenCV_INCLUDE_DIRS})
第三,直接把cv_image_node.cpp的编译方法加进去,
add_executable(cv_image_node src/cv_image_node.cpp)
target_link_libraries(cv_image_node ${catkin_LIBRARIES} ${OpenCV_LIBS})
add_dependencies(cv_image_node beginner_tutorials_generate_messages_cpp)
3、catkin_make编译
编译的方法也很简单,就是在catkin_ws的顶层,输入catkin_make即可。
4、调试和验证
所有的环境都准备好了,下面就可以开始测试和验证了。首先,打开仿真环境,这一步可以通过rosluanch wpr_simulation wpb_balls.launch来解决。启动之后,如果不出意外的话,我们可以看到这样的画面,
接下来,就可以继续输入rosrun beginner_tutorials cv_image_node。回车之后,就会有一个窗口弹出来,如果可以看到这样的图像,那么就代表camera已经ok了,
5、后续的开发和处理
拿到camera的图像只是第一步,如果要把这个图像利用起来,后续还要对这个图像继续进行数字处理。常用的方法一般有滤波、二值化、边缘检测、腐蚀、膨胀等等,这些基础操作都结束之后,就可以通过轮廓、长宽比或者面积从图像中获取有价值的信息,为后续执行robot的任务打下一个坚实的基础。