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>(<