~欢迎关注~
微信公众号:古月居(guyue_home)
新浪微博:
古月春旭
知乎专栏:古月居
原文链接:ROS 2中自定义话题接口的调用

 

之前我们讲到如何在ROS2中自定义话题和服务,在编译之后产生了相应的头文件。

本篇以自定义的话题接口为例,看下如何调用之前定义好的接口内容。

接口定义参考:ROS 2中的话题与服务接口定义

一、完整代码示例

在test_pkg功能包的src下创建publish_contact.cpp文件,完整代码内容如下:

#include <iostream>
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "test_pkg/msg/contact.hpp"

using namespace std::chrono_literals;

class ContactPublisher : public rclcpp::Node
{
public:
 ContactPublisher()
 : Node("address_book_publisher")
 {
   contact_publisher_ = this->create_publisher<test_pkg::msg::Contact>("contact");

   auto publish_msg = [this]() -> void {
       auto msg = std::make_shared<test_pkg::msg::Contact>();

       msg->first_name = "John";
       msg->last_name = "Doe";
       msg->age = 30;
       msg->gender = msg->MALE;
       msg->address = "unknown";

       std::cout << "Publishing Contact\nFirst:" << msg->first_name <<
         "  Last:" << msg->last_name << std::endl;

       contact_publisher_->publish(msg);
     };
   timer_ = this->create_wall_timer(1s, publish_msg);
 }

private:
 rclcpp::Publisher<test_pkg::msg::Contact>::SharedPtr contact_publisher_;
 rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char * argv[])
{
 rclcpp::init(argc, argv);
 auto publisher_node = std::make_shared<ContactPublisher>();
 rclcpp::spin(publisher_node);
 return 0;
}

二、示例代码剖析

接下来具体分析以上代码:

#include "test_pkg/msg/contact.hpp"

头文件包含很重要,contact.hpp是根据msg文件编译时动态生成的头问题,头文件名就是msg文件的名字,所以此时虽然还未生成头文件,但是我们也可以确定将来生成的路径和名字;

ContactPublisher(): Node("address_book_publisher"){

创建一个名为address_book_publisher的节点;

auto publish_msg = [this]() -> void {

创建一个周期发布话题消息的功能函数;

auto msg = std::make_shared<test_pkg::msg::Contact>();

msg->first_name = "John";
msg->last_name = "Doe";
msg->age = 30;
msg->gender = msg->MALE;
msg->address = "unknown";

在发布函数中创建 Contact消息并填充数据域,注意这里的话题接口test_pkg::msg::Contact就是我们自定义的内容;

std::cout << "Publishing Contact\nFirst:" << msg->first_name <<
 "  Last:" << msg->last_name << std::endl;

contact_publisher_->publish(msg);

发布话题消息并输出日志信息;

timer_ = this->create_wall_timer(1s, publish_msg);

创建周期为1秒的定时器,用来调用以上发布话题消息的函数。

为了编译以上代码,除了像之前文章一样修改package.xml,还需要修改CMakeLists.txt:

find_package(test_pkg REQUIRED)

add_executable(publish_contact
 src/publish_contact.cpp)
ament_target_dependencies(publish_contact
   "rclcpp"
   "test_pkg")

三、示例运行效果

编译之后配置环境变量并运行节点,效果如下:

Screenshot from 2019-01-26 17-58-31

可以通过终端订阅并打印话题,查看消息内容:

Screenshot from 2019-01-26 17-59-27

ROS2接口定义与调用的相关源码,请关注微信公众号“古月居”,后台回复“ros2接口定义”获取完整代码的下载地址。

 

更多内容欢迎关注:

微信公众号:古月居 (guyue_home)

新浪微博:古月春旭

知乎专栏:古月居