ROS2可执行进程的创建和使用教程

释放双眼,带上耳机,听听看~!
本教程详细介绍了在ROS2中创建和使用可执行进程的步骤,包括创建package、编写publisher Node等。通过本教程,读者可以了解ROS2中如何使用可执行进程进行通信。

节点是通过ROS图进行通信的可执行进程

引言

ROS2将复杂的系统分解为许多模块化节点。Topic 是ROS graph的重要元素,它充当节点交换消息的总线.

ROS2可执行进程的创建和使用教程

Node可以向任意数量的Topic发布数据,同时可以订阅任意数量的Topic。

ROS2可执行进程的创建和使用教程

1、创建package

打开一个新的终端进入到ros2_workspace/src,具体创建工作空间请参见

在src目录中运行并创建包,输入以下命令:

ros2 pkg create --build-type ament_cmake cpp_pubsub

创建完成目录结构如下图所示:

ROS2可执行进程的创建和使用教程

进入目录: ros2_workspace/src/cpp_pubsub/src

cd ros2_workspace/src/cpp_pubsub/src 

2. 写publisher Node

通过输入以下命令下载示例talker代码:

wget -O publisher_member_function.cpp https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_publisher/member_function.cpp

现在将有一个名为publisher_member_function.cpp的新文件。编辑 publisher_member_function.cpp

ROS2可执行进程的创建和使用教程

#include <chrono>
#include <functional>
#include <memory>
#include <string>  //标准C++头文件

#include "rclcpp/rclcpp.hpp"       //Ros2系统中最常见的组组成部分
#include "std_msgs/msg/string.hpp" //用于发布数据的内置消息类型

using namespace std::chrono_literals;

/* This example creates a subclass of Node and uses std::bind() to register a
* member function as a callback from the timer. */

class MinimalPublisher : public rclcpp::Node
{
  public:
    MinimalPublisher()
    : Node("minimal_publisher"), count_(0)
    {
      publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
      timer_ = this->create_wall_timer(
      500ms, std::bind(&MinimalPublisher::timer_callback, this));
    }

  private:
    void timer_callback()
    {
      auto message = std_msgs::msg::String();
      message.data = "Hello, world! " + std::to_string(count_++);
      RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
      publisher_->publish(message);
    }
    
    rclcpp::TimerBase::SharedPtr timer_;
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
    size_t count_;
};

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

2.1 Examine the code

#include <chrono>
#include <functional>
#include <memory>
#include <string>  //标准C++头文件

#include "rclcpp/rclcpp.hpp"       //Ros2系统中最常见的组组成部分
#include "std_msgs/msg/string.hpp" //用于发布数据的内置消息类型

using namespace std::chrono_literals;

通过继承rclcpp::node创建节点类MinimalPublisher。代码中的每个this都是指节点。

class MinimalPublisher : public rclcpp::Node

构造函数初始化Node count_
回调函数timer_callback用于设置数据和实际发布消息。
RCLCPP_INFO宏确保每个发布的消息都打印到控制台

2.2 添加依赖

进入目录: ros2_workspace/src/cpp_pubsub/ 可以看到如下目录

ROS2可执行进程的创建和使用教程

编辑 package.xml,填写、和标签:

   <description>Examples of minimal publisher/subscriber using rclcpp</description>
   <maintainer email="whdxzwy@outlook.com">yang</maintainer>
   <license>Apache License 2.0</license>

在 ament_cmake 下添加以下两句依赖项:

 <depend>rclcpp</depend>
 <depend>std_msgs</depend>

最终添加完结果如下:

ROS2可执行进程的创建和使用教程

2.3 CMakeLists.txt

  1. 打开CMakeLists.txt文件。在现有的依赖项find_package(ament_cmake REQUIRED)下面,添加以下行:

    find_package(rclcpp REQUIRED)
    find_package(std_msgs REQUIRED)
    
  2. 之后,添加可执行文件并将其命名为talker,这样就可以使用ros2 run运行节点:

      add_executable(talker src/publisher_member_function.cpp)
      ament_target_dependencies(talker rclcpp std_msgs)  
    
  3. 最后,添加install(TARGETS…)部分,这样ros2 run就可以找到您的可执行文件:

    install(TARGETS
      talker
      DESTINATION lib/${PROJECT_NAME})
    

ROS2可执行进程的创建和使用教程

3. 写Subscriber Node

返回到ros2_workspace/src/cpp_pubsub/src以创建下一个节点。在终端中输入以下代码:

wget -O subscriber_member_function.cpp https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_subscriber/member_function.cpp

有如下两个文件:
publisher_member_function.cpp subscriber_member_function.cpp

如图所示:

ROS2可执行进程的创建和使用教程

vim打开 subscriber_member_function.cpp 文件

   #include <functional>
#include <memory>

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

using std::placeholders::_1;

class MinimalSubscriber : public rclcpp::Node
{
public:
 MinimalSubscriber()
 : Node("minimal_subscriber")
 {
   subscription_ = this->create_subscription<std_msgs::msg::String>(
     "topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));
 }

private:
 void topic_callback(const std_msgs::msg::String & msg) const
 {
   RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg.data.c_str());
 }
 rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};

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

3.1 CMakeLists.txt 中添加订阅者节点的可执行文件和目标。

   add_executable(listener src/subscriber_member_function.cpp)
   ament_target_dependencies(listener rclcpp std_msgs)

   install(TARGETS
       talker
       listener
       DESTINATION lib/${PROJECT_NAME})
   

ROS2可执行进程的创建和使用教程

4. Build and run

在构建之前,最好在工作区的根目录(ros2_workspace)中运行rosdep,以检查是否缺少依赖项:

   rosdep install -i --from-path src --rosdistro humble -y

ROS2可执行进程的创建和使用教程

仍然在工作区的根目录ros2_workspace中构建新包:

colcon build --packages-select cpp_pubsub

ROS2可执行进程的创建和使用教程

打开一个新终端,进入到目录ros2_workspace下,并获取安装文件:

 . install/setup.bash

现在来运行talker node:

 ros2 run cpp_pubsub talker

终端应该每0.5秒开始发布一次信息消息,如下所示:

ROS2可执行进程的创建和使用教程

打开另一个终端,再次从ros2_workspace内部获取安装文件,然后启动listener node

   ros2 run cpp_pubsub listener

ROS2可执行进程的创建和使用教程

ROS2可执行进程的创建和使用教程

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

机器学习的定义、标签和分类

2023-12-14 20:51:14

AI教程

深度学习中的超参数优化

2023-12-14 21:03:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索