ROS シリーズ: 第 4 章 (3)

4. ROSの運用管理

この章は主に、異なる機能パッケージの関連付け、多数の ROS ノード、機能パッケージ、ノード、トピックの開始、パラメータの重複、異なるホスト上のノード間の通信の問題など、マルチレベルのディープ ROS システムを解決することを目的としています。

  • メタ関数パッケージの使用構文をマスターします。
  • 起動ファイルの使用構文をマスターします。
  • ROS ワークスペースの対象範囲と、どのようなセキュリティ リスクが存在するかを理解します。
  • ノード名が重複した場合の処理​​方法をマスターしてください。
  • トピック名が重複した場合の対処方法をマスターしてください。
  • パラメータ名が重複した場合の処理​​方法をマスターしてください。
  • ROS分散通信を実現できます。

1. ROSメタ関数パッケージ

メタパッケージは、Linux ファイル管理システムの概念です。ROS の仮想パッケージであり、実体はありませんが、他のソフトウェア パッケージに依存しており、他のパッケージを組み合わせることができます。

効果:

メタ関数パッケージは ROS の他の関数パッケージに依存しており、このパッケージをインストールするときに他の依存関係もインストールされます。

実装プロセス:

  1. src を右クリックし、「Catkin パッケージの作成」を選択します。
  2. 関数パッケージの名前 plumbing_my を入力し、関数パッケージの依存関係に依存しない関数パッケージを追加し、Enter キーを押した後にその依存関係パッケージを package.xml に追加します。

<exec_depend>plumbing_pub_sub</exec_depend>
<exec_depend>plumbing_server_client</exec_depend>
<exec_depend>plumbing_param_server</exec_depend>

メタ機能パッケージの追加リクエスト:

<export>
 <!-- Other tools can request additional information be placed here -->
 <metapackage/>
</export>
  1. CMakeLists.txt を変更します。内容は次のとおりです。

    cmake_minimum_required(VERSION 3.0.2)
    project(demo)
    find_package(catkin REQUIRED)
    catkin_metapackage()
    

    注: CMakeLists.txt の最後の行には改行を含めることはできません。コードは 4 行のみで、2 行目は関数パッケージの名前です。

    コンパイルして実行するだけです。

2. ROS ノードが実行され、起動ファイルを管理します

起動ファイルは XML 形式のファイルで、複数のローカルおよびリモート ノードを起動でき、パラメータ サーバーにパラメータを設定することもできます。
機能:

ノードの構成と起動を簡素化し、ROSプログラムの起動効率を向上させます。

使用方法:
小さなカメを例に挙げます。

  1. 新しい起動ファイルを作成する
    関数パッケージの下に起動ディレクトリを追加し、そのディレクトリの下に新しい xxxx.launch ファイルを作成し、起動ファイルを編集します。
<launch>
    <node pkg="turtlesim" type="turtlesim_node"     name="myTurtle" output="screen" />
    <node pkg="turtlesim" type="turtle_teleop_key"  name="myTurtleContro" output="screen" />
</launch>
  1. 起動ファイルを呼び出す
roslaunch 包名 xxx.launch

**注意: ** roslaunch コマンドが起動ファイルを実行すると、roscore があるかどうかが自動的に判断され、ない場合は roscore を呼び出します。ctrl+shift+~ でターミナルをすばやく起動します。

2.1 起動ファイル - 起動ラベル

このタグはすべての起動ファイルのルート タグであり、他のタグのコンテナとして機能します。

属性:

deprecated = "非推奨の宣言"

効果:

現在の起動ファイルは非推奨であり、実行されないことをユーザーに通知します。

サブセットラベル:

他のすべてのタグは launch の子です

コード例:

<launch deprecated = "当前版本已经过时,请停止使用!">
    <node pkg="turtlesim" type="turtlesim_node"     name="myTurtle" output="screen" />
    <node pkg="turtlesim" type="turtle_teleop_key"  name="myTurtleContro" output="screen" />
</launch>

2.2 起動ファイル - ノードラベル

ラベルは、ROS ノードを指定するために使用され、最も一般的なラベルです。なお、roslaunch コマンドは、ノードの宣言順にノードを起動することを保証できません (ノードの起動はマルチプロセスです)。 )

