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 - パブリッシャーとサブスクライバー/