ROS信息的收发

2023-05-16

图像信息的收发

图像信息发送

#include <ros/ros.h>
#include <image_transport/image_transport.h>  //用于image的订阅和发布 ,并为压缩模式compressed提供支持
#include <opencv2/highgui/highgui.hpp> //应该要设置这里的路径
#include <cv_bridge/cv_bridge.h>//ROS图像消息和OpenCV图像之间进行转换
#include <opencv2/opencv.hpp>
#include <stdio.h>
using namespace cv;


int main(int argc ,char **argv) //argc:在命令行输入参数时,参数的数目//argv:读取所输入的参数的内容(字符串类型)
//如 D:\tc2>test myarg1 myarg2,argc的值是3,argv[0]的值是”test”,argv[1]的值是”myarg1”,argv[2]的值是”myarg2”。 
{
    ros::init(argc,argv,"pub");//argc 封装参数的个数(n+1);argv 封装参数的数组列表;name 节点名称,有唯一性的限制,禁止包含命名空间
    ros::NodeHandle nd;//声明ros句柄nd
    image_transport::ImageTransport it(nd);//用之前声明的句柄初始化it
    /**
     * advertise()函数是你告诉ROS你想在给定的话题名上发布特定类型的消息。
     * 在这个advertise()调用之后,master节点将通知任何试图订阅这个话题名称的节点,然后他们将与这个节点建立一个对等网络(peer to peer/P2P)连接。
     * advertise()括号里面的第一个参数是话题名字,第二个参数是用于发布消息的消息队列的大小。
     * <>里面指定消息的类型
     */
    image_transport::Publisher image_publisher=it.advertise("camera/image",1);

    // cv::Mat image = cv::imread("//home//wll//ROS_ws//demo_ws//pic_msg_ws//data//malatang.jpg",1);
    cv::Mat image = cv::imread("/home/wll/ROS_ws/demo_ws/pic_msg_ws/data/malatang.jpg",1);
    if (image.empty())
    {
        printf("image error!");
    }
    //   cv::imshow("",image);
    // cv::waitKey(3000);
    // //cv::imshow("",image1);
    // //cv::waitKey(3000);
    // cv::destroyWindow("");

    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    // //设置提取直方图的相关变量
    Mat hist;//用于存放直方图计算结果
    const int channels[1]={0};//通道索引
    float inRanges[2]={0,65535};
    const float*ranges[1]={inRanges};//像素灰度值范围
    const int bins[1]={65536};//直方图的维度,其实就是像素灰度值的最大值
    calcHist(&image,1,channels,Mat(),hist,1,bins,ranges);//计算图像直方图
    //准备绘制直方图
    int hist_w=512;
    int hist_h=400;
    int width=2;
    Mat histImage=Mat::zeros(hist_h,hist_w,CV_8UC3);
    for(int i=1;i<=hist.rows;++i){
        rectangle(histImage,Point(width*(i-1),hist_h-1),
                  Point(width*i-1,hist_h-cvRound(hist.at<float>(i-1)/20)),
                  Scalar(255,255,255),-1);
    }
    namedWindow("histImage",WINDOW_AUTOSIZE);
    imshow("histImage",histImage);
    imshow("gray",gray);
    waitKey(0);

    sensor_msgs::ImagePtr image_msg=cv_bridge::CvImage(std_msgs::Header(),"bgr8",image).toImageMsg();
    ros::Rate loop_rate(10);//消息发出的频率为10Hz
    while(ros::ok())
    {
        image_publisher.publish(image_msg);
        ros::spinOnce();
        loop_rate.sleep();

    }
}

图像信息接收

#include <ros/ros.h>
#include <image_transport/image_transport.h>  //用于image的订阅和发布 ,并为压缩模式compressed提供支持
#include <opencv2/highgui/highgui.hpp> //应该要设置这里的路径
#include <cv_bridge/cv_bridge.h>//ROS图像消息和OpenCV图像之间进行转换
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

extern int countt=0;

