学习目标:
- ROS相机图像获取的C++实现
一、C++实现步骤:
- 流程概述

本次实验的主要流程如上图所示,ROS获取机器人摄像头的图像数据(ROS格式),将其转换成Opencv的数据格式后,利用Opencv中的显示函数将其显示到屏幕上。
- 实现步骤
- 进入工作空间,创建功能包
cd ~/catkin_ws/src/
catkin_create_pkg cv_pkg roscpp cv_bridge - 进入VScode创建节点文件:cv_image_node.cpp
3. 编写节点代码
- 进入工作空间,创建功能包
#include<ros/ros.h>
#include<cv_bridge/cv_bridge.h>
#inclde<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::Image msg)
{
cv_bridge::CvImagePtr cv_ptr;
try
{
cv_ptr=cv_bridge::toCvCopy(msg,sensor_msg::image_encodings::BGR8);
}
catch (cv_bridge::Excpetion& e)
{
ROS_ERROR("cv_bridge exception::%s",e.what());
return;
}
Mat imgOriginal = cv_ptr->image;
imshow("RGB",imgOriginal);
waitKey(1);//暂停1ms
}
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);//相机名称:kinect2 分辨率:qhd 畸变矫正后的彩色图像:image_color_rect 缓存一帧图像
namedWindow("RGB");
ros::spin();
}
- 添加编译规则

打开CMakeLists.txt,在末尾如下指令
1. find_package(OpenCV REQUIRED) //17行
2. include_directories(
#include
${catkin_INCLUIDE_DIRS}
${OpenCV_INCLUDE_DIRS})//117
3.最后在文件末尾添加如下指令:
- 编译节点
进入工作空间:
cd ~/catkin_ws
编译:
catkin_make
- 测试节点
打开终端输入:
roslaunch wpr_simulation wpb_balls.launch
- 会看到一个机器人前面有四个不同颜色的小球:

- 重开一个终端输入如下指令:
rosrun cv_pkg cv_image_node
在终端会弹出RGB命名的窗口即为机器人摄像头的实时画面。

- 测试画面实时性:
新开终端:
rosrun wpr_simulation ball_random_move
可以在窗口中看到移动的小球,本实验就算成功啦!
实验结果证明,RGB窗口中为实时显示的摄像头图像

关于Python实现,且听下回分解!
本次实验的内容及图片来源于B站:机器人工匠阿杰

1732

被折叠的 条评论
为什么被折叠?



