话题的发布者
- 导入消息类型,ros自带的消息类型在
std_msgs/msg/
下面,有string等类型 - 定义一个类,里面声明一个发布者话题的共享指针,指针标注发布的数据类型
- 在构造函数中使用
create_publisher
创建声明的这个发布者对象,也可以在声明时创建对象。
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
class publisher: public rclcpp::Node
{
private:
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr pub_er;
public:
publisher(std::string name);
~publisher();
void publish_data();
};
publisher::publisher(std::string name):Node(name)
{
RCLCPP_INFO(this->get_logger(),"create publisher");
pub_er = this->create_publisher<std_msgs::msg::String>("topic_name",10);
}
publisher::~publisher()
{RCLCPP_INFO(this->get_logger(),"delete publisher");}
void publisher::publish_data()
{
std_msgs::msg::String text_data;
text_data.data="abcdefg";
pub_er->publish(text_data);
}
int main(int argc, char ** argv)
{
rclcpp::init(argc,argv);
auto node = std::make_shared<publisher>("my_publishr");
while(1)
{
sleep(3);
node->publish_data();
}
rclcpp::spin(node);
rclcpp::shutdown();
}
话题的订阅者
class subscriber : public rclcpp::Node
{
private:
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr sub_er;
void callback(const std_msgs::msg::String::SharedPtr publish_data)
{
RCLCPP_INFO(this->get_logger(),"data:%s",publish_data->data.c_str());
}
public:
subscriber(std::string name);
~subscriber();
};
subscriber::subscriber(std::string name):Node(name)
{
RCLCPP_INFO(this->get_logger(),"create subscriber");
sub_er = this->create_subscription<std_msgs::msg::String>("topic_name",10,std::bind(&subscriber::callback,this,_1));
}
subscriber::~subscriber()
{ RCLCPP_INFO(this->get_logger(),"delete subscriber"); }
int main(int argc, char ** argv)
{
rclcpp::init(argc,argv);
auto node = std::make_shared<subscriber>("my_subscriber");
rclcpp::spin(node);
rclcpp::shutdown();
}
自定义话题的接口类型
-
在包的src的同级目录下,不是工程目录的src同级目录下创建msg文件夹
-
在msg文件夹下创建Xxx.msg文件(文件首字母大写,不能包含_下划线等符号)
-
在Xxx.msg文件中添加消息类型
-
在CmakeList.txt文件和package.xml文件中添加依赖、msg文件的目录
-
创建一个msg文件,文件名为Novel.msg
# 添加一个string类型和图片类型
# 调用原有的string类型
string content
# 调用以后的图片类型
sensor_msgs/Image image
# 数组的话直接在数据类型后面加数组的中括号,例如:
# string[] content
- 修改CMakeLists.txt文件
主要是添加依赖(find_package和rosidl_generate_interfaces)
# 添加我们要引入数据类型的依赖包
find_package(sensor_msgs REQUIRED) # sensor_msgs/Image
# 自定义数据类型还需要一个rosidl_default_generators
find_package(rosidl_default_generators REQUIRED)
# 自定义数据类型还需要添加一个rosidl_generate_interfaces
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/Novel.msg" #这里是指明msg文件的目录和名称
DEPENDENCIES sensor_msgs) # 这里需要填上这个类型所需的依赖
- 修改package.xml文件
<depend>sensor_msgs</depend>
<buildtool_depend>rosidl_default_generators</buildtool_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
将自定义的话题引入到程序中
#include <ros2_publisher/msg/Novel.hpp>
ros2_publisher::msg::Novel publish_data_interface;
rclcpp::Publisher<ros2_publisher::msg::Novel>::SharedPtr num_publisher=this->create_publisher<ros2_publisher::msg::Novel>("topic_name",20);
添加自定义数据类型的包依赖
find_package(ros2_publisher REQUIRED)
在ament_target_dependencies中添加包依赖名
ament_target_dependencies(
my_publisher
"std_msgs"
"rclcpp"
ros2_publisher
)
添加定义数据类型的包
<depend>ros2_publisher</depend>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)