1. トピックモデル
この図では、ROS Master を使用してノードを管理します。
2 つのメイン ノードがあります。
パブリッシャ、Turtle Velocity (つまり、タートルの速度) という名前です
。 サブスクライバ、つまり、タートル エミュレータ ノード/turtlesim
パブリッシャー(Turtle Velocity)。メッセージ (つまり、タートルの速度情報) をパブリッシュします。タートル (線速度と角速度を含む geometry_msgs::Twist のデータ構造を持つ) のデータは、トピック (/turtle1/cmd_vel) バス パイプラインを通じてサブスクライバーに送信されます。サブスクライバーは、タートルの動きを制御するために取得した速度情報をサブスクライブします。
トピック「/turtle1/cmd_vel」は、Returnee エミュレータ ノード/turtlesim の下に組み込まれたトピックであり、直接使用できます。
2. 機能パッケージを作成する
関数パッケージはROSで作成されています: Publisher Publisher のプログラミング実装 (C++)
3. 加入者コードの作成
手順:
ROS ノードを初期化し
、必要なトピックをサブスクライブし
、ループ内でトピック メッセージを待ち、メッセージを受信した後にコールバック関数に入り、
コールバック関数でのメッセージ処理を完了します。
コードを入力するには、src に C++ コード ファイルを作成する必要があります。ファイル名は、pose_subscriber.cpp です。
/**
* 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
*/
#include <ros/ros.h>
#include "turtlesim/Pose.h"
// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
// 将接收到的消息打印出来
ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}
int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc, argv, "pose_subscriber");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
4. コードをコンパイルする
CMakeLists.txt でコンパイル ルールを構成します。
コンパイルが必要なコードと生成される実行ファイルを設定
する リンクライブラリを設定する
次のコードを CMakeLists.txt にコピーします。
add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${
catkin_LIBRARIES})
ワークスペースディレクトリに戻り、コンパイルを実行します。
cd ~/catkin_ws
catkin_make
五、走る
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic pose_subscriber
このとき、タートルの位置はpose_subscriberによって常に監視されていますが、タートルは動いていないのでx、yの座標値は変化しません。
タートルを動かし、前に使用したキーボード コントロール ノードを作成しましょう。
rosrun turtlesim turtle_teleop_key
制御して動かすとリアルタイムで座標が変化します
参考動画:Gu Yueju 講義 21 ROS 入門