簡単なパブリッシャーを作成する (C++) [ROS1 と ROS2 の比較]

ROS1 と ROS2 にそれぞれワークスペースと関数パッケージを作成します

mkdir -p ~/dev_ws/src
cd ~/dev_ws/src

ROS1: トピックのリリース

ソースコードのダウンロード:

mkdir -p ~/dev_ws/src
cd ~/dev_ws/src
wget -O publisher_member_function.cpp https://raw.github.com/ros/ros_tutorials/kinetic-devel/roscpp_tutorials/talker/talker.cpp

まずヘッダーファイル:

   #include "ros/ros.h"
   #include "std_msgs/String.h"
   #include <sstream>

「ros/ros.h」は、ROS システムの最も一般的な共通部分を使用するために必要なヘッダー ファイルをすべて含む便利なツールです。
「std_msgs/String.h」 これには、std_msgs パッケージに存在する std_msgs/String メッセージが含まれます。以下は、パッケージ内の String.msg ファイルから自動生成されたヘッダー ファイルです。

初期化:

ノードの初期化、ハンドルの初期化を含む

ros :: init(argc,argv,“ talker ”);
ros::NodeHandle n;

NodeHandle::advertise() は 2 つの目的を果たす ros::Publisher オブジェクトを返します: 1) 作成したトピックにメッセージをパブリッシュできるパブリッシュ() メソッドが含まれています; 2) 範囲を超えた場合、広告は自動的にキャンセルされます。

投稿トピック

ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);

タイプ std_msgs/string のメッセージがトピック chatter_pub で公開されることをマスターに伝えます。このようにして、マスターは、chatter_pub をリッスンしているノードに、このトピックに関するデータが公開されることを伝えることができます。2 番目のパラメータはパブリッシュ キューのサイズです。この場合、パブリッシュが速すぎると、ノードは以前にデータにバッファリングされていた最も古い 1000 個のデータ メッセージの破棄を開始します。

rate は希望のサイクル周波数を指定することを意味し、ここでは 10HZ として指定されています。

int count = 0;
 while (ros::ok())
  {

デフォルトでは、roscpp は Ctrl-C 処理を提供する SIGINT ハンドラーをインストールし、これが発生した場合は ros::OK() が false を返します。
SIGINT (Ctrl-C) が受信された場合、ROS::OK() は False を返します

同じ名前の別のノードによってネットワークからキックオフされました。
ROS::Shutdown() がアプリケーションの別の部分によって呼び出されています。
すべての ros::NodeHandles が破棄されました。
ros::OK() が false を返すと、すべての ROS 呼び出しは失敗します。

メッセージタイプ

 std_msgs::String msg;
 std::stringstream ss;
 ss << "hello world " << count;
  msg.data = ss.str();

通常は msg ファイルから生成されるメッセージ アダプター クラスを使用して、ROS 上でメッセージをブロードキャストします。より複雑なデータ型も可能ですが、ここでは「data」という 1 つのメンバーを持つ標準の文字列メッセージを使用します。

トピックリリース

chatter_pub.publish(msg);

次に、トピックにサブスクライブしているノードにメッセージをブロードキャストします。

印刷情報

ROS_INFO("%s", msg.data.c_str());

賞賛::spinOnce()

loop_rate.sleep();

この単純なプログラムはコールバックを受け取らないため、ここで ros::spinOnce() を呼び出す必要はありません。プログラム内にコールバック関数がある場合、ros::spinOnce()を追加しないとコールバック関数は呼び出されません。

ROS2: トピックの公開

ソースコードのダウンロード:

mkdir -p ~/dev_ws/src
cd ~/dev_ws/src
wget -O publisher_member_function.cpp https://raw.githubusercontent.com/ros2/examples/master/rclcpp/topics/minimal_publisher/member_function.cpp

ヘッド ファイル:

#include <chrono>
#include <functional>
#include <memory>
#include <string>

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

ROS 2アーキテクチャでは「rclcpp/rclcpp.hpp」となるため

初期化:

ノードの初期化、ハンドルの初期化を含む

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));
    }

パブリック コンストラクターはノードに MinimalPublisher という名前を付け、count_ を 0 に初期化します。コンストラクター内で、文字列メッセージ タイプ、トピックという名前のトピック、および必要なキュー サイズ 10 を使用してパブリッシャーを初期化し、バックアップ時のメッセージを制限します。次に、timer_ が初期化され、これにより timer_callback 関数が 1 秒あたり 2 回実行されます。
timer_callback 関数は、メッセージ データが設定され、メッセージが実際にパブリッシュされる場所です。

投稿トピック

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_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());

ROS2 の印刷出力機能は ROS1 の印刷機能とは異なりますので注意してください。

公式 Web サイトのチュートリアルを参照してください:
http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29
https://index.ros.org/doc/ros2/Tutorials/Writing-A- Simple-Cpp - パブリッシャーとサブスクライバー/

おすすめ

転載: blog.csdn.net/Feizhai2/article/details/114086892