属性:

属性 関数
pkg="パッケージ名" ノードが属するパッケージ
type=”ノードタイプ” ノードタイプ(同名実行可能)
名前=「ノード名」 NodeName (ROS ネットワーク トポロジ内のノードの名前)
args="xxx xxx xxx" (オプション) パラメータをノードに渡す
machine="マシン名" 指定されたマシン上でノードを起動します
respawn="true|false" (オプション) ノードが終了した場合に自動的に再起動するかどうか
respawn_lay = "N" (オプション) respawn が true の場合、N 秒の遅延後にノードを開始します
required="true|false" (オプション) ノードが必須かどうか。true の場合、ノードが終了すると、roslaunch 全体が強制終了されます。
ns="xxx" (オプション) 指定された名前空間 xxx でノードを起動します
clear_params="true|false" (オプション) 開始する前に、ノードのプライベート空間のすべてのパラメータを削除してください
Output="log|screen" (オプション) ログ送信対象。ログファイルまたは画面画面に設定できます。デフォルトはログです。

サブセットラベル:

  • env 環境変数の設定
  • remap ノード名を再マップします
  • rosparamパラメータ設定
  • paramパラメータの設定

コード例:

<?xml version="1.0"?>
<launch>
<!-- <launch deprecated="此文件已经过时,不建议使用!"> -->

    <!-- 启动的节点 -->
    <!-- respawn="true" 节点关闭后自动重启 -->
    <!-- respawn_delay="10" 在respawn设置为true后可以通过delay延时自动启动节点  -->
    <!-- required="true"  节点退出后关闭整个roslaunch -->
    <!-- 当上述三个在一行时,可能会出现错误提示The traceback for the exception was written to the log file -->
    <!-- ns="hello"可以在指定命名空间启动节点  避免重名问题 -->
    <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen" />

    <!-- 键盘控制节点 -->
    <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>


</launch>

2.3起動ファイル - タグを含める

属性:

  • file="$(パッケージ名を検索)/xxx/xxx.launch"

    含めるファイルパス

  • ns="xxx" (オプション)

    指定された名前空間にファイルをインポートします

効果:

他の XML 形式の起動ファイルを現在のファイルにインポートするために使用されます。

サブセットラベル:

  • env 環境変数の設定
  • arg は、インクルードされたファイルに引数を渡します

コード例:

<launch>
    <!-- 包含文件路径   $(find 功能包名)/xxx/yyy.launch   -->
    <include file="$(find launch01_basic)/launch/start_turtle.launch"/>
</launch>

2.4起動ファイル - ラベルの再マップ

属性:

  • file="$(パッケージ名を検索)/xxx/xxx.launch"

    含めるファイルパス

  • ns="xxx" (オプション)

    指定された名前空間にファイルをインポートします

効果:

トピックの名前変更用

サブセットラベル:

  • なし

コード例:

<?xml version="1.0"?>
<launch>
<!-- <launch deprecated="此文件已经过时,不建议使用!"> -->

    <!-- 启动的节点 -->
    <!-- respawn="true" 节点关闭后自动重启 -->
    <!-- respawn_delay="10" 在respawn设置为true后可以通过delay延时自动启动节点  -->
    <!-- required="true"  节点退出后关闭整个roslaunch -->
    <!-- 当上述三个在一起时,会出现错误提示The traceback for the exception was written to the log file -->
    <!-- ns="hello"可以在指定命名空间启动节点  避免重名问题 -->
    <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
    </node>
    <!-- 键盘控制节点 -->
    <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>   
</launch>

コード実装関数:

ros 組み込みキーボード制御ノードによって送信されるトピック名は /cmd_vel であり、タートル GUI は /turtle1/cmd_vel をサブスクライブします。トピック名が矛盾しているため、キーボード制御ノードを直接使用してタートルを制御することはできません。 gui であるため、タートル GUI を生成するノード ノードは次のようにする必要があります。ラベルはトピック名を再定義します。つまり、/turtle1/cmd_vel は /cmd_vel" に変更されます。rostopic リストを使用して、現在のトピック通信リストを表示できます。

rqt_graph を使用して、現在のトピックのコミュニケーションをより明確に取得します

2.5起動ファイル—paramタグ

