系列文章目录
留空
前言
自用
一、遇到错误
假设有一个"王五"节点,他既是某本小说话题的订阅者又是卖书的服务端,该如何同时实现两个功能
起初想把这两个功能分成两个类Readers
和SellServer
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class Readers : public rclcpp::Node
{
public:
Readers(std::string name) : Node(name)
{
RCLCPP_INFO(this->get_logger(),"读者节点%s已启动",name.c_str());
};
class SellServer : public rclcpp::Node
{
public:
SellServer(std::string name) : Node(name)
{
RCLCPP_INFO(this->get_logger(),"卖书客户端%s已启动",name.c_str());
}
};
int main(int argc,char** argv)
{
rclcpp::init(argc,argv);
auto Readernode = std::make_shared<Readers>("wang5");
auto Servernode = std::make_shared<SellServer>("wang5");
rclcpp::spin(Readernode);
rclcpp::spin(Servernode);
rclcpp::shutdown();
return 0;
}
运行节点,出现警告
警告信息提示了“Publisher already registered for provided node name”这个问题,意味着在节点名上已经注册了一个发布者。这通常是因为有多个节点使用相同的名称导致的。这是ROS2认为我们创建了两个节点,一个是Readers节点,另一个是SellServer节点,它们都使用了相同的名称“wang5”。
二、解决方法1
为了解决这个问题,我们可以将两个功能合并到同一个类中。
#include "rclcpp/rclcpp.hpp"
//(1)导入订阅的话题接口类型
#include "std_msgs/msg/string.hpp"
class ReadersAndSellServer : public rclcpp::Node
{
public:
ReadersAndSellServer(std::string name) : Node(name)
{
RCLCPP_INFO(this->get_logger(),"读者节点%s已启动",name.c_str());
RCLCPP_INFO(this->get_logger(),"卖书客户端%s已启动",name.c_str());
}
};
int main(int argc,char** argv)
{
rclcpp::init(argc,argv);
auto node = std::make_shared<ReadersAndSellServer>("wang5");
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
重新编译运行,警告消除。
三、解决方法2
如果想分成两个类来编写,那只能将它分为两个节点,分别运行
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class Readers : public rclcpp::Node
{
public:
Readers(std::string name) : Node(name)
{
RCLCPP_INFO(this->get_logger(), "读者节点%s已启动", name.c_str());
}
};
class SellServer : public rclcpp::Node
{
public:
SellServer(std::string name) : Node(name)
{
RCLCPP_INFO(this->get_logger(), "卖书服务端节点%s已启动", name.c_str());
}
};
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
auto Readernode = std::make_shared<Readers>("Readernode_wang5");
auto SellServer = std::make_shared<SellServer>("SellServer_wang5");
rclcpp::spin(Readernode_wang5);
rclcpp::spin(SellServer_wang5);
rclcpp::shutdown();
return 0;
}
比较麻烦,这里就不试了。
总结
自用