ROS系统下面订阅ZED摄像头的图像以及深度

在这里先简单的展示一段代码

#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <dirent.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <ros/ros.h>
#include <sensor_msgs/Image.h>
#include <cv_bridge/cv_bridge.h>
#include <image_transport/image_transport.h>
#include <sensor_msgs/image_encodings.h>
#include <opencv2/imgproc/imgproc.hpp>

void depthCallback(const sensor_msgs::Image::ConstPtr& msg)
{
    // Get a pointer to the depth values casting the data
    // pointer to floating point
    float* depths = (float*)(&msg->data[0]);
    // Image coordinates of the center pixel
    int u = msg->width / 2;
    int v = msg->height / 2;
    // Linear index of the center pixel
    int centerIdx = u + msg->width * v;
    // Output the measure
    ROS_INFO("Center distance : %g m", depths[centerIdx]);
}
static const std::string OPENCV_WINDOW = "Image window";
class ImageConverter
{
  ros::NodeHandle nh_;
  image_transport::ImageTransport it_;
  image_transport::Subscriber image_sub_;
  image_transport::Publisher image_pub_; public:
  ImageConverter()
    : it_(nh_)
  {     // Subscrive to input video feed and publish output video feed
    image_sub_ = it_.subscribe("/zed/right/image_raw_color", 1,
                               &ImageConverter::imageCb, this);
    image_pub_ = it_.advertise("/image_converter/output_video", 1);
    cv::namedWindow(OPENCV_WINDOW);
  }
  ~ImageConverter()
  {
    cv::destroyWindow(OPENCV_WINDOW);
  }
  void imageCb(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;
    }
    // Draw an example circle on the video stream
    if (cv_ptr->image.rows > 60 && cv_ptr->image.cols > 60)
      cv::circle(cv_ptr->image, cv::Point(50, 50), 10, CV_RGB(255,0,0));
    // Update GUI Window
    cv::imshow(OPENCV_WINDOW, cv_ptr->image);
    cv::waitKey(3);
    // Output modified video stream
    image_pub_.publish(cv_ptr->toImageMsg());
  }
};
//blog.csdn.net/qq_29985391/article/details/80247724
int main(int argc, char** argv) {
    ros::init(argc, argv, "zed_video_subscriber");
    /*
     * NodeHandle is the main access point to communications with the ROS system.
     * The first NodeHandle constructed will fully initialize this node, and the last
     * NodeHandle destructed will close down the node.
     */
    ros::NodeHandle n;
    ros::Subscriber subDepth    = n.subscribe("/zed/depth/depth_registered", 10, depthCallback);
    //--只需要声明一个对象即可------------------
    ImageConverter ic;//定义一个对象
    //----------------------------------------
    ros::spin();
    return 0;
}

其中CMakeList.txt书写如下:

cmake_minimum_required(VERSION 2.8.3)
project(zed_depth_sub_tutorial)

# if CMAKE_BUILD_TYPE is not specified, take 'Release' as default
IF(NOT CMAKE_BUILD_TYPE)
    SET(CMAKE_BUILD_TYPE Release)
ENDIF(NOT CMAKE_BUILD_TYPE)

## Find catkin and any catkin packages

find_package(catkin REQUIRED COMPONENTS
  cv_bridge
  image_transport
  roscpp
  sensor_msgs
  std_msgs
  geometry_msgs
)
find_package(OpenCV REQUIRED)

if(NOT WIN32)
ADD_DEFINITIONS("-std=c++0x -O3")
endif(NOT WIN32)


## Declare a catkin package

catkin_package()

include_directories(include ${catkin_INCLUDE_DIRS})
include_directories ( ${OpenCV_INCLUDE_DIRS} )

## Build 
add_executable(zed_depth_sub src/zed_depth_sub_tutorial.cpp)
##target_link_libraries(zed_depth_sub ${catkin_LIBRARIES})
target_link_libraries( zed_depth_sub ${OpenCV_LIBRARIES} ${OpenCV_LIBS} ${catkin_LIBRARIES})

最后配置xml文件

<package>
  <name>zed_depth_sub_tutorial</name>
  <version>2.7.0</version>
  <description>
    This package is a tutorial showing how to subscribe to ZED depth streams
  </description>

  <maintainer email="support@stereolabs.com">STEREOLABS</maintainer>
  <license>MIT</license>

  <url type="website">http://stereolabs.com/</url>
  <url type="repository">https://github.com/stereolabs/zed-ros-wrapper</url>
  <url type="bugtracker">https://github.com/stereolabs/zed-ros-wrapper/issues</url>

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>cv_bridge</build_depend>
  <build_depend>image_transport</build_depend>
  <build_depend>opencv2</build_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>sensor_msgs</build_depend>
  <build_depend>std_msgs</build_depend>


  <run_depend>cv_bridge</run_depend>
  <run_depend>image_transport</run_depend>
  <run_depend>opencv2</run_depend>
  <run_depend>roscpp</run_depend>
  <run_depend>sensor_msgs</run_depend>
  <run_depend>std_msgs</run_depend>

</package>

报错了,怎是编译不了,这时如果大家用Qt进行编译发现报错,但是不指明在哪里报错,这时候可以到工作空间下,(我的工作空间是open_cv_ws),进行$catkin_make,这时候上面显示 format="2"应该去掉,去掉之后重新编译一下就可以了。

