1对1见ros2发布订阅
在原来基础上建立第二个subscribe
创建topic_subscribe_02.cpp
cd ros2_ws/src/example_topic_rclcpp/src
touch topic_subscribe_02.cpp
编辑topic_subscribe_02.cpp
gedit topic_subscribe_02.cpp
将topic_subscribe_01.cpp的代码复制到里边
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class TopicSubscribe01 : public rclcpp::Node
{
public:
TopicSubscribe01(std::string name) : Node(name)
{
RCLCPP_INFO(this->get_logger(), "大家好,我是%s.", name.c_str());
// 创建一个订阅者订阅话题
command_subscribe_ = this->create_subscription<std_msgs::msg::String>("command", 10, std::bind(&TopicSubscribe01::command_callback, this, std::placeholders::_1));
}
private:
// 声明一个订阅者
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr command_subscribe_;
// 收到话题数据的回调函数
void command_callback(const std_msgs::msg::String::SharedPtr msg)
{
double speed = 0.0f;
if(msg->data == "forward")
{
speed = 0.2f;
}
RCLCPP_INFO(this->get_logger(), "收到[%s]指令,发送速度 %f", msg->data.c_str(),speed);
};
};
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
/*产生一个的节点*/
auto node = std::make_shared<TopicSubscribe01>("topic_subscribe_01");
/* 运行节点,并检测退出信号*/
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
将倒数第五行的“topic_subscribe_01”修改为“topic_subscribe_02”,ctrl+s保存
auto node = std::make_shared<TopicSubscribe01>("topic_subscribe_02");
修改CMakelists.txt
cd ..
gedit CMakeLists.txt
添加以下代码到文件夹中
add_executable(topic_subscribe_02 src/topic_subscribe_02.cpp)
ament_target_dependencies(topic_subscribe_02 rclcpp std_msgs)
install(TARGETS
topic_subscribe_02
DESTINATION lib/${PROJECT_NAME}
)
保存关闭
package.xml文件不需要再作修改
编译项目
cd ros2_ws
colcon build
source install/setup.bash
打开发布者
ros2 run example_topic_rclcpp topic_publisher_01
打开订阅者
新建终端
cd ros2_ws
source install/setup.bash
ros2 run example_topic_rclcpp topic_subscribe_01
重复上一步操作,打开topic_subscribe_02
cd ros2_ws
source install/setup.bash
ros2 run example_topic_rclcpp topic_subscribe_02
新建终端,打开rqt
可以看到,此时的发布者有两个订阅者topic_subscribe_01和02。
1对n结束。