Bootstrap

ROS2 学习笔记14:编写简单的发布者和订阅者 (C++)

Background 背景

节点是通过 ROS 图进行通信的可执行进程。在本教程中,节点将通过主题以字符串消息的形式互相传递信息。这里使用的示例是一个简单的 "talker " "listener "系统;一个节点发布数据,另一个节点订阅主题,以便接收数据。

这些示例中使用的代码可在此处找到https://github.com/ros2/examples/tree/iron/rclcpp/topics

Prerequisites 前提

在前面的教程中,您学习了如何创建工作区和创建软件包

Tasks 任务

1 Create a package

新开一个终端,source一下ros2环境,保证ros2指令都没问题

进入前面课程创建的ros2_ws(工作空间)目录

进入dev_ws/src目录,运行包创建指令:

ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_pubsub

终端返回信息表明,你的包和相关必要的文件和文件夹都创建完成

进入dev_ws/src/cpp_pubsub/src目录,这是cmake包的目录,放着包含可执行文件的源码

2 Write the publisher node

输入以下命令下载 "talker "代码示例

wget -O publisher_member_function.cpp https://raw.githubusercontent.com/ros2/examples/iron/rclcpp/topics/minimal_publisher/member_function.cpp

现在将出现一个名为publisher_member_function.cpp的新文件。使用文本编辑器打开该文件。

#include <chrono>
#include <functional>
#include <memory>
#include <string>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

using namespace std::chrono_literals;

/* This example creates a subclass of Node and uses std::bind() to register a
* member function as a callback from the timer. */

class MinimalPublisher : public rclcpp::Node
{
   
  public:
    MinimalPublisher()
    : Node("minimal_publisher"), count_(0)
    {
   
      publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
      timer_ = this->create_wall_timer(
      500ms, std::bind(&MinimalPublisher::timer_callback, this));
    }

  private:
    void timer_callback()
    {
   
      auto message = std_msgs::msg::String();
      message.data = "Hello, world! " + std::to_string(count_++);
      RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
      publisher_->publish(message);
    }
    rclcpp::TimerBase::SharedPtr timer_;
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
    size_t count_;
};

int main(int argc, char * argv[])
{
   
  rclcpp::init(argc, argv);
  rclcpp::spin(std::make_shared<MinimalPublisher>(<

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;