ロボットオペレーティングシステム: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から来ること
パッケージに依存関係を追加します.XML
新しいノードを正しく起動するためには、他の依存関係を追加する必要がありますROS packages , プロジェクトに.を使用すると、すでに依存関係を設定できます
必要な依存関係は以下の通りです.
rviz2 : RVizシミュレーションツールが含まれています
urdf : urdfファイル形式のためのC++パーサー
joint_state_publisher : URDF記述ロボットのすべての非静的ジョイントの状態を発行します.このパッケージはパラメータを読み込む
robot_state_publisher : このパッケージは
controller_manager : このパッケージはロボットへの直接のアクセスを可能にします.ロボットのハードウェアは、アクチュエータとセンサーであり、RvizとGazeboを含む他のROSノードとツールで使用できる一般的な形式で包まれています.
xacro : XACROを使用すると、Urdfファイルを作成する際に使用するXMLマクロを定義することができます.これは、コードの量を大幅に減らすことができます. それらを定義する場所は
起動ファイルを移行する
ROS 2はもうXMLファイルをサポートしていません.代わりに、RVizやGazeboのようなツールを起動するだけでなく、ROSのノードを起動して設定するためにPythonファイルを使用しています.スクリプトであるので、宣言しているリストの代わりに起動に多くのロジックを構築することができます.しかし、構成複雑さはまだ高いです、例えば、あなたがシミュレーションの中でロボットを産み出して、動かしたいとき、あなたはまだ特別なコントローラまたはナビゲーション・ノードを起動する必要があります.
古いXML起動ファイルには次の内容があります.
The The つの制御ノード 最後に、我々は これらのパーツは単純なルールに従ってRas 2 Pythonに翻訳されます
この例をどう考えますか
ビルド構成
前に述べたように、Pythonのビルドシステムを使っています.Aの代わりに
以下のファイルが十分です.
ロボットモデルの追加
ロボットファイルのために、私はXviroファイルの複雑なセットを使用しています.RVIZを使用する場合、変更はありません.しかし、Gazeboで動作するには、リンクとジョイントの追加プロパティを追加し、新しいタグを追加する必要があります.この複雑な話題を今後の論文で探る.
パッケージのビルド
私たちの新しいパッケージが完全に組み立てられたので、それを造りましょう.ROS 2では、
ビルドを開始するには、次のコマンドを使用します.
結論
ros 2はros生態系にいくつかの変化をもたらした.このチュートリアルでは、ROS 1からROS 2へのロボット記述とRvizシミュレーションを移行する方法を示しました.主な変更点はPythonを受け入れることです.起動ファイルは宣言的なXMLファイルの代わりに必須のPythonスクリプトです.これは、ノードを起動して実行するために、はるかに多くの制御とスクリプトの力を与えます.また、パッケージのビルド言語としてPythonを使用することもできます
次の記事では、RoszとGazeboシミュレーションと互換性のあるロボットのXACroベースURDF表現を実装することにより、このROS 2の説明を続けています.
私はロボットのプロジェクターを始めたとき、私は排他的に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>
それは、これらの部分/概念から成ります:param
宣言は標準パラメータ名を定義しますrobot_description
. それはあなたのロボット定義を含むURDFファイルを参照します.arg
宣言はRVIZ構成ファイルをロードします.そして、我々のロボットが自動的に表示されるように、それはセッティングを含みます.robot_state_publisher
とjoint_state_publisher
作成されます-これらのノードは、ロボットとRVIZrviz
ノードを設定ファイルに渡します.<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の説明を続けています.
Reference
この問題について(ロボットオペレーティングシステム:ROS 1からROS 2へ移行するための実用的ガイド), 我々は、より多くの情報をここで見つけました https://dev.to/admantium/robot-operating-system-practical-guide-for-migrating-from-ros1-to-ros2-4k56テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol