手把手教你如何订阅话题,并通过终端发布话题,实现回调中打印收到的消息内容。
1)通过指令生成ros2 package包结构:
ros2 pkg create topic_subscription --build-type ament_cmake --dependencies rclcpp std_msgs
2)创建一个 my_subscriber.cpp文件,并在其中订阅/say的话题,并打印日志:
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
/**
* 创建一个继承自rclcpp::Node的类MinimalSubscriber
* 这样可以使用ROS2节点的所有功能。
*/
class MinimalSubscriber : public rclcpp::Node
{
public:
MinimalSubscriber()
: Node("minimal_subscriber") // 节点构造函数,设置节点名称为"minimal_subscriber"
{
// 创建订阅者,订阅名为"/say"的话题,消息类型为std_msgs::msg::String
// 10是队列长度,std::bind将成员函数topic_callback绑定为消息到达时的回调函数
// _1是一个占位符,表示回调函数需要一个参数
subscription_ = this->create_subscription<std_msgs::msg::String>(
"/say", 10, std::bind(&MinimalSubscriber::topic_callback, this, std::placeholders::_1));
}
private:
/**
* 定义消息回调函数
* 当有消息发布到"/say"话题时,这个函数会被自动调用
* @param msg 接收到的String消息的常量共享指针
*/
void topic_callback(const std_msgs::msg::String::SharedPtr msg) const
{
// 在终端打印接收到的消息内容
// RCLCPP_INFO是ROS2中用于打印信息日志的宏
RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());
}
// 声明订阅者成员变量
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};
/**
* 程序主函数
*/
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv); // 初始化ROS2 C++客户端库
rclcpp::spin(std::make_shared<MinimalSubscriber>()); // 创建节点实例并进入自旋,等待消息到来
rclcpp::shutdown(); // 关闭ROS2
return 0;
}
3)编译与运行
i. 配置CMakeLists.txt:确保在你的功能包的CMakeLists.txt文件中添加了可执行文件并设置了依赖。
add_executable(my_subscriber src/my_subscriber.cpp)
ament_target_dependencies(my_subscriber rclcpp std_msgs)
install(TARGETS my_subscriber
DESTINATION lib/${PROJECT_NAME})
ii. 编译工作空间:在你的ROS2工作空间根目录下执行:
colcon build --packages-select topic_subscription
iii. 运行订阅者:打开一个终端,先执行source install/setup.bash设置环境,然后运行:
ros2 run topic_subscription my_subscriber
ros2 topic pub /say std_msgs/msg/String data:\ \'hello_world\'\
打印的日志:


2769

被折叠的 条评论
为什么被折叠?



