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

  • Post author:
  • Post category:其他




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

#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实体。例如:

TYPE ASCII
HTML
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


)




=








(


n













1


)


!







n













N





是通过欧拉积分





Γ

(

z

)

=

0

t

z

1

e

t

d

t
&ThinSpace;

.

\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.






Γ


(


z


)




=




















0






























t











z





1











e














t










d


t




.





你可以找到更多关于的信息

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. 注脚的解释

    ↩︎