ros2学习【5】:话题以及通信实例(C++和python示例)

节点与节点之间的交流方式有四种,话题,服务,参数,动作。
服务,参数,动作是在话题的基础上组合实现的。所以话题是很基本,很重要的。
节点与节目之间话题交流的媒介是消息接口。

目录

  • 一、C++话题示例:
    • 1.发布消息
      • 1.2 工作空间+构建功能包+新建节点文件
      • 1.2:CMakeList的处理
      • 1.3:构建+测试
    • 2.订阅消息:
      • 2.1新建文件turtle_control.cpp
      • 2.2:CMakeList的处理
      • 2.3:构建+测试
  • 二、python话题示例:
    • 1.命名空间
    • 2.写入代码(发布消息)
    • 3.接收文字并朗读(订阅消息)
      • 3.1:准备工作 (安装语音包)
    • 4.编辑package.xml
    • 5.编辑setup.py
    • 6.构建+测试
  • 三.命令行关于话题的各种查询

一、C++话题示例:

1.发布消息

1.2 工作空间+构建功能包+新建节点文件

这个是依托于小海龟的示例做的演示
首先还是
新建一个工作空间chapt3_ws,
在下面新建src源码库
在源码下面构建功能包,
在功能包的src文件夹下面新建turtle_circle.cpp文件
这些都是标准动作,具体看
链接: 构建一个功能包

mkdir -p ~/chapt3_ws/src
cd ~/chapt3_ws/src
ros2 pkg create demo_cpp_topic --build-type ament_cmake --dependencies rclcpp geometry_msgs turtlesim --license Apache-2.0
touch turtle_circle.cpp

在turtle_circle.cpp中输入:
代码内容:

// 包含 ROS 2 的核心库,用于创建节点、发布者、定时器等
#include "rclcpp/rclcpp.hpp" 
// 包含 geometry_msgs::msg::Twist 消息类型,用于发布速度指令
#include "geometry_msgs/msg/twist.hpp" 
// 包含标准库中的时间相关功能,用于定时器
#include  

using namespace std::chrono_literals; // 使用 std::chrono 的字面量语法,如 1000ms

// 定义一个名为 TurtleCircleNode 的类,继承自 rclcpp::Node
class TurtleCircleNode : public rclcpp::Node
{
   
private:
		// 发布者对象,用于发布速度指令
    rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr publisher_; 
    // 定时器对象,用于周期性调用回调函数
    rclcpp::TimerBase::SharedPtr timer_; 
public:
    // 构造函数,初始化节点
    explicit TurtleCircleNode(const std::string &node_name) : Node(node_name)
    {
   
        // 创建一个发布者,发布速度指令到 "/turtle1/cmd_vel" 话题,队列大小为 10
        publisher_ = this->create_publisher<geometry_msgs::msg::Twist>("turtle1/cmd_vel", 10);

        // 创建一个定时器,每 1 秒调用一次 timer_callback 函数
        timer_ = this->create_wall_timer(1000ms, std::bind(&TurtleCircleNode::timer_callback, this));
    }

    // 定时器回调函数,用于发布速度指令
    void timer_callback()
    {
   
        // 创建一个 Twist 消息对象
        auto msg = geometry_msgs::msg::Twist();

        // 设置线速度为 1.0 m/s
        msg.linear.x = 1.0;

        // 设置角速度为 0.5 rad/s
        msg.angular.z = 0.5;

        // 发布速度指令
        publisher_->publish(msg);
    }
};

int main(int argc, char **argv)
{
   
    // 初始化 ROS 2 环境,设置日志系统、参数服务器等基础设施
    rclcpp::init(argc, argv);

    // 创建一个名为 "turtle_circle" 的 TurtleCircleNode 节点
    auto node = std::make_shared<TurtleCircleNode>("turtle_circle");

    // 运行节点的事件循环,处理定时器回调等事件
    rclcpp::spin(node);

    // 关闭 ROS 2 环境,清理资源
    rclcpp

你可能感兴趣的:(ROS2,c++,python,开发语言)