ロボットオペレーティングシステム:ROS 1からROS 2へ移行するための実用的ガイド


ROS 2は、現代のコードベースにROS生態系を近代化するために進行中の努力です.これはいくつかの変更が含まれています:Pythonベースのビルドシステムは、C/C++言語の標準、新しいCLIコマンドとノード、トピック、メッセージの更新アーキテクチャを更新しました.
私はロボットのプロジェクターを始めたとき、私は排他的にross 1を使用しました.したがって、私のロボットに関するコードベース- urdfファイルund rviz起動ファイル- ross 1で開発されました.2021年4月にrosの機能なしで最初の移動プロトタイプを完成し,5月にプロトタイプにrosを追加し始めた.私はその後、私のプロジェクトは、最大のデータコードベースを使用するようにROS 2に切り替えた.
この記事はRoS 1からROS 2へのロボット定義とRViZ起動ファイルを動かすときに学んだ私のレッスンをまとめます.
この記事はもともと私のブログに登場admantium.com .

Pythonビルドシステムで新しいROS 2パッケージを作成する
Pythonビルドシステムを使用して依存関係を構成し、次にROS 1からROS 2にUrdfファイルを移行する新しいROS 2パッケージを作成しましょう.次の手順は緩やかに続くROS2 navigation チュートリアル.

パッケージの作成
新しいROS 2パッケージを作成すると、2つのビルド型を選択できます.ROS 1から来ることament_cmake パッケージのビルド手順を管理するCMakeファイルを作成します.新しいPythonビルドシステムを採用していますament_python 代わりに中央のPythonファイルを提供します.
ros2 pkg create --build-type ament_python radu_bot

