文章目录

  • 1 实现方法
  • 2 实现代码
  • 3 运行结果
  • 参考

1 实现方法

在ROS开发系列(6)- zed深度信息与datknet的boundingbox信息融合基础上进行的修改。

  1. 创建一个自定义消息类型(后续单独写一下
  2. 更改Cmakelists文件
  3. 更改package.xml文件
  4. 在回调函数中发布topic

前3步都是为了实现自定义消息需要的,如果你没有自定义消息的话,直接使用下面的代码即可
具体实现回调函数中发布topic主要就是3个地方进行修改

  • 实例化一个publisher,ros::Publisher DistanceInfo_pub;
  • 在主函数中添加DistanceInfo_pub = n.advertise<display_test::Pub_class_distance>("/distance_info", 1);
  • 在回调函数中发布数据 DistanceInfo_pub.publish(distance_msg);

2 实现代码

#include <ros/ros.h>
#include <sensor_msgs/Image.h>#include <message_filters/subscriber.h>
#include <message_filters/time_synchronizer.h>
#include <message_filters/sync_policies/approximate_time.h>#include <boost/thread/thread.hpp>
#include <darknet_ros_msgs/BoundingBox.h>
#include <darknet_ros_msgs/BoundingBoxes.h>#include <fstream>
#include <iostream>#include "display_test/Pub_class_distance.h"
using namespace message_filters;
//class_num 默认设定为20,如果检测类别为80 将上面的define 更改下即可
#define class_num  20
#define DEBUG 0ros::Publisher DistanceInfo_pub;void depth_callback(const darknet_ros_msgs::BoundingBoxes::ConstPtr& detect_msg, const sensor_msgs::Image::ConstPtr& msg)
{display_test::Pub_class_distance distance_msg;int u[class_num] = {};int v[class_num] = {};int centerIdx[class_num] = {};int sizes = msg->data.size();float* depths = (float*)(&msg->data[0]); int num = detect_msg->bounding_boxes.size();      for (int i = 0; i < num; i++){u[i] = ((detect_msg->bounding_boxes[i].xmax - detect_msg->bounding_boxes[i].xmin)/2) + detect_msg->bounding_boxes[i].xmin; v[i] = ((detect_msg->bounding_boxes[i].ymax - detect_msg->bounding_boxes[i].ymin)/2) + detect_msg->bounding_boxes[i].ymin;centerIdx[i] = u[i] + msg->width * v[i];if (centerIdx[i] < 0) {centerIdx[i] = 0;}else if (centerIdx[i] > sizes /4){centerIdx[i] = sizes /4;}}std::cout<<"Bouding Boxes (header):" << detect_msg->header <<std::endl;std::cout<<"Bouding Boxes (image_header):" << detect_msg->image_header <<std::endl;std::cout<<"Bouding Boxes (Class):" << "\t";std::ofstream write;write.open("result-test.csv", std::ios::app);for (int i = 0; i < num; i++){std::cout << detect_msg->bounding_boxes[i].Class << "\t";     std::cout<<"Center distance :  " << depths[centerIdx[i]] << "  m" << std::endl;       std::cout<<"X distance :  " << u[i] << "  pixel" << std::endl;std::cout<<"Y distance :  " << v[i] << "  pixel" << std::endl;else  //逗号不用非得单独在一个<< <<区间中写如,可以在名称后面添加  "Y distance :  ,",因为csv文件靠的是逗号来分割,不管在哪里写 都会分开的write << detect_msg->bounding_boxes[i].Class << "," << detect_msg->bounding_boxes[i].id << "," << "Center distance :  " <<","<< depths[centerIdx[i]] <<"," << "X distance :  " << "," << u[i] <<"," << "Y distance :  ," << v[i] <<  std::endl;distance_msg.classes.push_back(detect_msg->bounding_boxes[i].Class);distance_msg.id.push_back(detect_msg->bounding_boxes[i].id);distance_msg.x_center.push_back(u[i]);distance_msg.y_center.push_back(u[i]);distance_msg.distance.push_back(depths[centerIdx[i]]);  }write.close();DistanceInfo_pub.publish(distance_msg);// 使用完之后需要将数据清掉 如果这个消息变量定义在函数体的外面的话,在每次回调函数中使用完之后需要clear下,否则数据是累加的,因为使用了vector的push_back的方法插入的数据// distance_msg.classes.clear();   // distance_msg.distance.clear();  std::cout << "\033[2J\033[1;1H";     // clear terminal}int main(int argc, char** argv)
{ros::init(argc, argv, "fuse_data");ros::NodeHandle n;message_filters::Subscriber<darknet_ros_msgs::BoundingBoxes> object_sub(n, "/darknet_ros/bounding_boxes", 1);message_filters::Subscriber<sensor_msgs::Image> depth_sub(n, "/zed/zed_node/depth/depth_registered", 1);// 将两个话题的数据进行同步typedef sync_policies::ApproximateTime<darknet_ros_msgs::BoundingBoxes, sensor_msgs::Image> syncPolicy;Synchronizer<syncPolicy> sync(syncPolicy(10), object_sub, depth_sub); // 指定一个回调函数,就可以实现两个话题数据的同步获取sync.registerCallback(boost::bind(&depth_callback, _1, _2));DistanceInfo_pub = n.advertise<display_test::Pub_class_distance>("/distance_info", 1);ros::spin();return 0;
}

3 运行结果

使用的是yolov3的权重,得到的测试结果
自定义的消息类型数据

zero@zero:~/catkin_ws$ rosmsg show display_test/Pub_class_distance
string[] classes
float32[] distance
int64[] x_center
int64[] y_center
int16[] id

数据输出结果

zero@zero:~/catkin_ws$ rostopic echo /distance_info
classes: [orange]
distance: [0.44432592391967773]
x_center: [350]
y_center: [350]
---
classes: [person, orange, diningtable]
distance: [nan, nan, 0.30334311723709106]
x_center: [1015, 348, 643]
y_center: [1015, 348, 643]
id: [0, 49, 60]
---
classes: [bed]
distance: [-inf]
x_center: [623]
y_center: [623]
id: [59]
---

参考

message_filters同步点云和图像数据

ROS自定义msg类型及使用

ROS学习(五)ROS消息传递——自定义消息

ROS开发系列(7)- 在回调函数中发布topic相关推荐

  1. ROS开发系列(6)- zed深度信息与darknet的boundingbox信息融合

    文章目录 开发环境 1 darknet_ros安装 2 zed_ros安装 3.vscode下创建zed深度信息与darknet的boundingbox信息融合的功能包 3.1 功能包的创建方法 3. ...

  2. ROS开发系列(1)- ROS基础知识

    1.常用指令 1.1 roscore 启动一个roscore就相当于是开启了一个rosmaster,也就是管理器 1.2 rosrun rosrun指令的第一个参数是功能包的名字,如果这个时候双击ta ...

  3. send函数 获得已发送数据长度_蓝牙BLE开发1--起因与回调函数

    1 起因 笔者在开发蓝牙芯片CC2540,试图取实现大量数据的BLE透传功能,在认真学习了蓝牙4.0协议标准以及TI提供的SDK说明,我总结了两个发送函数,以及两个接收函数的位置. 两个发送函数包括 ...

  4. spring返回数据使用ajax,【spring 后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中...

    问题1: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...

  5. C++回调函数中调用Python函数出现的死锁问题调试及解决

    一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...

  6. 来自Android客户端什么意思,如何通过回调函数中的Node.js来自Android客户端

    我想从插座Android客户端将数据发送到服务器的Node.js .. 在服务器端做了什么香港专业教育学院:如何通过回调函数中的Node.js来自Android客户端 socket.on('new u ...

  7. JavaScript 回调函数中的 return false 问题

    今天一个同事问了我一个问题,就是在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行,他不解的是在回调函数中已经 return false 了,但是 Aja ...

  8. 回调函数中window.open()被拦截

    在回调函数中window.open默认是会被拦截的,因为浏览器判断它不是用户自己打开的,存在安全风险,所以可以伪造一个用户点击事件来避开,代码如下: function newWindow(url, i ...

  9. python线程池回调函数_python回调函数中使用多线程的方法

    下面的demo是根据需求写的简单测试脚本 #!/usr/bin/env python # coding: utf-8 # 第一个列表为依赖组件和版本号,后面紧跟负责人名称 # 接着出现第二个以来组建列 ...

最新文章

  1. 硅谷产品实战-总结:15、如何组织有效的会议?
  2. ExtAspNet应用技巧(十九) - 日志管理
  3. 用了这个 IDE 插件,5分钟解决前后端联调!
  4. 用计算机弹奏曲子童年,5.这首曲子使我想起了我的童年.十.书面表达现在.计算机游戏非常盛行.这是一件好事还是一件坏事?请你用英语写一篇短文来陈述自己的观点.并说明理由.字数:80-120....
  5. Kotlin中正则表达式分析
  6. xampp 2016支持php7.0,xampp 装php7
  7. 单片机炫彩灯实训报告_单片机实验报告——流水灯
  8. MAC电脑配置环境变量
  9. 微信公众号连接服务器显示404,WordPress 微信机器人自动回复显示 404 错误解决办法...
  10. css设置背景颜色的亮度
  11. 2020年度十大高薪岗位出炉:程序员霸榜
  12. IT资讯精选(2022-09-11)
  13. HCIA网络课程第一周作业
  14. idea中Hierarchy出现在页面右侧
  15. wince5.0模拟器连接ActiveSync和共享网络PC分享上网及运行BS程序(模拟手持设备)
  16. SpringBoot邮件发送(QQ邮箱)
  17. Win10磁盘管理的简单卷、带区卷、跨区卷、镜像卷学习测试
  18. 关于latex 作者信息和摘要(正文)之间间距过大
  19. arduino Wemos D 1HT7038调试笔记
  20. 关于测试用例之一的白盒测试

热门文章

  1. UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xcf in position 7: ordinal not in range(128)解决
  2. request对象学习笔记
  3. (附源码)spring boot智能养老系统平台 毕业设计 170900
  4. pyppeteer初次运行需要下载Chrome无法下载的解决方案
  5. Godot特效:刀光(二)贴图制作
  6. 康耐视visionpro彩色相机如何做白平衡?
  7. 实验三 实现私聊群聊聊天室
  8. 从小时工到管家,“小马管家”想用细分标准化建立信任
  9. AnyDesk远程连接
  10. 中兴ZXV BV310_S905L3_EMMC_当贝线刷固件包