利用ROS2实现话题的发布与订阅


1.创建节点

home下新建一个ros2的文件夹

mkdir ros2

依次输入下面的命令,创建mytest_ws工作空间、subscribe_and_publish功能包和publisher.cpp

cd ros2
mkdir -p mytest_ws/src
cd mytest_ws/src
ros2 pkg create subscribe_and_publish --build-type ament_cmake --dependencies rclcpp
touch subscribe_and_publish/src/publisher.cpp

2.编写发布与订阅节点

2.1 发布节点

publisher.cpp

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

class Publisher : public rclcpp::Node
{
public:
    // 构造函数,有一个参数为节点名称
    Publisher(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());
        // 创建发布者
        subscribe_and_publish_publisher_ = this->create_publisher<std_msgs::msg::String>("subscribe_and_publish", 10);
        // 创建定时器,500ms为周期,定时发布
        timer_ = this->create_wall_timer(std::chrono::milliseconds(500), std::bind(&Publisher::timer_callback, this));
    }

private:
    void timer_callback()
    {
        // 创建消息
        std_msgs::msg::String message;
        message.data = "1234";
        // 日志打印
        RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
        // 发布消息
        subscribe_and_publish_publisher_->publish(message);
    }
    // 声名定时器指针
    rclcpp::TimerBase::SharedPtr timer_;
    // 声明话题发布者指针
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr subscribe_and_publish_publisher_;
};

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    /*产生一个的节点*/
    auto node = std::make_shared<Publisher>("publisher");
    /* 运行节点,并检测退出信号*/
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

2.2 订阅节点

subscribe1.cpp

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

class Subscribe : public rclcpp::Node
{
public:
    Subscribe(std::string name) : Node(name)
    {
        RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());
          // 创建一个订阅者订阅话题
         subscribe_and_publish_subscribe_ = this->create_subscription<std_msgs::msg::String>("subscribe_and_publish", 10, std::bind(&Subscribe::command_callback, this, std::placeholders::_1));
    }

private:
     // 声明一个订阅者
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscribe_and_publish_subscribe_;
     // 收到话题数据的回调函数
    void command_callback(const std_msgs::msg::String::SharedPtr msg)
    {
        // double speed = 0.0f;
        // if(msg->data == "1234")
        // {
        //     speed = 0.2f;
        // }
        // RCLCPP_INFO(this->get_logger(), "收到[%s]指令,发送速度 %f", msg->data.c_str(),speed);
        RCLCPP_INFO(this->get_logger(), "收到[%s]指令", msg->data.c_str());
    };
};

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    /*产生一个的节点*/
    auto node = std::make_shared<Subscribe>("subscribe1");
    /* 运行节点,并检测退出信号*/
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

2.3 修改CmakeLists.txtpackage.xml

打开CmakeLists.txt文件,在中间添加下面两行

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

在这里插入图片描述

在最后面添加下面内容

add_executable(publisher src/publisher.cpp)
ament_target_dependencies(publisher rclcpp std_msgs)
add_executable(subscribe1 src/subscribe1.cpp)
ament_target_dependencies(subscribe1 rclcpp std_msgs

install(TARGETS
  publisher
  subscribe1
  DESTINATION lib/${PROJECT_NAME}
)

打开package.xml文件,在中间添加

<depend>rclcpp</depend>
<depend>std_msgs</depend>

在这里插入图片描述


3.话题发布与订阅运行测试

3.1重开一个终端,启动订阅节点

cd ros2/mytest_ws
source install/setup.bash
ros2 run subscribe_and_publish subscribe1

3.2再开一个终端,启动发布节点

cd ros2/mytest_ws
source install/setup.bash
ros2 run subscribe_and_publish publisher1

4.运行结果

在这里插入图片描述

在这里插入图片描述

根据提供的引用内容,我们可以看到在引用\[2\]中提供了一个JavaScript代码片段,该代码片段用于在客户端订阅ROS速度数据。具体来说,它使用WebSocketROS通信,并在连接建立后发送一个包含速度数据的JSON字符串。以下是一个类似的JavaScript代码示例,用于订阅ROS速度数据: ```javascript function WebSocketTest() { if ("WebSocket" in window) { // 打开一个 web socket var ws = new WebSocket("ws://xxx:5678"); // 连接建立后的回调函数 ws.onopen = function() { // Web Socket 已连接上,使用 send() 方法发送数据 var data = '{"url":"start","id":"1","type":2}'; ws.send(data.toString()); alert("正在发送:"); }; // 接收到服务器消息后的回调函数 ws.onmessage = function (evt) { var received_msg = evt.data; if (received_msg.indexOf("sorry") == -1) { alert("收到消息:"+received_msg); } }; // 连接关闭后的回调函数 ws.onclose = function() { // 关闭 websocket alert("连接已关闭..."); }; } else { // 浏览器不支持 WebSocket alert("您的浏览器不支持 WebSocket!"); } } // 在页面加载完成后调用WebSocketTest函数 window.onload = WebSocketTest; ``` 请注意,你需要将代码中的`xxx`替换为ROS服务器的IP地址或主机名,并根据实际情况修改其他参数。此代码将在页面加载完成后自动调用`WebSocketTest`函数,建立WebSocket连接并订阅ROS速度数据。当收到消息时,将弹出一个包含接收到的消息的警告框。你可以根据需要修改代码以适应你的具体情况。 #### 引用[.reference_title] - *1* *3* [ros相机广播订阅](https://blog.youkuaiyun.com/JanKin_BY/article/details/121841725)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [解析rosbag数据并使用websocket发送到客户端](https://blog.youkuaiyun.com/ChaoChao66666/article/details/125725549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值