ROS2探索总结(十四)—— 自定义话题接口的调用

  • 内容
  • 评论
  • 相关

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

 

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

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

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

一、完整代码示例

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

  1. #include <iostream>
  2. #include <memory>
  3. #include "rclcpp/rclcpp.hpp"
  4. #include "test_pkg/msg/contact.hpp"
  5.  
  6. using namespace std::chrono_literals;
  7.  
  8. class ContactPublisher : public rclcpp::Node
  9. {
  10. public:
  11.  ContactPublisher()
  12.  : Node("address_book_publisher")
  13.  {
  14.    contact_publisher_ = this->create_publisher<test_pkg::msg::Contact>("contact");
  15.  
  16.    auto publish_msg = [this]() -> void {
  17.        auto msg = std::make_shared<test_pkg::msg::Contact>();
  18.  
  19.        msg->first_name = "John";
  20.        msg->last_name = "Doe";
  21.        msg->age = 30;
  22.        msg->gender = msg->MALE;
  23.        msg->address = "unknown";
  24.  
  25.        std::cout << "Publishing Contact\nFirst:" << msg->first_name <<
  26.          "  Last:" << msg->last_name << std::endl;
  27.  
  28.        contact_publisher_->publish(msg);
  29.      };
  30.    timer_ = this->create_wall_timer(1s, publish_msg);
  31.  }
  32.  
  33. private:
  34.  rclcpp::Publisher<test_pkg::msg::Contact>::SharedPtr contact_publisher_;
  35.  rclcpp::TimerBase::SharedPtr timer_;
  36. };
  37.  
  38. int main(int argc, char * argv[])
  39. {
  40.  rclcpp::init(argc, argv);
  41.  auto publisher_node = std::make_shared<ContactPublisher>();
  42.  rclcpp::spin(publisher_node);
  43.  return 0;
  44. }

二、示例代码剖析

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

  1. #include "test_pkg/msg/contact.hpp"

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

  1. ContactPublisher(): Node("address_book_publisher"){

创建一个名为address_book_publisher的节点;

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

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

  1. auto msg = std::make_shared<test_pkg::msg::Contact>();
  2.  
  3. msg->first_name = "John";
  4. msg->last_name = "Doe";
  5. msg->age = 30;
  6. msg->gender = msg->MALE;
  7. msg->address = "unknown";

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

  1. std::cout << "Publishing Contact\nFirst:" << msg->first_name <<
  2.  "  Last:" << msg->last_name << std::endl;
  3.  
  4. contact_publisher_->publish(msg);

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

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

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

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

  1. find_package(test_pkg REQUIRED)
  2.  
  3. add_executable(publish_contact
  4.  src/publish_contact.cpp)
  5. ament_target_dependencies(publish_contact
  6.    "rclcpp"
  7.    "test_pkg")

三、示例运行效果

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

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

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

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

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

 

更多内容欢迎关注:

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

新浪微博:古月春旭

知乎专栏:古月居


原创文章,转载请注明: 转载自古月居

本文链接地址: ROS2探索总结(十四)—— 自定义话题接口的调用

微信 OR 支付宝 扫描二维码
为本文作者 打个赏
pay_weixinpay_weixin