今日は、ROSシステムの知識を継続します。これにより、ロボット制御システムを簡単かつ簡単に作成できます。 前のレッスンを逃した人のために-おおよその作業計画。
- インストール、基本概念
- 私たちは独自のパッケージを作成し、簡単なプログラムであるメッセージに精通します
- サービスとオプション
前回、ROSの基本要素はパッケージであることがわかりました。 教育プロセスはこの面白い事実を通り抜けることができないので、虫眼鏡や顕微鏡を強くしてください-私たちは勉強します!
この場合、最も便利なのは独自のパッケージを作成することです。 何も損なわず、ROS微生物叢を良好な状態に維持するために、すべての実験用に個別のディレクトリを作成します。 私の場合は〜/ rosになります。
. /opt/ros/electric/setup.sh cd mkdir ros cd ./ros export ROS_PACKAGE_PATH="~/ros:/opt/ros/electric/stacks"
最後の行は、標準パッケージリポジトリへのパス(番号2)とユーザーパス(この場合、パス番号1)を格納する環境変数を設定します。 特に好奇心reader盛な読者は、カスタムスタックを作成することをお勧めします。 残念ながら、これは誤った仮定になります-stack.xmlマニフェストファイルがありません。 ただし、これは修正可能ですが、今では絶対に必要ではありません。 そして今が聖saの時です。
まとめてください
パッケージはroscreate-pkgコマンドで作成され、次のように呼び出されます。
$ roscreate-pkg tutorial std_msgs rospy roscpp
最初の引数はパッケージの名前で、その後に依存関係のリストが続きます(それらについては後ほど説明します)。 ここで、前回のレッスンですでに知られているrospackチームを使用してパッケージを登録する必要があります。
rospack profile rospack find tutorial /home/crady/ros/tutorial
すべてが順調に進んでいるようです。 しかし、パッケージを別のマシンで実行するとどうなりますか? また、ROSの別のバージョンがある場合は? そして、もしそうなら、そしてすぐに、ああ、ああ、ああ? 依存関係の追跡は、これらすべてに役立つはずです。 ROSは、パッケージ間の2種類の接続を区別します-最初の段階と他のすべての段階です。 モジュールのマニフェストを見ると、すぐに区分が明確になります。
cat ./ros/tutorial/manifest.xml
<package> <description brief="tutorial"> tutorial </description> <author>crady</author> <license>BSD</license> <review status="unreviewed" notes=""/> <url>http://ros.org/wiki/tutorial</url> <depend package="std_msgs"/> <depend package="rospy"/> <depend package="roscpp"/> </package> </source>
ここで、<depend>属性には、最初のステージの依存関係がリストされています。 彼らが必要とするのは「間接的な」要件だけです。 毎回マニフェストを登らないようにするために、rospackコマンドを再び使用できます。
$ rospack depends1 tutorial std_msgs rospy roscpp $ rospack depends tutorial rospack roslib std_msgs rosgraph_msgs rosbuild roslang rospy cpp_common roscpp_traits rostime roscpp_serialization xmlrpcpp rosconsole roscpp
理論はほとんど残っていないので、最もおいしいコードの記述に移ります。
それから彼は私に言います...

したがって、将来のアプリケーションのフレームワークといくつかの理論的知識があります。 これらのとんでもない骨の上に肉を作り、ROSのプログラムがどのように見えるかを見てみましょう。
そして、あなたはコーディングします...
メッセージの発行者をすばらしいPython言語で作成します。 むしろ、それはハローワールドであるべきでしたが、私たちは独自の方法でメッセージのテキストを変更します! パッケージのあるフォルダーに行きましょう:
$ cd $(rospack find tutorial)
スクリプト用のフォルダーを作成します。
$ mkdir scripts
そして、その中に単純なテキストファイルを作成します。
$ vi ./scripts/talker.py
#!/usr/bin/env python # # import roslib roslib.load_manifest('tutorial') # . rospy ROS Python, #String - import rospy from std_msgs.msg import String def talker(): # chatter String pub = rospy.Publisher('chatter', String) # ROS, rospy.init_node('talker') # ROS , while not rospy.is_shutdown(): str = "Zooo! %s"%rospy.get_time() rospy.loginfo(str) pub.publish(String(str)) rospy.sleep(1.0) if __name__ == '__main__': try: talker() except rospy.ROSInterruptException: pass
これはトーカーモジュールであるため、公開するメッセージの形式を指定する必要があります。
$ echo "string str" > ./msg/Str.msg
次のデータ型がサポートされています。
- int8、int16、int32、int64(およびuint *)
- float32、float64
- ひも
- 時間、期間
- 他のmsgファイル
- 可変長および固定長の配列(それぞれ配列[]および配列[C])
必要なのは、1つのパラメーターに対応する1行で、テキストフィールドに必要なフィールドをリストするだけです。 「それだけですか?」読者は尋ねます。 まあ、一般的には、はい。 msgコードはローカルメイクによって生成されます。 ところで、私たちがやる時です。
$ vi ./CMakeLists.txt
必要なのは、次の行のコメントを外すことだけです。
rosbuild_genmsg()
これにより、ノードが情報を誰かと共有したいことをシステムが理解し、適切なコードをコンパイルする必要があります。
すべて、コンソールに入力します
$ make $ chmod +x ./scripts/listener.py
楽しんでください。 はい、ここのPythonでは、実際にはメッセージ用にmakeも必要です。 chmodはファイルを実行可能としてマークします(これは重要です!)。
それまでの間、私たちは同様に素晴らしいC ++言語で対話者に対処します。 はい、msgsメカニズムにより、まったく異なるノードが問題や不要なジェスチャーなしで通信できます。
新しいパッケージを作成します。
$ roscreate-pkg tutorialSubscriber roscpp std_msgs $ cd tutorialSubscriber/ $ vi ./src/listener.cpp
#include "ros/ros.h" #include "std_msgs/String.h" void chatterCallback(const std_msgs::String::ConstPtr& msg) { // ROS_INFO("There something on the line! [%s]", msg->data.c_str()); } int main(int argc, char **argv) { // listener ros::init(argc, argv, "listener"); ros::NodeHandle n; //, chatter, 1000, // - chatterCallback ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); //spin callback , ROS ros::spin(); return 0; }

vi ./CMakeLists.txt
最後から2番目の行を次の形式にする必要があります。
rosbuild_add_executable(listener src/listener.cpp)
ここでもmakeを実行しますが、実行可能ファイルをコンパイルします。
すべて、作業を評価するために残り、最大4つのターミナルを開きます。
- roscoreはマスタープロセスを起動します
- rosrunチュートリアルtalker.pyはPublisherを起動します
- rosrun tutorialSubcriberリスナーはサブスクライバーを起動します
- rxgraphはノード接続図を表示します
この図は、メッセージテキストが2回印刷されることを示しています-リスナーノード上と標準出力の類似であるrosout上。
その間...
一方、党は勢いを増しています。 人々は条件に達し、ビリヤードの小さなゲームをプレイすることにしました。 しかし、何かがうまくいかなかった...