总结

本次小实验可以学到:

  1. 知道话题/zed/right/image_raw_color可订阅ZED颜色图像,写在一个类里面,主程序直接定义一个对象就可以了
  2. 知道怎么去添加依赖,在CMakeList.txt中添加find_package(catkin REQUIRED COMPONENTS cv_bridge image_transport roscpp sensor_msgs std_msgs geometry_msgs ) find_package(OpenCV REQUIRED)

接下来就大功告成了

参考文献:
(1)https://blog.csdn.net/qq_29985391/article/details/80247724
(2)相银初.OpenCV计算机视觉编程攻略

[ INFO] [1565176770.174158543]: Center distance : 1.25429 m
[ INFO] [1565176770.206849255]: Center distance : 1.25619 m
[ INFO] [1565176770.240136018]: Center distance : 1.25075 m
[ INFO] [1565176770.274275839]: Center distance : 1.25775 m
[ INFO] [1565176770.306532261]: Center distance : 1.25309 m
[ INFO] [1565176770.339874425]: Center distance : 1.25072 m
[ INFO] [1565176770.372813122]: Center distance : 1.24709 m
[ INFO] [1565176770.404490328]: Center distance : 1.24643 m
[ INFO] [1565176770.439586103]: Center distance : 1.25006 m
[ INFO] [1565176770.473377041]: Center distance : 1.24913 m
[ INFO] [1565176770.506936335]: Center distance : 1.24393 m
[ INFO] [1565176770.540292584]: Center distance : 1.24268 m
[ INFO] [1565176770.573506392]: Center distance : 1.24504 m
[ INFO] [1565176770.606003272]: Center distance : 1.24484 m
[ INFO] [1565176770.639587230]: Center distance : 1.24653 m

/home/wang/open_cv_ws/ydyd.png/home/wang/open_cv_ws/ydyd.png/home/wang/open_cv_ws/ydyd.png/home/wang/open_cv_ws/ydyd.png在这里插入图片描述Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 关于ROS的发布和订阅话题,它是ROS中常用的一种通信方式。发布者发布消息到话题中,而订阅者则可以从话题中获取消息。通过话题的发布和订阅机制,节点之间可以进行高效的数据传输和信息共享。具体实现可以使用ROS提供的rospy库来完成。 ### 回答2: ROS是机器人操作系统(Robot Operating System)的简称,是一个用于编写机器人软件的开源框架。在ROS中,发布和订阅话题是非常常见的通信方式。 发布者(Publisher)和订阅者(Subscriber)是ROS中的两种角色。发布者负责向话题中发布消息,而订阅者则负责从话题中接收消息。 在ROS中,发布和订阅话题C可以通过以下步骤进行: 1. 创建一个话题C。 在ROS中,可以通过编写一个发布器节点来创建一个话题C。发布器节点负责向话题C中发布消息。 2. 编写一个发布器节点。 发布器节点可以使用ROS提供的编程语言(如C++或Python)来编写。在节点中,需要进行ROS初始化,并创建一个发布者对象来发布消息到话题C。 3. 编写一个订阅器节点。 订阅器节点也需要使用ROS提供的编程语言来编写。在节点中,也需要进行ROS初始化,并创建一个订阅者对象来接收话题C中的消息。 4. 运行发布器节点和订阅器节点。 在终端中,可以使用rosrun命令来分别运行发布器节点和订阅器节点。 5. 订阅器节点接收发布器节点发布的消息。 当发布器节点向话题C中发布消息时,订阅器节点将能够接收到该消息,并对消息进行处理。 通过发布和订阅话题C,可以实现不同节点之间的信息交流。发布者节点可以发布各种类型的消息到话题C中,而订阅者节点可以根据自身的需要从话题C中接收并处理消息。这种基于话题的通信方式使得ROS中不同节点之间能够有效地协作和共享信息,从而更好地完成机器人的各种任务。 ### 回答3: ROS(Robot Operating System)是一个用于构建机器人应用程序的开源框架。在ROS中,发布者和订阅者是两个常用的概念,用于实现不同节点的通信。 在ROS中,发布者用于发布一个话题(Topic),而订阅者则用于订阅该话题。话题是ROS中的一种消息机制,通过话题可以在不同节点之间传递数据。 具体到题目中的情况,如果要使用ROS发布和订阅话题c,首先需要创建一个发布者节点和一个订阅者节点,并且定义话题c的消息类型。 对于发布者节点,它会发送某个类型的消息到话题c。代码中需要指定发布者节点要发布的消息类型,以及话题的名称c。然后,在发布者节点中通过调用ROS提供的API函数,将消息发送到话题c。 对于订阅者节点,它会订阅话题c,接收发布者节点发送的消息。同样,代码中需要指定订阅者节点要订阅消息类型,以及话题的名称c。然后,在订阅者节点中通过调用ROS提供的API函数,接收话题c中的消息。 总的来说,ROS发布和订阅话题c的过程就是发布者节点将消息发送到话题c,而订阅者节点通过订阅话题c接收消息。通过这种方式,不同节点之间可以灵活地进行消息传递和通信,从而实现更复杂的机器人应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值