ROSアプリケーション開発エントリーサブスクライバーサブスクライバープログラミング

ROSはRobotOperating Systemの略で、ROSアプリケーション開発の紹介と加入者のプログラミングを紹介します。プログラムは非常にシンプルで、コードは数行ですが、シミュレートされたカメのモーション座標情報は常に取得されて表示されます。最初にC ++コード、次にPythonコード、あなたが精通しているものだけを見るように選択することもできます。

この記事は 、ROSアプリケーション開発者パブリッシャーPublisherによる プログラミングの記事の続きです。したがって、プロジェクトパッケージが作成されていると想定されます。もちろん、私たち二人も互いに独立しています。購読している情報は、シミュレートされたカメからのものです。プロジェクトパッケージが作成されていない場合は、以下で作成したコマンドを使用しますが、作成した場合は再度作成しないでください。

cd〜 / catkin_ws / src

catkin_create_pkg Learning_topic std_msgs roscpp rospygeometry_msgs turtlesim

以下は、C ++とPythonのプログラミングの直接の紹介です。

c ++ソースコード

エンジニアリングパッケージlearning_topicのsrcディレクトリにファイルpose_subscriber.cppを作成します。これは、〜/ catkin_ws / src / Learning_topic / srcディレクトリでもあります。

cd〜 / catkin_ws / src / Learning_topic / src

ナノ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;
}

このコードには明確な注釈があります。これは、サブスクライバーを実装するための基本的なプロセスです。

ROSノードを初期化します

ノードハンドルを作成する

 サブスクライバーを作成し、/ turtle1 / poseという名前のトピックをサブスクライブして、コールバック関数poseCallbackを登録します。

ループ内のトピックメッセージを待ち、メッセージを受信した後、コールバック関数に入ります

コールバック関数poseCallback(const turtlesim :: Pose :: ConstPtr&msg)

小さなカメの位置を表示するだけです

cmakeファイルを構成する

〜/ catkin_ws / src / Learning_topic /ディレクトリにCMakeLists.txtファイルがあり、このファイルを変更する必要があります

cd〜 / catkin_ws / src / Learning_topic /

nano CMakeLists.txt 

このファイルに次の2行を追加します。

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

追加された場所は、## install ##の前にあり、前の発行元が2行追加した後の次の場所を参照します。

# target_link_libraries(${PROJECT_NAME}_node
#   ${catkin_LIBRARIES}
# )

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

add_executable(pose_subscriber src/pose_subscriber.cpp)
target_link_libraries(pose_subscriber ${catkin_LIBRARIES})

#############
## Install ##
#############

 保存して終了

これでコンパイルと構成は完了です。

テストをコンパイルして実行します

コンパイルは〜/ catkin_wsディレクトリに戻る必要があります

cd〜 / catkin_ws

catkin_make

コンパイル後に一度ソースする必要があります。

ソースdevel / setup.bash

コンパイルでエラーが発生した場合は、エラーを排除してからテストを実行する必要があります。

ターミナルを開き、rosを起動し、実行します

roscore

別のターミナルを開き、タートルを実行します

rosrun turtlesim turtlesim_node

上記はテスト環境を開始するためのものです。問題がある場合は、以下を参照してください 。ROSのシミュレーションタートルですが、キーボードコントロールは現在開始されていません。

最後に、ターミナルで実行します。

rosrun Learning_topicpose_subscriber

このとき、端末は多くの行を表示し続けます

[ INFO] [1615853945.863184221]: Turtle pose: x:7.222570, y:9.893890
[ INFO] [1615853945.879153450]: Turtle pose: x:7.222570, y:9.893890

しかし、カメのポーズ:x:7.222570、y:9.893890は、小さなカメが動かなかったため、変化しませんでした。

次に、別のターミナルを開いて実行します。

rosrun turtlesim turtle_teleop_key

次に、キーボードの矢印キーで小さなカメの動きを制御すると、座標の変化を確認できます。

もちろん、パブリッシャーのプログラミングを行う場合は、パブリッシャーを起動してタートルを動かすこともできます。

次の写真は、ボタンを操作しながら、スクリーンショットを撮っている間、パブリッシャーを起動するために使用されていますが、操作は簡単ではありません

これでc ++プログラミングは終了です。

Pythonコード 

C ++コードと混同しないように、scriptsディレクトリを作成し、このディレクトリに入り、pose_subscriber.pyファイルを作成します。

cd〜 / catkin_ws / src / Learning_topic / scripts

nanopose_subscriber.py

ファイルの内容は次のとおりです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose

import rospy
from turtlesim.msg import Pose

def poseCallback(msg):
    rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)

def pose_subscriber():
	# ROS节点初始化
    rospy.init_node('pose_subscriber', anonymous=True)

	# 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    rospy.Subscriber("/turtle1/pose", Pose, poseCallback)

	# 循环等待回调函数
    rospy.spin()

if __name__ == '__main__':
    pose_subscriber()

 

ここでは、2つの関数が定義されています。

poseCallbackは、x、y座標を表示するコールバック関数です。

pose_subscriber()は直接呼び出されますmain関数はメイン関数です#ROS
    ノードの初期化
    #サブスクライバーを作成し、/ turtle1という名前のサブスクリプション/トピックをポーズし、コールバック関数を登録しますposeCallback
    #コールバック関数の
部分を待機するループはメイン関数が呼び出します一番後ろのpose_subscriber()

if __name__ == '
    __ main __ ':pose_subscriber()

テストを実行する

実行属性を持つようにpose_subscriber.pyを変更します 

chmod + x * .py

これはls-lで確認できます。

leon @ ubuntu:〜/ catkin_ws / src / learning_topic / scripts $ ls-l
合計8
-rwxrwxrwx1レオンレオン824 2020年5月8日pose_subscriber.py
-rwxrwxrwx1レオンレオン1275 2020年5月8日velocity_publisher.pyleon@ubuntu
:〜/ catkin_untu :〜/ catkin / src / Learning_topic / scripts $ 
pythonはコンパイルする必要はなく、直接実行できます。

rosrun Learning_topicpose_subscriber.py

ただし、実行する前に、ターミナルはroscoreを開始し、次にrosrun turtlesim turtlesim_nodeを開始してから、上記のコマンドを開始する必要があります。

カメの座標の変化を確認するには、カメの動きも制御する必要があります。これは

別のターミナルを開いて実行します。

rosrun turtlesim turtle_teleop_key

次に、キーボードの矢印キーで小さなカメの動きを制御すると、座標の変化を確認できます。

もちろん、パブリッシャーのプログラミングを行う場合は、パブリッシャーを起動してタートルを動かすこともできます。

実行効果チャートについては、実際にはpythonプログラムの実行結果チャートであるc ++の実行結果チャートを参照してください。

情報の流れの関係を示す

新しいターミナルを開き、次のコマンドを入力します。

rqt_graph

次の情報関係図を見ることができます。

情報の後半はトピック/タートル/ポーズです。これは、サブスクライバーとシミュレートされたタートルの間の情報フローです。 

これらの2つのソースコードは、https://github.com/huchunxu/ros_21_tutorialsから ダウンロードすることもでき ます

全文はここで紹介されています。

 

 

おすすめ

転載: blog.csdn.net/leon_zeng0/article/details/114866447