编写简单的消息发布器和订阅器

本文介绍如何使用ROS(机器人操作系统)创建简单的发布者和订阅者节点。通过实例代码演示了发布者如何发送信息到指定的话题,以及订阅者如何接收并处理这些信息。同时,还提供了编译节点所需的CMakeLists.txt配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写发布器节点 talker

#include "ros/ros.h"	//包含了ros的头文件
#include "std_msgs/String.h"	//引用了std_msgs/String类型的消息,存放在std_msgs package里,由String.msg文件自动生成的头文件
#include <sstream>

int main(int argc, char **argv)
{
  ros::init(argc, argv, "talker");	//初始化ros,节点名为talker
  ros::NodeHandle n;	//为这个进程的节点创建一个句柄。第一个创建的 NodeHandle 会为节点进行初始化,最后一个销毁的 NodeHandle 则会释放该节点所占用的所有资源。	  

    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);  	//告诉master将在topic(chatter)上发布消息,n.advertise()返回一个ros::publish对象,它有一个publish()成员函数可以让你在topic上发布消息。

    ros::Rate loop_rate(10);  
    int count = 0; 
    while (ros::ok()) 
        {   
                std_msgs::String msg;    
      		std::stringstream ss;    
		ss << "hello world " << count;    
		msg.data = ss.str();    
		ROS_INFO("%s", msg.data.c_str());    
		chatter_pub.publish(msg);    	//向所有订阅了chatter的节点发布消息
		ros::spinOnce();    		//回调函数有用,总是加上即可
		loop_rate.sleep();    
		++count;  
	}  
	return 0;
}

编写订阅器节点

#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)		//这是一个回调函数,当接受到了chatter话题时会被调用,消息以指针形式传输
{
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}


int main(int argc, char **argv)
{

  ros::init(argc, argv, "listener");
  ros::NodeHandle n;
  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);		//告诉master我们要订阅主题chatter,消息发布到话题后,ros调用chatterCallback()函数,n.subscribe返回ros::subscribe()对象
   ros:spin();
	
   return 0;
}

编译节点

CmakeLists.txt中
   1 cmake_minimum_required(VERSION 2.8.3)
   2 project(beginner_tutorials)
   3 
   4 ## Find catkin and any catkin packages
   5 find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
   6 
   7 ## Declare ROS messages and services
   8 add_message_files(FILES Num.msg)
   9 add_service_files(FILES AddTwoInts.srv)
  10 
  11 ## Generate added messages and services
  12 generate_messages(DEPENDENCIES std_msgs)
  13 
  14 ## Declare a catkin package
  15 catkin_package()
  16 
  17 ## Build talker and listener
  18 include_directories(include ${catkin_INCLUDE_DIRS})
  19 
  20 add_executable(talker src/talker.cpp)
  21 target_link_libraries(talker ${catkin_LIBRARIES})
  22 add_dependencies(talker beginner_tutorials_generate_messages_cpp)
  23 
  24 add_executable(listener src/listener.cpp)
  25 target_link_libraries(listener ${catkin_LIBRARIES})
  26 add_dependencies(listener beginner_tutorials_generate_messages_cpp)





在Robot Operating System (ROS)中,编写简单消息发布订阅通常涉及以下几个步骤: 1. **安装必要的包**: 首先,确保已经安装了ROS并配置好环境。如果还没有,可以访问ROS官方网站下载适合的操作系统的版本,并按照教程设置。 2. **创建消息类型**: 使用`msg`包定义自定义的消息类型,例如`std_msgs/String`或自定义的消息文件。例如: ```bash rosmsg gen msg MyCustomMessage ``` 3. **发布(Publisher)**: 使用`rospy`库中的`publisish()`函数创建一个发布。这里是一个基本示例,假设你有名为`my_message`的变量存储自定义消息: ```python import rospy from my_custom_package.msg import MyCustomMessage def publish_message(): pub = rospy.Publisher('my_topic', MyCustomMessage, queue_size=10) msg = MyCustomMessage(data="Hello ROS!") while not rospy.is_shutdown(): pub.publish(msg) rospy.sleep(1) if __name__ == '__main__': rospy.init_node('publisher') try: publish_message() except rospy.ROSInterruptException: pass ``` 这里,我们创建了一个节点,并指定主题(`my_topic`),然后每秒发送一条消息。 4. **订阅(Subscriber)**: 使用`subcriber()`函数创建一个订阅,它会在接收到消息时触发回调函数: ```python import rospy from my_custom_package.msg import MyCustomMessage def message_callback(msg): print("Received message:", msg.data) def subscribe_to_topic(): rospy.Subscriber('my_topic', MyCustomMessage, message_callback) rospy.spin() if __name__ == '__main__': rospy.init_node('subscriber') try: subscribe_to_topic() except rospy.ROSInterruptException: pass ``` 这里,我们创建了一个监听者,当`my_topic`上发布新消息时,会打印消息内容。 5. **启动节点服务**: 确保发布订阅都在各自的独立节点上运行。分别运行这两个Python脚本,发布会开始在指定主题上发送消息,而订阅会接收并处理这些消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值