void img_subscribe(const sensor_msgs::ImageConstPtr& img)
{
    cv::Mat img_cv = cv_bridge::toCvShare(img,"mono16")->image;
    cv::imshow("imgreceive",img_cv);
    cout<<countt<<endl;
    countt++;
    cv::waitKey(3);
    std::string count_str = std::to_string(countt/10);
    if(countt|10) cv::imwrite("/home/wll/ROS_ws/demo_ws/pic_msg_ws/data/res/"+count_str+".jpg",img_cv);
}
int main(int argc,char** argv)
{
    ros::init(argc,argv,"sub");
    ros::NodeHandle nd;
    image_transport::ImageTransport img_nd(nd);
    // image_transport::Subscriber img_sub = img_nd.subscribe("/optris/image_color",10,&img_subscribe);
    image_transport::Subscriber img_sub = img_nd.subscribe("/optris/thermal_image",10,&img_subscribe);
    // ros::Rate loop_rate(1);
    // while(ros::ok)
    // {
    //     loop_rate.sleep();
    //     ros::spinOnce();
    // }

     /**
      * ros::spin() 将会进入循环, 一直调用回调函数chatterCallback(),每次调用1000个数据。
      * 当用户输入Ctrl+C或者ROS主进程关闭时退出,
      */ 
    ros::spin();//spin()后面不能有除return 0外的其他函数,否则不会调用它
    return 0;
}
pointcloud2点云信息的接收和data中数据解析
#include <ros/ros.h>  //导入ros
#include <sensor_msgs/PointCloud2.h> //导入消息格式 sensorm_msgs中的点云
#include <pcl_ros/point_cloud.h>
// #include <pcl_ros/point_cloud.h>
#include <pcl/PCLPointCloud2.h>
#include <pcl/common/transforms.h>
#include <geometry_msgs/Pose.h>
#include <message_filters/subscriber.h>
#include <message_filters/time_synchronizer.h>
#include <tf/transform_broadcaster.h>
#include <tf/message_filter.h>
#include <tf/transform_listener.h>
#include <pcl_ros/transforms.h>
#include <pcl/common/transforms.h>
#include <pcl/conversions.h>
#include <pcl_ros/impl/transforms.hpp>
#include <iostream> 
#include <iomanip> 

void pointcloud_sub(const sensor_msgs::PointCloud2::ConstPtr& clouddata) //不转换成pcl,直接使用
{
    int pointBytes = clouddata->point_step;
    int offset_x;
    int offset_y;
    int offset_z;
    int offset_int;
    int offset_ring;
    int offset_time;

    for (int f=0; f<clouddata->fields.size(); ++f)
    {
            if (clouddata->fields[f].name == "x")
            {
                // std::cout << "x" << std::endl;
                offset_x=clouddata->fields[f].offset;
            }

            if (clouddata->fields[f].name == "y")
            {
                // std::cout << "y" << std::endl;
                offset_y=clouddata->fields[f].offset;
            }

            if (clouddata->fields[f].name == "z")
            {
                // std::cout << "z" << std::endl;
                offset_z=clouddata->fields[f].offset;
            }

            if (clouddata->fields[f].name == "intensity")
            {
                // std::cout << "intensity" << std::endl;
                offset_int=clouddata->fields[f].offset;
            }

            if (clouddata->fields[f].name == "ring")
            {
                // std::cout << "ring" << std::endl;
                offset_ring=clouddata->fields[f].offset;
            }

            if (clouddata->fields[f].name == "timestamp")
            {
                // std::cout << "timestamp" << std::endl;
                offset_time=clouddata->fields[f].offset;
            }
              // std::cout << "intensity clouddata->fields[f].datatype = " << (int)clouddata->fields[f].datatype << std::endl;
    }
    // std::cout <<"offset_x:"<< offset_x <<"offset_y:"<< offset_y <<"offset_z:"<< offset_z <<"offset_int"<< offset_int <<"offset_ring:"<<offset_ring<<"offset_timestamp:"<<offset_time<< std::endl;
    // std::cout<<"now print every points time :"<<std::endl;
    for (int p = 0; p < (clouddata->width * clouddata->height); ++p)
    {
        // float time = &(clouddata->data[0]) + (pointBytes*p) + offset_time;
        // float time = clouddata->data[(pointBytes*p) + offset_time];
        // float* pTime = (float*)( &(clouddata->data[0]) + (pointBytes*p) + offset_time);
        
        double* pTime = (double*)( &(clouddata->data[(pointBytes*p) + offset_time]));//C中强制类型转换的方式
        // const double* pTime = reinterpret_cast<const double*>( &(clouddata->data[(pointBytes*p) + offset_time]));//C++中强制类型转换的方式
        double time = *pTime;
        std::cout.precision(22);
        std::cout.setf(std::ios::fixed);
        std::cout << time << std::endl;
    }

}

