diff --git a/requirements.txt b/requirements.txt index bff2306..5a8b4df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ sphinx>=7.3.7 -sphinx-book-theme>=1.1.3 myst-parser>=3.0.1 sphinx-copybutton>=0.5.2 diff --git a/source/conf.py b/source/conf.py index a87a0c3..92f12cd 100644 --- a/source/conf.py +++ b/source/conf.py @@ -26,4 +26,7 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'sphinx_book_theme' +html_theme = 'alabaster' +html_theme_options = { + 'fixed_sidebar': True, # do not move sidebar while scrolling +} diff --git a/source/programming/action.md b/source/programming/action.md index 7f74e61..b41eda0 100644 --- a/source/programming/action.md +++ b/source/programming/action.md @@ -1,25 +1,30 @@ # アクション通信 -## アクション通信とは? - アクション通信は一言で言うと、前回学んだ{doc}`/programming/topic`と{doc}`/programming/service`の両方を組み合わせたようなものです。 +リクエスを送る**クライアント**と、受け取ったリクエスに応じてレスポンスを返す**サーバ**が存在します。 +アクション通信の特徴として、サーバはレスポンスを返すまで、途中経過の値をクライアントに送り続けることが出来ます。 ```{note} アクション通信は使う頻度が少ない(?)ので飛ばしても大丈夫です。 必要になったら勉強してください。 ``` -### 今回の目標 +## 今回の目標 今回は以下のようなノードをもつ`hello_action`パッケージを作ってみましょう。 - `server_node.py` - - `hello_msgs/Sum`型の`/sum`アクションからメッセージを受け取る - - 1から受け取ったメッセージまでの総和をクライアントに送る - - 途中経過の値をfeedbackとして`tmp_sum`として送る + - `hello_msgs/Sum`型の`/sum`アクションからリクエスをを受け取り、クライアントにレスポンスを返す + - `goal`をクライアントから受け取り、1から`goal`までの総和をクライアントに送る + - 目標の値(`goal`)をgoalとして受け取る + - 総和の途中経過の値(`tmp_sum`)をfeedbackとして送る + - 総和(`sum`)をresultとして送る - `client_node.py` - - `hello_msgs/Sum`型の`/sum`アクションに送ってサーバからレスポンスを受け取る - - 途中経過の値のfeedbackを受け取る + - `hello_msgs/Sum`型の`/sum`アクションにリクエストを送って、サーバからレスポンスを受け取る + - `goal`をサーバに送り、1から`goal`までの総和をサーバから受け取る + - 目標の値(`goal`)をgoalとして送る + - 総和の途中経過の値(`tmp_sum`)をfeedbackとして受け取る + - 総和(`sum`)をresultとして受け取る ## パッケージの作成 @@ -29,7 +34,7 @@ ros2 pkg create --build-type ament_python hello_action ## server_node.pyのコード -`hello_action/hello_action/server_node.py`を以下の内容で書き込む。 +`hello_action/server_node.py`を以下の内容で書き込む。 ```py import rclpy @@ -73,7 +78,7 @@ def main(args=None): ## client_node.pyのコード -`hello_action/hello_action/client_node.py`を以下の内容で書き込む。 +`hello_action/client_node.py`を以下の内容で書き込む。 ```py import rclpy diff --git a/source/programming/custom-message.md b/source/programming/custom-message.md index 43ba278..962c4a2 100644 --- a/source/programming/custom-message.md +++ b/source/programming/custom-message.md @@ -34,7 +34,7 @@ ros2 pkg create --build-type ament_cmake hello_msgs mkdir msg ``` -`hello_msgs/msg/Person.msg`を以下の内容で保存してください。 +`msg/Person.msg`を以下の内容で保存してください。 ```none string name @@ -60,7 +60,7 @@ uint8 age mkdir srv ``` -`hello_msgs/srv/Order.srv`を以下の内容で保存してください。 +`srv/Order.srv`を以下の内容で保存してください。 ```none string menu @@ -89,7 +89,7 @@ string message mkdir action ``` -`hello_msgs/action/Sum.action`を以下の内容で保存してください。 +`action/Sum.action`を以下の内容で保存してください。 ```none uint64 goal @@ -203,10 +203,16 @@ source install/setup.bash $ ros2 interface show hello_msgs/msg/Person string name uint8 age +``` + +```bash $ ros2 interface show hello_msgs/srv/Order string menu --- string message +``` + +```bash $ ros2 interface show hello_msgs/action/Sum uint64 goal --- diff --git a/source/programming/hello-world.md b/source/programming/hello-world.md index 7f5a9d7..7f052af 100644 --- a/source/programming/hello-world.md +++ b/source/programming/hello-world.md @@ -48,13 +48,13 @@ $ tree この`hello_world`パッケージは`ament_python`形式なので上のようになっています。 -```{note} +```{caution} `hello_world/__init__.py`や`resouce/hello_world`ファイルは空ファイルですが、パッケージに必要なので消さないでください。 ``` ## コードの編集 -今回はコピペで構わないので以下のPythonのコードを`hello_world/hello_world/pub_node.py`に書いてください。 +今回はコピペで構わないので以下のPythonのコードを`hello_world/pub_node.py`に書いてください。 ```py import rclpy @@ -89,7 +89,7 @@ if __name__ == "__main__": main() ``` -同じように以下のコードを`hello_world/hello_world/sub_node.py`に書いてください。 +同じように以下のコードを`hello_world/sub_node.py`に書いてください。 ```py import rclpy @@ -206,8 +206,8 @@ cd ~/my_ws colcon build ``` -```{note} -必ず、ワークスペースのルートディレクトリで`colcon build`コマンドを実行してください。 +```{caution} +必ず、ワークスペースのルートディレクトリ(`~/my_ws`)で`colcon build`コマンドを実行してください。 ``` `colcon build`コマンドを実行すると`my_ws`に新たに、`build`、`install`、`log`ディレクトリが作成されます。 diff --git a/source/programming/launch.md b/source/programming/launch.md index ea035ee..913daf5 100644 --- a/source/programming/launch.md +++ b/source/programming/launch.md @@ -1,10 +1,8 @@ # Launchファイル -## Launchファイルとは? - ROSでは複数のノードを同時に立ち上げて、それぞれのノードからデータを送受信したりしています。 今までは`ros2 run`コマンドで1つ1つノードを立ち上げていましたが、実際には複数のノードをLaunchファイルというもので起動します。 -このLaunchファイルではトピック名やノード名、パラメータの値を変更出来るので非常に便利です。 +このLaunchファイルからトピック名やノード名、パラメータの値を変更出来るので非常に便利です。 ```{note} ここでは @@ -15,7 +13,7 @@ ROSでは複数のノードを同時に立ち上げて、それぞれのノー まだ作ってない人は先に、そちらをご覧ください。 ``` -### 今回の目標 +## 今回の目標 今回は以下のようなLaunchファイルをもつ`hello_launch`パッケージを作りましょう。 @@ -39,8 +37,8 @@ ROSでは複数のノードを同時に立ち上げて、それぞれのノー - `/number`トピックを`/double_number`トピックにリマップ - `m_number`パラメータを`4`に変更 -```{note} -今回はPythonでLaunchファイル書きますが、YAMLやROS 1時代ののXMLでもLaunchファイルを書けます。 +```{tip} +今回はPythonでLaunchファイルを書きますが、YAMLやROS 1時代のXMLでもLaunchファイルを書けます。 詳しくは[公式のチュートリアル(英語)](https://docs.ros.org/en/humble/How-To-Guides/Launch-file-different-formats.html)を読んでください。 ``` @@ -48,6 +46,11 @@ ROSでは複数のノードを同時に立ち上げて、それぞれのノー ```bash ros2 pkg create --build-type ament_cmake hello_launch +``` + +Launchファイルを保存する`launch`ディレクトリを作成します。 + +```bash cd hello_launch mkdir launch ``` @@ -103,7 +106,7 @@ ament_package() ## hello.launch.pyのコード -`hello_launch/launch/hello.launch.py`を以下の内容で書き込む。 +`launch/hello.launch.py`を以下の内容で書き込む。 ```py from launch import LaunchDescription @@ -126,7 +129,7 @@ def generate_launch_description(): ## two_double.launch.pyのコード -`hello_launch/launch/two_double.launch.py`を以下の内容で書き込む。 +`launch/two_double.launch.py`を以下の内容で書き込む。 ```py from launch import LaunchDescription @@ -158,7 +161,7 @@ def generate_launch_description(): ## double_and_multiply.launch.pyのコード -`hello_launch/launch/double_and_multiply.launch.py`を以下の内容で書き込む。 +`launch/double_and_multiply.launch.py`を以下の内容で書き込む。 ```py from launch import LaunchDescription diff --git a/source/programming/parameter.md b/source/programming/parameter.md index 097d08f..fb22bb1 100644 --- a/source/programming/parameter.md +++ b/source/programming/parameter.md @@ -1,9 +1,9 @@ # パラメータ -## パラメータとは? - ROSではパラメータというものを設定することが出来ます。 -これはプログラムを実行する前に値を任意に変更することが出来て、ソースコードを変えることなく自由に値を変えられます。 +これはプログラムを実行する前に値を任意に変更することが出来て、ソースコードを変えることなく値を自由に変えられます。 + +## 今回の目標 今回は以下のようなノードをもつ`hello_param`パッケージを作ってみましょう @@ -19,7 +19,7 @@ ros2 pkg create --build-type ament_python hello_param ## multiply_node.pyのコード -`hello_param/hello_param/multiply_node.py`を以下の内容で書き込む。 +`hello_param/multiply_node.py`を以下の内容で書き込む。 ```py import rclpy diff --git a/source/programming/service.md b/source/programming/service.md index ec2bfae..3e8511a 100644 --- a/source/programming/service.md +++ b/source/programming/service.md @@ -1,12 +1,10 @@ # サービス通信 -## サービス通信とは? - サービス通信では**クライアント**と**サーバ**が存在します。 クライアントはデータをリクエストしてサーバからのレスポンスを受け取り、サーバはクライアントからのリクエストに応じてレスポンスを送ります。 TCP/IP通信をイメージすると分かりやすいと思います。 -### 今回の目標 +## 今回の目標 今回は以下のようなノードをもつ`hello_service`パッケージを作ってみましょう。 @@ -25,7 +23,7 @@ ros2 pkg create --build-type ament_python hello_service ## server_node.pyのコード -`hello_service/hello_service/server_node.py`を以下の内容で書き込む。 +`hello_service/server_node.py`を以下の内容で書き込む。 ```py import rclpy @@ -60,7 +58,7 @@ if __name__ == "__main__": ## client_node.pyのコード -`hello_service/hello_service/client_node.py`を以下の内容で書き込む。 +`hello_service/client_node.py`を以下の内容で書き込む。 ```py import rclpy diff --git a/source/programming/topic.md b/source/programming/topic.md index 3d4feed..d017f3a 100644 --- a/source/programming/topic.md +++ b/source/programming/topic.md @@ -1,12 +1,10 @@ # トピック通信 -## トピック通信とは? - トピック通信ではデータを送る**パブリッシャ**とデータを受け取る**サブスクライバ**が存在します。 パブリッシャは任意のトピックにデータを連続的に送り続け、サブスクライバは任意のトピックに送られたデータを受け取ることができます。 UDP通信をイメージすると分かりやすいと思います。 -### 今回の目標 +## 今回の目標 今回は以下のようなノードをもつ`hello_topic`パッケージを作ってみましょう @@ -25,7 +23,7 @@ ros2 pkg create --build-type ament_python hello_topic ## iteration_node.pyのコード -`hello_topic/hello_topic/iteration_node.py`を以下の内容で書き込む。 +`hello_topic/iteration_node.py`を以下の内容で書き込む。 ```py import rclpy @@ -63,7 +61,7 @@ if __name__ == "__main__": ## double_node.pyのコード -`hello_topic/hello_topic/double_node.py`を以下の内容で書き込む。 +`hello_topic/double_node.py`を以下の内容で書き込む。 ```py import rclpy