首页 > 其他分享 >ROS2-发布矩阵类消息

ROS2-发布矩阵类消息

时间:2023-04-08 19:22:45浏览次数:39  
标签:std dim layout msgs rclcpp 矩阵 发布 message ROS2

这个困扰我两个周的难题终于在翻阅官方文档之后得到了解答,简而言之就是对于相关头文件的理解(其实是我懒得自定义头文件),下面解释一下相关代码。


发布者代码

#include <chrono>
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/float64_multi_array.hpp"

int main(int argc, char **argv)
{
  // 初始化ROS2节点
  rclcpp::init(argc, argv);
  auto node = std::make_shared<rclcpp::Node>("matrix_publisher");

  // 创建发布者
  auto publisher = node->create_publisher<std_msgs::msg::Float64MultiArray>("matrix_topic", 10);

  // 定义矩阵数据
  std::vector<double> data {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
  auto message = std::make_shared<std_msgs::msg::Float64MultiArray>();
  message->layout.dim.push_back(std_msgs::msg::MultiArrayDimension());
  message->layout.dim[0].size = 2;
  message->layout.dim[0].stride = 3;
  message->layout.dim[0].label = "rows";
  message->layout.dim.push_back(std_msgs::msg::MultiArrayDimension());
  message->layout.dim[1].size = 3;
  message->layout.dim[1].stride = 1;
  message->layout.dim[1].label = "cols";
  message->data = data;

  // 发布矩阵数据
  rclcpp::WallRate loop_rate(10);
  while (rclcpp::ok())
  {
    publisher->publish(*message);
    rclcpp::spin_some(node);
    loop_rate.sleep();
  }

  return 0;
}

订阅者代码

#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/float64_multi_array.hpp"

void callback(const std_msgs::msg::Float64MultiArray::SharedPtr message)
{
  // 获取矩阵数据
  std::vector<double> data = message->data;

  // 打印矩阵数据
  std::cout << "Received matrix:" << std::endl;
  for (size_t i = 0; i < message->layout.dim[0].size; i++)
  {
    for (size_t j = 0; j < message->layout.dim[1].size; j++)
    {
      std::cout << data[i * message->layout.dim[1].size + j] << " ";
    }
    std::cout << std::endl;
  }
}

int main(int argc, char **argv)
{
  // 初始化ROS2节点
  rclcpp::init(argc, argv);
  auto node = std::make_shared<rclcpp::Node>("matrix_subscriber");

  // 创建订阅者
  auto subscriber = node->create_subscription<std_msgs::msg::Float64MultiArray>(
    "matrix_topic", 10, callback);

  // 进入ROS2事件循环
  rclcpp::spin(node);

  return 0;
}

CmakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(example_topic_rclcpp)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # uncomment the line when a copyright and license is not present in all source files
  #set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # uncomment the line when this package is not in a git repo
  #set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

add_executable(topic_publisher_01 src/topic_publisher_01.cpp)
add_executable(topic_subscribe_01 src/topic_subscribe_01.cpp)
ament_target_dependencies(topic_publisher_01 rclcpp std_msgs)
ament_target_dependencies(topic_subscribe_01 rclcpp std_msgs)

install(TARGETS
  topic_publisher_01
  DESTINATION lib/${PROJECT_NAME}
)
install(TARGETS
topic_subscribe_01
  DESTINATION lib/${PROJECT_NAME}
)

ament_package()

package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>example_topic_rclcpp</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="[email protected]">moon</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>
  
  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>


代码解释

ROS2发布者订阅者的基本框架大家都理解,这里只说一下特殊的点,这里用面向过程的思想编写,希望大家见谅一下。

  std::vector<double> data {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
  auto message = std::make_shared<std_msgs::msg::Float64MultiArray>();
  message->layout.dim.push_back(std_msgs::msg::MultiArrayDimension());
  message->layout.dim[0].size = 2;
  message->layout.dim[0].stride = 3;
  message->layout.dim[0].label = "rows";
  message->layout.dim.push_back(std_msgs::msg::MultiArrayDimension());
  message->layout.dim[1].size = 3;
  message->layout.dim[1].stride = 1;
  message->layout.dim[1].label = "cols";
  message->data = data;

std_msgs::msg::Float64MultiArray消息类型其实是一种多维数组类型,上述代码简单来说就是创建一个2*3的矩阵类型进行发布
订阅者不详细说了,大家都可以理解。

标签:std,dim,layout,msgs,rclcpp,矩阵,发布,message,ROS2
From: https://www.cnblogs.com/nobodyx/p/17299055.html

相关文章

  • macOS Ventura 13.3.1 (22E261) 正式版发布,ISO、IPSW、PKG 下载
    本站下载的macOSVentura软件包,既可以拖拽到Applications(应用程序)下直接安装,也可以制作启动U盘安装,或者在虚拟机中启动安装。另外也支持在Windows和Linux创建可引导介质。请访问原文链接:https://sysin.org/blog/macOS-Ventura/,查看最新版。原创作品,转载请保留出处。ma......
  • OpenCV获取相机旋转矩阵和平移矩阵
    想要求解旋转矩阵和平移矩阵,先要了解相机内参矩阵和畸变矩阵如何获取,不了解的可以先移步https://www.cnblogs.com/nobodyx/p/17297074.html先上代码#include<iostream>#include<vector>#include<glob.h>#include<opencv2/opencv.hpp>intmain(){//使用glob库......
  • Hugging News #0407: Google AI 的 Pix2Struct 来啦、开发者资源页面发布
    每一周,我们的同事都会向社区的成员们发布一些关于HuggingFace相关的更新,包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等,我们将其称之为「HuggingNews」,本期HuggingNews有哪些有趣的消息,快来看看吧!社区活动ControlNet微调冲刺活动为了帮......
  • OpenCV获取相机的内参矩阵和畸变矩阵
    实验室任务要截止了,赶紧来上传一下学习成果,终极目的是获取视频每帧的旋转矩阵和平移矩阵,但没办法一口吃个胖子,所以先写一下相机内参矩阵和畸变矩阵的求解办法先上代码#include<opencv2/opencv.hpp>#include<iostream>#include<vector>usingnamespacecv;usingnamespace......
  • 使用Docker发布普通web项目(非springboot项目)
    公司的项目比较旧,还是普通的web格式,只能打个war包放在tomcat中运行,现在要上docker发布,在此做下记录DockerDesktop开发机是win10,想要打包镜像需要安装DockerDesktop,安装前需要在bios里面开启虚拟化支持。然后按照官方安装教程一步一步安装。Dockerfile然后在项目根目录编写doc......
  • 用 Go 剑指 Offer 29. 顺时针打印矩阵
    给你一个m行n列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例1:  输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:  输入:matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7] 提示:m......
  • [ Spring事件发布与监听 ]
    Spring事件监听与发布主要有以下部分:事件(被监听的玩意),事件发布(把这个事件发布出去),事件监听(用来监听事件,并做行动)项目中,因为事件类型不同,可以先定义事件的接口:Ievent:publicinterfaceIEvent{}对于具体的事件,可以实现IEvent接口:(ep:后端需要判断一个对象中是否......
  • 版本 .NET Framework版本 Visual Studio版本 发布日期 特性
    版本.NETFramework版本VisualStudio版本发布日期特性C#1.0.NETFramework1.0VisualStudio.NET20022002.1委托事件C#1.1.NETFramework1.1VisualStudio.NET20032003.4APM C#2.0.NETFramework2.0VisualStudio2005(开始命名为VisualStudio)2005.......
  • Chrome 发布首个 WebGPU 实现
    Chrome团队宣布,经过多年的开发,他们终于发布了WebGPU实现,目前已在Chrome113Beta中默认启用。WebGPU可用于在Web上进行高性能3D图形和数据并行计算。WebGPU初始版本可以在ChromeOS、macOS和Windows上使用,对其他平台的支持将于今年晚些时候推出。WebGPU是由......
  • 助力信创国产化,Solon v2.2.9 发布
    Solon是一个高效的Java应用开发框架:更快、更小、更简单。它不是Spring、没有使用Servlet、JavaEE接口,是一个有自己接口标准的开放生态。可以为应用软件国产化提供支持,助力信创建设。150多个生态插件,覆盖各种不同的应用开发场景:相对于SpringBoot和SpringCloud的......