属性:

  • name="名前空間/パラメータ名"

    パラメータ名。名前空間を含めることができます。

  • value="xxx" (オプション)

    パラメータ値を定義します。ここで省略した場合は、パラメータ ソースとして外部ファイルを指定する必要があります。

  • type="str|int|double|bool|yaml" (オプション)

    パラメータのタイプを指定します。指定されていない場合、roslaunch はパラメータのタイプを決定しようとします。ルールは次のとおりです。

    • 「.」を含む数値は浮動小数点型として解析されない場合、それ以外の場合は整数型になります。
    • 「true」と「false」はブール値です(大文字と小文字は区別されません)。
    • それ以外は文字列です

効果:

パラメータサーバー上のパラメータ設定に適用され、パラメータソースはタグ内の値で定義するか、外部ファイルからロードできます。ノードタグ内にある場合、プライベート名前空間と同等です。

サブセットラベル:

  • なし

コード例:

<?xml version="1.0"?>
<launch>
<!-- <launch deprecated="此文件已经过时,不建议使用!"> -->

    <!-- 启动的节点 -->
    <!-- respawn="true" 节点关闭后自动重启 -->
    <!-- respawn_delay="10" 在respawn设置为true后可以通过delay延时自动启动节点  -->
    <!-- required="true"  节点退出后关闭整个roslaunch -->
    <!-- 当上述三个在一起时,会出现错误提示The traceback for the exception was written to the log file -->
    <!-- ns="hello"可以在指定命名空间启动节点  避免重名问题 -->
    <!-- param标签 使用:向参数服务器设置参数 -->
    <!-- param标签格式1 会在参数前私有命名,node节点名称 -->
    <param name="param_A"  type="int" value="100"/>
    <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
        <!-- param标签格式2 launch目录下,node标签外 -->
        <param name="param_B" type="double" value="3.14"/>
    </node>
    <!-- 键盘控制节点 -->
    <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>   
</launch>

コード実装関数:

param パラメータにパラメータを設定します。rosparam リストで表示でき、rosparam get /xxx を通じてパラメータを取得できます。

2.6起動ファイル—rosparamタグ

属性:

  • command="load | dump | delete" (オプション、デフォルトのロード)

    パラメータのロード、エクスポート、または削除

  • file=“$(xxxxxを検索)/xxx/yyy…”

    ロードまたはエクスポートする yaml ファイル

  • param="パラメータ名"

  • ns="名前空間" (オプション)

効果:

yaml ファイルからパラメータをインポートするか、yaml ファイルにパラメータをエクスポートします。また、パラメータの削除にも使用できます。node タグの下で定義されている場合、プライベートとみなされます。

サブセットラベル:

  • なし

コード例:

start_turtle.launch

<?xml version="1.0"?>
<launch>
    <!-- <launch deprecated="此文件已经过时,不建议使用!"> -->

    <!-- 启动的节点 -->
    <!-- respawn="true" 节点关闭后自动重启 -->
    <!-- respawn_delay="10" 在respawn设置为true后可以通过delay延时自动启动节点  -->
    <!-- required="true"  节点退出后关闭整个roslaunch -->
    <!-- 当上述三个在一起时,会出现错误提示The traceback for the exception was written to the log file -->
    <!-- ns="hello"可以在指定命名空间启动节点  避免重名问题 -->
    <!-- param标签 使用:向参数服务器设置参数 -->
    <!-- param标签格式1 launch目录下,node标签外 -->
    <param name="param_A" type="int" value="100"/>
    <!-- rosparam 使用:操作参数服务器数据 -->
    <!-- rosparam格式1: launch 下,node 外 -->
    <!-- 加载参数 -->
    <rosparam command="load" file="$(find launch01_basic)/launch/params.yaml"/>

    <!-- 导出参数 -->
    <!-- <rosparam command="dump" file="$(find launch01_basic)/launch/params_out.yaml"/> -->

    
    <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen">
        <remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
        <!-- param标签格式2 node标签内  会在参数前私有命名,node节点名称-->
        <param name="param_B" type="double" value="3.14"/>
        <!--rosparam格式2: node 内 -->
        <rosparam command="load" file="$(find launch01_basic)/launch/params.yaml"/>

    </node>
    <!-- 键盘控制节点 -->
    <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>