パッケージに依存関係を追加します.XML
新しいノードを正しく起動するためには、他の依存関係を追加する必要がありますROS packages , プロジェクトに.を使用すると、すでに依存関係を設定できますpkg create --add-dependencies しかし、私は手動でそれらを加えるのが好きです.
必要な依存関係は以下の通りです.

  • rviz2 : RVizシミュレーションツールが含まれています

  • urdf : urdfファイル形式のためのC++パーサー

  • joint_state_publisher : URDF記述ロボットのすべての非静的ジョイントの状態を発行します.このパッケージはパラメータを読み込むrobot_description ROSパラメータサーバーからロボットの表現を構築する.次に,各関節の名前,位置,速度,労力を含むメッセージを連続的に発行する.

  • robot_state_publisher : このパッケージはrobot_description パラメータとjoint_states 上記のパッケージによって、ロボットの3 Dポーズ推定を計算するために発表されます.メッセージは以下のように発表されますtf2 メッセージは、他のすべてのROSのノードを一貫してすべての座標フレームにアクセスすることができます.

  • controller_manager : このパッケージはロボットへの直接のアクセスを可能にします.ロボットのハードウェアは、アクチュエータとセンサーであり、RvizとGazeboを含む他のROSノードとツールで使用できる一般的な形式で包まれています.

  • xacro : XACROを使用すると、Urdfファイルを作成する際に使用するXMLマクロを定義することができます.これは、コードの量を大幅に減らすことができます.
  • それらを定義する場所はpackage.xml ファイル.としてROS documentation , あなたは<depend> すべての依存関係のためのタグ.完全性のために、完全なファイルはここにあります.
    <?xml version="1.0"?>
    <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
    <package format="3">
      <name>radu_bot</name>
      <version>0.1.0</version>
      <description>Simulation of the RADU bot</description>
    
      <maintainer email="[email protected]">devcon</maintainer>
      <license>UNLICENSED</license>
    
      <depend>urdf</depend>
    
      <depend>joint_state_publisher</depend>
      <depend>joint_state_publisher_gui</depend>
      <depend>robot_state_publisher</depend>
      <depend>rviz2</depend>
      <depend>xacro</depend>
    
      <test_depend>ament_copyright</test_depend>
      <test_depend>ament_flake8</test_depend>
      <test_depend>ament_pep257</test_depend>
      <test_depend>python3-pytest</test_depend>
    
      <export>
        <build_type>ament_python</build_type>
      </export>
    </package>
    
    依存関係を追加したら、次の2つのコマンドをROS 2 Workspaceディレクトリに実行します.
    sudo apt-get install ros-foxy-joint-state-publisher-gui ros-foxy-xacro
    rosdep update
    rosdep install --from-paths src --ignore-src --rosdistro foxy -y
    

    起動ファイルを移行する
    ROS 2はもうXMLファイルをサポートしていません.代わりに、RVizやGazeboのようなツールを起動するだけでなく、ROSのノードを起動して設定するためにPythonファイルを使用しています.スクリプトであるので、宣言しているリストの代わりに起動に多くのロジックを構築することができます.しかし、構成複雑さはまだ高いです、例えば、あなたがシミュレーションの中でロボットを産み出して、動かしたいとき、あなたはまだ特別なコントローラまたはナビゲーション・ノードを起動する必要があります.
    古いXML起動ファイルには次の内容があります.
    <launch>
      <param name="robot_description" textfile="$(find car-robot)/urdf/bot.urdf"/>
      <arg name="rvizconfig" default="$(find urdf_tutorial)/rviz/urdf.rviz" />
      <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>
      <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>
      <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" />
    </launch>
    
    それは、これらの部分/概念から成ります:
  • The param 宣言は標準パラメータ名を定義しますrobot_description . それはあなたのロボット定義を含むURDFファイルを参照します.
  • The arg 宣言はRVIZ構成ファイルをロードします.そして、我々のロボットが自動的に表示されるように、それはセッティングを含みます.
  • つの制御ノードrobot_state_publisherjoint_state_publisher 作成されます-これらのノードは、ロボットとRVIZ
  • 最後に、我々はrviz ノードを設定ファイルに渡します.
  • これらのパーツは単純なルールに従ってRas 2 Pythonに翻訳されます<node> Pythonへの変換Node オブジェクトと<param> and <arg> タグはNode .
    この例をどう考えますかrobot_description が表される.
    <param name="robot_description" textfile="$(find car-robot)/urdf/bot.urdf"/>
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/>
    
    そしてPythonでは、これはrobot_state_publisher ノード.
    
    robot_description = open(robot_description_path).read()
    
    robot_state_publisher_node = launch_ros.actions.Node(
      package='robot_state_publisher',
      executable='robot_state_publisher',
      parameters=[{'robot_description': robot_description}]
    )
    
    すべてのノードを一緒に持っていれば、LaunchDescription リスト:
    def generate_launch_description():
      return launch.LaunchDescription([
        robot_state_publisher_node
      ])
    
    これらは必須のステップです.完全な起動ファイルは次のようになります.
    import launch
    from launch.substitutions import Command, LaunchConfiguration
    import launch_ros
    import os
    from ament_index_python.packages import get_package_share_directory
    
    def generate_launch_description():
      package_name = 'radu_bot'
    
      pkg_share = launch_ros.substitutions.FindPackageShare(package=package_name).find(package_name)
      robot_description_path = os.path.join(pkg_share, 'urdf/robot.urdf')
      rviz_config_path = os.path.join(pkg_share, 'config/urdf_config.rviz')
    
      robot_state_publisher_node = launch_ros.actions.Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        parameters=[{'robot_description': robot_description}]
      )
      joint_state_publisher_node = launch_ros.actions.Node(
        package='joint_state_publisher',
        executable='joint_state_publisher',
        name='joint_state_publisher'
      )
      joint_state_publisher_gui_node = launch_ros.actions.Node(
        package='joint_state_publisher_gui',
        executable='joint_state_publisher_gui',
        name='joint_state_publisher_gui'
      )
      rviz_node = launch_ros.actions.Node(
        package='rviz2',
        executable='rviz2',
        name='rviz2',
        output='screen',
        arguments=['-d', rviz_config_path],
      )
    
      return launch.LaunchDescription([
        joint_state_publisher_node,
        joint_state_publisher_gui_node,
        robot_state_publisher_node,
        rviz_node
      ])
    

    ビルド構成
    前に述べたように、Pythonのビルドシステムを使っています.Aの代わりにCMake ファイルを使うsetup.py ファイル.ここでは、プロジェクト(名前、管理者、バージョン)についてのさまざまなメタデータを定義し、ビルドされたファイルがどのように構成されているかを設定し、ros2 run .
    以下のファイルが十分です.
    import os
    from glob import glob
    from setuptools import setup
    
    package_name = 'radu_bot'
    
    setup(
        name=package_name,
        version='0.0.0',
        packages=[package_name],
        data_files=[
            ('share/' + package_name, ['package.xml']),
            (os.path.join('share', package_name, 'launch'), glob('launch/*')),
            (os.path.join('share', package_name, 'urdf'), glob('urdf/*')),
            (os.path.join('share', package_name, 'config'), glob('config/*')),
        ],
        install_requires=['setuptools'],
        zip_safe=True,
        maintainer='devcon',
        maintainer_email='[email protected]',
        description='Simulation of the RADU robot',
        license='UNLICENSED',
        tests_require=['pytest'],
        entry_points={
            'console_scripts': [
            ],
        },
    )
    

    ロボットモデルの追加
    ロボットファイルのために、私はXviroファイルの複雑なセットを使用しています.RVIZを使用する場合、変更はありません.しかし、Gazeboで動作するには、リンクとジョイントの追加プロパティを追加し、新しいタグを追加する必要があります.この複雑な話題を今後の論文で探る.

    パッケージのビルド
    私たちの新しいパッケージが完全に組み立てられたので、それを造りましょう.ROS 2では、colcon 同様にCベースとPythonベースのプロジェクトで動作するビルドツール.
    ビルドを開始するには、次のコマンドを使用します.
    $> colcon build --symlink-install --event-handlers console_direct+ --packages-up-to radu_bot
    
    その完了時には、使用してプログラムを起動することができますros2 launch PACKAGE_NAME LAUNCH_SCRIPT .
    $Y ros2 launch radu_bot rviz.launch.py
    [INFO] [launch]: All log files can be found below /home/devcon/.ros/log/2021-05-29-18-33-52-275784-giga-20756
    [INFO] [launch]: Default logging verbosity is set to INFO
    [INFO] [joint_state_publisher-1]: process started with pid [20758]
    [INFO] [joint_state_publisher_gui-2]: process started with pid [20760]
    [INFO] [robot_state_publisher-3]: process started with pid [20762]
    [INFO] [rviz2-4]: process started with pid [20764]
    [robot_state_publisher-3] Parsing robot urdf xml string.
    [robot_state_publisher-3] Link left_wheel_backside had 0 children
    [robot_state_publisher-3] Link left_wheel_frontside had 0 children
    [robot_state_publisher-3] Link right_wheel_backside had 0 children
    [robot_state_publisher-3] Link right_wheel_frontside had 0 children
    [robot_state_publisher-3] [INFO] [1622306032.679044506] [robot_state_publisher]: got segment base_link
    [robot_state_publisher-3] [INFO] [1622306032.681243514] [robot_state_publisher]: got segment left_wheel_backside
    [robot_state_publisher-3] [INFO] [1622306032.681317837] [robot_state_publisher]: got segment left_wheel_frontside
    [robot_state_publisher-3] [INFO] [1622306032.681341170] [robot_state_publisher]: got segment right_wheel_backside
    [robot_state_publisher-3] [INFO] [1622306032.681363438] [robot_state_publisher]: got segment right_wheel_frontside
    [rviz2-4] [INFO] [1622306033.746836459] [rviz2]: Stereo is NOT SUPPORTED
    [rviz2-4] [INFO] [1622306033.750165429] [rviz2]: OpenGl version: 4.6 (GLSL 4.6)
    [rviz2-4] [INFO] [1622306033.857522813] [rviz2]: Stereo is NOT SUPPORTED
    [joint_state_publisher-1] [INFO] [1622306034.345835955] [joint_state_publisher]: Waiting for robot_description to be published on the robot_description topic...
    [rviz2-4] Parsing robot urdf xml string.
    Centering
    [joint_state_publisher_gui-2] [INFO] [1622306035.104035974] [joint_state_publisher_gui]: Centering
    
    そして最後に、あなたのロボットがレンダリングされます.


    結論
    ros 2はros生態系にいくつかの変化をもたらした.このチュートリアルでは、ROS 1からROS 2へのロボット記述とRvizシミュレーションを移行する方法を示しました.主な変更点はPythonを受け入れることです.起動ファイルは宣言的なXMLファイルの代わりに必須のPythonスクリプトです.これは、ノードを起動して実行するために、はるかに多くの制御とスクリプトの力を与えます.また、パッケージのビルド言語としてPythonを使用することもできますsetup.py , ファイルをプロジェクトからインストールされたバージョンにコピーし、依存関係を管理し、ros2 run コマンド.
    次の記事では、RoszとGazeboシミュレーションと互換性のあるロボットのXACroベースURDF表現を実装することにより、このROS 2の説明を続けています.