ROS学习(1)( publisher and subscriber)
创始人
2025-05-30 14:09:00

节点是通过ROS图通信的可执行进程。在本教程中,节点将通过主题以字符串消息的形式相互传递信息。这里使用的例子是一个简单的“说话者”和“倾听者”系统;一个节点发布数据,而另一个节点订阅该主题,以便它可以接收该数据。

创建对应功能包

打开一个新的终端并获取ROS 2安装的源代码,这样ros 2命令就可以工作了.
导航到上一教程中创建的ros2_ws目录。
回想一下,应该在src目录中创建包,而不是在工作区的根目录中。因此,导航到ros2_ws/src,并运行包创建命令:

ros2 pkg create --build-type ament_cmake cpp_pubsub

您的终端将返回一条消息,验证您的包cpp_pubsub及其所有必要文件和文件夹的创建。
导航到ros2_ws/源代码/cpp_pubsub/源代码。回想一下,这是任何CMake包中包含可执行文件的源文件所属的目录。

话题节点的创建

#include 
#include 
#include 
#include 
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using namespace std;
using namespace rclcpp;
using namespace std_msgs;
using namespace std::chrono_literals;class MinimalPublisher : public Node{public:MinimalPublisher():Node("minimal_publisher"),count_(0){publisher_ = this->create_publisher("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);}size_t count_;rclcpp::Publisher::SharedPtr publisher_;rclcpp::TimerBase::SharedPtr timer_;
};
int  main(int argc, const char** argv) {rclcpp::init(argc, argv);rclcpp::spin(std::make_shared());rclcpp::shutdown();return 0;
}

订阅者节点创建

#include #include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using std::placeholders::_1;
using namespace std;
using namespace rclcpp;
using namespace std_msgs;
class MinimalSubscriber : public Node{public:MinimalSubscriber():Node("MinimalSubscriber"){subscription_ = this->create_subscription("topic",10,std::bind(&MinimalSubscriber::topic_callback,this,_1));}private:void topic_callback(const std_msgs::msg::String::SharedPtr msg){RCLCPP_INFO(this->get_logger(),"I heard %s",msg->data.c_str());}rclcpp::Subscription::SharedPtr subscription_;
};
int main(int argc, char * argv[])
{rclcpp::init(argc, argv);rclcpp::spin(std::make_shared());rclcpp::shutdown();return 0;
}

修改XML文件

在ament_cmake buildtool依赖项后面添加一个新行,并粘贴与节点的include语句对应的以下依赖项:

  rclcppstd_msgs

修改CMakeLsits.txt

现在打开CMakeLists.txt文件。在现有依赖项find_package(ament_cmake REQUIRED)下面添加以下行:

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

之后,添加可执行文件并将其命名为talker,以便可以使用ros2 run运行节点:

add_executable(talker src/publisher_member_function.cpp)
ament_target_dependencies(talker rclcpp std_msgs)
add_executable(listen src/subscriber_member_function.cpp)
ament_target_dependencies(listen rclcpp std_msgs)

最后,添加install(TARGETS...)部分,以便ros2 run可以找到您的可执行文件:

install(TARGETStalkerlistenDESTINATION lib/${PROJECT_NAME})

进行编译

您可能已经将rclcpp和std_msgs包作为ROS 2系统的一部分进行了安装。最好在工作区的根目录(ros2_ws)下运行rosdep,以便在构建之前检查缺少的依赖项:

colcon build --packages-select cpp_pubsub

相关内容

热门资讯

快速入手优先队列 一.理解优先队列标准模板库(Standard Template Library,STL...
重要公告大唐麻将外挂辅助神器(... 您好!欢迎拜访本公司网站,咱们公司是专业研制及出售全国各地辅助软件1.亲,实际上大唐麻将确实有挂.添...
Linux绑核效率优化 Linux绑核效率优化 原理概述: cpu一般有多个物理核心,但在运行进...
Strapi 之API详述 API的使用 REST API允许通过API端点访问 content-types 。当一个内容类型被...
传授课程技巧王者陕西麻将外挂辅... 1. 无需人工智能权限即可帮助您快速完成GG Poker计算辅助教程,并沉浸在游戏中。2. 整个GG...