</launch>

ダンプ.起動

<?xml version="1.0"?>
<launch>
    <rosparam command="dump" file="$(find launch01_basic)/launch/params_out.yaml"/>
    <!-- 删除参数 -->
    <rosparam command="delete" param="bg_B"/> 
</launch>

コード実装関数:

rosparam コマンドを使用して、param パラメータにパラメータを設定します。rosparam リストで表示でき、rosparam get /xxx を通じてパラメータを取得できます。

知らせ:

1. yaml ファイルで三原色を設定する場合、コロンの後にスペースを追加する必要があります。追加しないとエラーが報告されます。

2. rosparam が優先され、rosparam が最初に実行されるため、エクスポート データがターゲット パラメーターでない場合は、別の起動ファイルを設定して yaml ファイルをエクスポートできます。

2.7起動ファイル - グループラベル (group)

属性:

  • ns="名前空間" (オプション)

  • clear_params="true|false" (オプション)

    開始する前に、グループ名前空間のすべてのパラメータを削除するかどうか (使用には注意してください...この機能は危険です)

効果:

ns 属性を使用してノードをグループ化すると、ノードを名前空間に所属させることができます。

サブセットラベル:

  • 起動タグ以外のタグ

コード例:

タートルズ.ローンチ

<?xml version="1.0"?>
<launch>

    <!-- 同时启动两队乌龟GUI以及键盘控制节点 -->
    <group ns="first">
        <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen"/>
        <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>
    </group>
    <group ns="second">
        <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen"/>
        <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>
    </group>
</launch>

コード実装関数:

グループ化後、2 つの GUI の名前は同じですが、後から起動した GUI が前のプログラムを停止することはありません。

2.8起動ファイル - 引数ラベル

属性:

  • name="パラメータ名"

  • default="デフォルト値" (オプション)

  • value="値" (オプション)

    デフォルトと共存できません

  • doc="説明"

    パラメータの説明

効果:

関数パラメータと同様に、動的なパラメータの受け渡しに使用され、起動ファイルの柔軟性を高めることができます。

サブセットラベル:

  • なし

コード例:

タートルズ.ローンチ

<?xml version="1.0"?>
<launch>

    <!-- 演示arg的使用,需要设置多个参数,参数使用的是同一个值(小车长度) -->
    <!-- <param name="A" value="0.5"/>
    <param name="B" value="0.5"/>
    <param name="C" value="0.5"/> -->

    <arg name="car_length" default="0.55"/>
    
    <param name="A" value="$(arg car_length)"/>
    <param name="B" value="$(arg car_length)"/>
    <param name="C" value="$(arg car_length)"/>
</launch>

コード実装関数:

グローバル変数を宣言して値を割り当てるのと同様に、後で変数の値を直接変更できるため、行ごとに変更する手間が省けます。

動的パラメータ受け渡し関数:

roslaunch launch01_basic arg.launch car_length:=0.6

3. ROS ワークスペースの適用範囲の問題

ROS ワークスペースのカバレッジの問題を回避するように努めてください。

**問題の説明: **異なるワークスペースで、関数パッケージが同じ名前を持つ場合があるため、この名前の関数パッケージを呼び出すと、間違ったパスの関数パッケージが呼び出され、混乱が生じる可能性があります。通話時に発生します。

理由分析: ROS は、隠しフォルダーの .bashrc ファイルを解析し、ROS パッケージのパスを生成します。パス情報は、.bashrc で構成されたワークスペースの順序に従ってパスの優先順位を配置します。つまり、最後の構成が最も高い優先順位を持ちます。値が低いほど、現在のパスの優先順位が echo コマンドで表示され、プログラムが呼び出されたときに、前にある高い優先順位が最初に使用されます。サンプルコードは次のとおりです。

echo $ROS_PACKAGE_PATH 

**結論:** 関数パッケージが同じ名前の場合、呼び出しの優先順位が存在します。つまり、最後の設定が最初に実行され、ROS_PACKAGE_PATH を通じて確認できます。

バグの説明:

