ROS2 发布/订阅Topic

发布/订阅Topic是ROS2中用于节点间通信的一种机制。在ROS2中,一个节点可以作为发布者(Publisher)发布消息到某个话题(Topic),而其他节点可以作为订阅者(Subscriber)订阅这个话题以接收消息。这种发布/订阅模型允许解耦的通信方式,使得不同节点之间可以灵活地进行数据交换。
这里把发布者和订阅者的简单示例介绍一下,这里会用到rclcpp和std_msgs。

发布者(Publisher)

在我们的工作空间目录下(~/ROSWorkspace),先创建一个topic包,这里先把发布者节点也创建出来,省得自己创建cpp文件,package的创建可参考另一篇文章”ROS2 HelloWorld“。

ros2 pkg create pkg_topic_cpp --build-type ament_cmake --dependencies rclcpp std_msgs --node-name publisher_node_cpp

在publisher_node_cpp.cpp中实现如下代码:

#include <cstdio>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

int main(int argc, char ** argv)
{
 rclcpp::init(argc, argv);//初始化rclcpp
 rclcpp::Node::SharedPtr node = rclcpp::Node::make_shared("my_publisher");//创建节点
 rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher = node->create_publisher<std_msgs::
 msg::String>("my_topic", 10);//创建发布者,发布类型为std_msgs::msg::String,发布topic为my_topic,队列长度为10
 rclcpp::WallRate loop_rate(1);//创建时钟,1Hz
 while (rclcpp::ok()) {
 std_msgs::msg::String msg;
 msg.data = "Hello, world!";//设置消息内容
 publisher->publish(msg);//发布消息  
 RCLCPP_INFO(node->get_logger(), "%s: '%s'", publisher->get_topic_name(), msg.data.c_str());//打印消息
 loop_rate.sleep();//休眠到1s,确保1Hz
 }

 printf("hello world pkg_topic_cpp package end\n");
 return 0;
}

编译指定pkg_topic_cpp:

colcon build --packages-select pkg_topic_cpp

编译完之后先配置一下环境:

. install/setup.sh 

然后运行:

ros2 run pkg_topic_cpp publisher_node_cpp

可以看到每秒打印一次
在这里插入图片描述
这个是我们自己使用RCLCPP_INFO打印出来的,如果想看是不是真的发布出去了可以创建新的node订阅该topic,这个后文再介绍,我们可以用ros2命令行订阅my_topic测试一下,在新的终端一下命令:

ros2 topic echo /my_topic

在这里插入图片描述
看到上面的这个打印就说my_topic明确实发布出来了,这也说明我们写的Publisher代码是有效的。
接下来实现我们自己的Subscriber。

订阅者(Subscriber)

在<工作空间>/pkg_topic_cpp/src/目录下创建subscriber_node_cpp.cpp,然后实现如下代码:

#include <cstdio>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

// Subscription回调函数
void mySubCallback(const std_msgs::msg::String::SharedPtr msg) {
 RCLCPP_INFO(rclcpp::get_logger("my_subscriber"), "/my_topic: I heard: %s", msg->data.c_str());
}

int main(int argc, char const *argv[])
{
 rclcpp::init(argc, argv);//初始化rclcpp
 rclcpp::Node::SharedPtr node = rclcpp::Node::make_shared("my_subscriber");//创建节点
 rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription = node->create_subscription<std_msgs::
 msg::String>("my_topic", 10, mySubCallback);//创建订阅者,第一个参数为topic名称,第二个参数为队列大小,第三个参数为回调函数
 
 rclcpp::spin(node);//进入消息循环
 rclcpp::shutdown();//关闭节点

 printf("hello world pkg_topic_cpp subsriber_node_cpp end\n");
 return 0;
}

在编译前,我们需要先将subscriber_node_cpp节点添加到CMakeLists里面去,在CMakeLists中添加如下内容:

add_executable(subscriber_node_cpp src/subscriber_node_cpp.cpp)
target_include_directories(subscriber_node_cpp PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
ament_target_dependencies(
  subscriber_node_cpp
 "rclcpp"
)

install(TARGETS subscriber_node_cpp
  DESTINATION lib/${PROJECT_NAME})

我们在新的终端打开工作空间(~/ROSWorkspace),重新编译pkg_topic_cpp:

colcon build --packages-select pkg_topic_cpp

编译完之后先配置一下环境:

. install/setup.sh 

然后运行:

ros2 run pkg_topic_cpp subscriber_node_cpp

在这里插入图片描述
看到上面的这个打印就说明我们成功的订阅了my_topic,这也就说明我们的Subscriber正确的实现了。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的ROS向/abot的topic发布消息的Python程序示例: ``` python #!/usr/bin/env python import rospy from std_msgs.msg import String def publisher(): # 创建一个名为"abot"的topic,String类型的消息 pub = rospy.Publisher('/abot', String, queue_size=10) # 初始化ROS节点 rospy.init_node('abot_publisher', anonymous=True) rate = rospy.Rate(10) # 10hz while not rospy.is_shutdown(): # 发布消息 message = "Hello ABot!" rospy.loginfo(message) pub.publish(message) rate.sleep() if __name__ == '__main__': try: publisher() except rospy.ROSInterruptException: pass ``` 这个程序通过ROS向/abot的topic发布了一个消息。程序中使用了rospy.Publisher()函数创建了一个发布者对象,用于发布消息。在while循环中,程序通过pub.publish()函数发布了一个String类型的消息,并休眠一段时间。程序中使用了rospy.loginfo()函数输出日志信息。 在运行这个程序之前,需要先确保ROS master已经启动,可以使用以下命令启动ROS master: ``` roscore ``` 然后,运行这个Python程序,使用以下命令: ``` rosrun <package_name> <node_name>.py ``` 其中,<package_name>是程序所在的ROS包的名称,<node_name>是程序的名称。例如,如果这个程序保存在名为"my_ros_package"的ROS包中,程序名称为"my_publisher.py",则可以使用以下命令运行程序: ``` rosrun my_ros_package my_publisher.py ``` 程序运行后,会向/abot的topic发布消息。其他的ROS节点可以订阅这个topic,接收发布的消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值