int main (int argc,char** argv)
{
    ros::init(argc,argv,"sub");
    ros::NodeHandle nd;
    // ros::Subscriber sub = nd.subscribe<sensor_msgs::PointCloud2>("/rslidar_points",1000,pointcloud_sub);
    ros::Subscriber sub = nd.subscribe<sensor_msgs::PointCloud2>("/velodyne_points",1000,pointcloud_sub);
    
    //进入自循环,可以尽可能快的调用消息回调函数。
    ros::spin();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS信息的收发 的相关文章

随机推荐

  • 单片机测量NTC热敏电阻温度的方法(含程序代码)

    1 NTC介绍 NTC是负温度系数热敏电阻 xff0c 随着温度的升高 xff0c NTC的阻值会呈非线性的下降 2 硬件连接 这里采用100k 3950的热敏电阻 xff0c 100k代表的是在25 下的标准阻值 xff0c 3950是热
  • 代码编写规范

    目录 1 头文件 2 函数 3 标识符命名与定义 3 1 通用命名规则 3 2 文件命名规则 3 3 变量命名规则 3 4 函数命名规则 3 5 宏的命名规则 4 变量 5 宏 常量 6 质量保证 7 程序效率 8 注释 9 排版与格式 1
  • 1.SolidWorks各模块的学习顺序

    1 草图模块 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 草图就是用线段画出零件的某一个视角的轮廓 草图是下面功能的基础 因为零件的三维建模 其实就是先画出草图 然后再通过拉伸 旋转 扫描 切除等命令生成
  • parser用法

    parser用法 导入库示例化添加参数解析参数设置属性 导入库 span class token keyword import span argparse 示例化 parser span class token operator 61 sp
  • roslaunch realsense2_camera rs_camera.launch和sudo apt-get install ros-melodic-rgbd-launch报错

    roslaunch realsense2 camera rs camera launch和roslaunch realsense2 camera rs rgbd launch报错 具体报错信息 roslaunch realsense2 ca
  • 如何设置cmake将外部文件作为资源添加到工作目录

    https stackoverflow com questions 46995733 how to set cmake in order to add txt files into working directory as resource
  • string、char*和char[]的转换

    char 和const char 的转换 const char 转 char xff08 1 xff09 为什么不能直接赋值 xff1f 这里你可以这么想 xff0c 假如const char类型字符串可以赋值给char类型 xff0c 那
  • 11-串口通信

    微控制器与外部设备的数据通信 xff0c 分为并行通信和串行通信 并行 xff1a 数据的各位同时发送或接受 xff0c 每个数据位使用一条导线 串行 xff1a 数据一位接一位地顺序发送或接收 串行通信有SPI IIC UART多种 xf
  • C语言编程规范设置 (vscode设置)

    1 打开vscode设置后 2 搜索format 3 把以下选项打上对勾 Editor Format On Paste Editor Format On Save Editor Format On Type 4 C Cpp 这一选项选择以下
  • c++ vscode 环境一键配置

    致谢 首先感谢原作者为我等初学者所做的软件 xff0c 其他文章讲了一堆的东西都没解决 xff0c 作者一个软件一步到位 xff0c 如果觉得不错的话可以star一下 xff0c 原作者视频地址 xff1a https www bilibi
  • 使用ESP8266实现单片机与上位机之间的wifi通信。

    使用ESP8266实现单片机与上位机之间的wifi通信 首先弄清楚8266的工作模式 xff0c 分别是 模式1 xff1a station xff0c 模式2 xff1a ap xff0c 模式3 xff1a station 43 ap
  • 【C 陷阱与缺陷】(四)连接

    码字不易 xff0c 对你有帮助 点赞 转发 关注 支持一下作者 微信搜公众号 xff1a 不会编程的程序圆 看更多干货 xff0c 获取第一时间更新 代码 xff0c 练习上传至 xff1a https github com hairrr
  • DIY无人机(匿名拓控者P2+F330机架)

    今年三月份的时候DIY过一个大疆NAZA 43 F450机架的无人机 xff0c 第一次体验DIY多旋翼无人机的全流程 xff0c 目的其实是为了后面更深入了解做准备 不然的话 xff0c 这钱买个大疆MINI3不香吗 xff1f DIY无
  • 在lammps模拟过程中的常用势函数设置

    文章目录 1 lj cut1 1 lj cut在in文件中使用方法1 2 lj cut在data文件中使用方法1 3 lj cut参数查询方法1 4 lj cut参数单位转换方法1 5 lj cut不同原子之间的参数1 6 lj cut参数
  • C语言十进制转16进制

    int DEC HEX uint32 t Dec int ram 61 0 整 int ray 61 0 余 uint32 t Hex 61 0x0 int i 61 0 do ram 61 Dec 16 ray 61 Dec 16 Dec
  • Windows系统下的Visual studio2019 安装 opencv4.5.1的安装

    OpenCV文档 xff1a https docs opencv org 4 5 1 examples html 安装OpenCV 4 5 1 xff0c 下载地址 https opencv org releases 下载完成后得到open
  • STM32串口初始化与使用详解(基于HAL库编程)

    STM32串口初始化与使用详解 串口简介串口初始化具体步骤串口收发理论代码执行 串口简介 USART Universal Synchronous Asynchronous Receiver Transmitter 通用同步 异步串行接收发送
  • STM32F103C8T6+OV7670(有FIFO和无FIFO版本)入门教程/使用总结(待续写,有问题可发在评论区中)

    前言 xff1a 本文为第一遍草稿 xff0c 错误会有点多 xff08 指技术性的东西会叫错等等 xff0c 欢迎纠正 xff09 xff0c 有需要可以先看看 OV7670还没有完全弄清楚 xff0c 目前已成功出图 xff08 指测试
  • 串口DMA实现接收--不定长度接收

    1 DMA接收配置 1 direction xff1a 数据传输的方向是外设 xff08 串口 xff09 gt 内存 xff08 DMA Buff xff09 xff1b 2 memory inc xff1a 内存自增 xff0c 内存指
  • ROS信息的收发

    图像信息的收发 图像信息发送 include lt ros ros h gt include lt image transport image transport h gt 用于image的订阅和发布 xff0c 并为压缩模式compres