複数のワークスペースが .bashrc ファイルでソースされている場合、ROS パッケージ パスに含まれるワークスペースが 2 つだけになる場合があるため、カスタム ワークスペースの build ディレクトリと devel ディレクトリを削除し、catkin_make を再実行して、.bashrc ファイルを再ロードできます。問題が解決しました

4. ROS ノード名が重複しています

同じ名前でノードを起動する場合、または同じノードを複数回起動する必要がある場合は、ROS ノード名の重複の問題に注意する必要があります。

**概念:**ネームスペースは名前に接頭辞を追加することであり、名前の再マッピングは名前のエイリアスを作成することです。これらの戦略はどちらもノードの重複名の問題を解決できます。これら 2 つの戦略を実装するにはさまざまな方法があります。

  • rosrunコマンド
  • 起動ファイル
  • エンコーディングの実装

上記の 3 つの方法は、名前空間または名前の再マッピングによってノード名の重複を回避できます。このセクションでは、3 つの使用法を 1 つずつ説明します。3 つによって実現される要件は似ています。

4.1rosrun の名前空間の設定と再マッピング

4.1.1rosrun セット名前空間

構文: rosrun パッケージ名 ノード名 __ns:= 新しい名前

コード例:

rosrun turtlesim turtlesim_node __ns:=ergouzi
rosrun turtlesim turtlesim_node __ns:=dagouzi

両方のノードが稼働しています。

4.1.2 rosrun 名の再マッピング

構文: rosrun パッケージ名 ノード名 __name:= 新しい名前

コード例:

rosrun turtlesim  turtlesim_node __name:=daqiang
rosrun turtlesim  turtlesim_node __name:=xiaoqiang

両方のノードが稼働しています。

4.1.3 rosrun 名前空間と名前の再マッピングの重ね合わせの使用

语法: rosrun 包名 节点名 __ns:=新名称 __name:=新名称

コード例:

rosrun turtlesim  turtlesim_node __ns:=ergouzi __name:=daqiang 
rosrun turtlesim  turtlesim_node __ns:=dagouzi __name:=xiaoqiang

両方のノードが稼働しています。

甚至可以直接用  rosrun turtlesim  turtlesim_node /turtlesim_node:=daqiang  即/节点名称:=新名称

4.2 起動ファイル設定の名前空間と再マッピング

起動ファイルの構文を使用する場合、ノード タグには name と ns という 2 つの属性があり、それぞれ名前の再マッピングと名前空間の設定を実装するために使用されます。また、起動ファイルを使用してネームスペースと名前の再マッピングを設定することも比較的簡単です。

起動ファイル:

<?xml version="1.0"?>
<launch>
    <node name="turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen"/>
    <!-- 名称重映射 -->
    <node name="t1" pkg="turtlesim" type="turtlesim_node" output="screen"/>
    <!-- 命名空间 -->
    <node name="turtlesim" ns="ergouzi" pkg="turtlesim" type="turtlesim_node" output="screen"/> 
    <!-- 命名空间 + 名称重映射 -->
    <node name="t2" ns="dagouzi" pkg="turtlesim" type="turtlesim_node" output="screen"/> 
</launch>

起動ファイルのノード タグには、name 属性が存在する必要があります。ns 名前空間はオプションです。

操作結果:

rosnode list
/dagouzi/t2
/ergouzi/turtlesim
/rosout
/t1
/turtlesim

ここから、ノード ラベルの呼び出しは厳密にプログラミングの順序で実行されるわけではなく、呼び出しの逆の順序で実行される可能性があることもわかります。

4.3 エンコーディング設定の名前空間と再マッピング

ノードの実装をカスタマイズすると、名前空間の設定と名前の再マッピングをより柔軟に実装できます。

4.3.1 C++ 実装: 再マッピング

4.3.1.1 ネームエイリアスの設定

コアコード:ros::init(argc,argv,"zhangsan",ros::init_options::AnonymousName);

4.3.1.2 実行

名前にはタイムスタンプが付加されます。

4.3.2 C++ 実装: 名前空間

4.3.2.1 名前空間の設定

コアコード

  std::map<std::string, std::string> map;
  map["__ns"] = "xxxx";
  ros::init(map,"wangqiang");
Copy
4.3.2.2 実行効果

ノード名は名前空間を設定します。

おすすめ

転載: blog.csdn.net/TianHW103/article/details/127625482