当前位置: 首页 > news >正文

ros(一)使用消息传递图像+launch启动文件

1)第一步:构建工作空间

mkdir -p test_ws/src
cd test_ws/src
catkin_create_pkg  test_launch  roscpp cv_bridge image_transport sensor_msgs
cd test_ws
catkin_make

这时候发现 test_ws工作空间下有了 build和 devel文件夹,build主要存放的就是编译过程文件,devel主要存放的就是动态库、静态库和可执行文件。

2)编写程序

在 test_launch/src文件夹下,新建一个img_pub.cpp和一个 img_sub.cpp文件

img_pub.cpp文件内容如下:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>int main(int argc, char** argv)
{ros::init(argc, argv, "publisher_img");ros::NodeHandle nh;image_transport::ImageTransport it(nh);image_transport::Publisher pub = it.advertise("image", 1);cv::Mat image = cv::imread("/home/slamugv/111.jpg");ROS_INFO("Image is Empty %d  %d!",image.cols, image.rows);if (image.empty()){ROS_INFO("Image is Empty!");}sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();ros::Rate loop_rate(5);while(nh.ok()){ROS_INFO("Image is Empty %d  %d!",image.cols, image.rows);pub.publish(msg);ros::spinOnce();loop_rate.sleep();}
}

img_sub.cpp文件内容如下:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{try{cv::Mat image = cv_bridge::toCvCopy(msg,"bgr8")->image;ROS_INFO("Image is Empty %d  %d!",image.cols, image.rows);cv::imshow("view", image);cv::waitKey(5);}catch(const cv_bridge::Exception& e){ROS_ERROR("cloud not convert from %s to bgr8", msg->encoding.c_str());std::cerr << e.what() << '\n';}}int main(int argc, char** argv)
{ros::init(argc, argv, "sublisher_img");ros::NodeHandle nh;cv::namedWindow("view");// cv::startWindowThread();image_transport::ImageTransport it(nh);image_transport::Subscriber sub = it.subscribe("image", 1, imageCallback);ros::spin();// cv::destroyWindow();// cv::destroyWindow("view");// cv::Mat image = cv::imread("/home/ghigher/workplace/pointcloud_ws/src/pub_sub_image/images/ros_logo.png");// if (image.empty())// {//     ROS_INFO("Image is Empty!");// }// sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();// ros::Rate loop_rate(5);// while(nh.ok())// {//     pub.publish(msg);//     ros::spinOnce();//     loop_rate.sleep();// }
}

写完程序后,还需要修改一下Cmakelist.txt,具体的在

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES test_launch
#  CATKIN_DEPENDS cv_bridge image_transport roscpp sensor_msgs
#  DEPENDS system_lib
)###########
## Build ##
###########

后面加上

add_executable(img_pub src/img_pub.cpp)
target_link_libraries(img_pub ${catkin_LIBRARIES} ${Opencv_LIBS}) add_executable(img_sub src/img_sub.cpp)
target_link_libraries(img_sub ${catkin_LIBRARIES} ${Opencv_LIBS}) 

然后使用catkin_make编译一下,看看书在devel/lib文件夹下是否生成了test_launch/img_pub和test_launch/img_sub可执行文件。

3)尝试先用rosrun pkg node_name先把程序跑起来,然后再说其他的。

4)编写launch文件

首先在test_launch文件夹下新建一个launch文件夹,然后使用touch test_launch.launch命令,新建一个launch文件。

<launch><node pkg = "test_launch" type = "img_sub" name = "img_sub" output = "screen"/><node pkg = "test_launch" type = "img_pub" name = "img_pub" output = "screen"/></launch>

然后使用

catkin_make
source ./devel/setup.bash
roslaunch test_launch test_launch.launch

就可以把程序给启动起来。

相关文章:

  • 手机网站建设是什么百度官网电话
  • 手机免费网站制作福建seo排名
  • 王璞网站开发实战万词霸屏百度推广seo
  • 网站集约化建设意见和建议重庆网站优化公司
  • 云服务器搭建网站教程企业网络
  • 如何通审查元素做网站实时新闻最新消息
  • Linux平台Oracle开机自启动设置
  • 【innovus基础】- 对某根线单独route
  • 基于深度学习的双色球智能预测系统:从原理到实现
  • Java并发编程中高效缓存设计的哲学
  • vscode 插件
  • AngularJS 待办事项 App
  • 【格与代数系统】示例
  • 关于 pdd:anti_content参数分析与逆向
  • leetcode83.删除排序链表中的重复元素
  • Java SE - 图书管理系统模拟实现
  • 数据标注师学习内容
  • leetcode82.删除排序链表中的重复元素II
  • 【格与代数系统】示例2
  • 【机器学习深度学习】偏置项(Bias)概念
  • 嵌入式开发环境搭建全流程(Win/Linux)
  • ubuntu使用 Conda 安装 pyseer详细教程
  • 292. Nim 游戏
  • (nice!!!)(LeetCode 每日一题) 2081. k 镜像数字的和 (枚举)
  • 华为OD机试_2025 B卷_矩形相交的面积(Python,100分)(附详细解题思路)
  • Python csv 模块