Skip to content

Commit

Permalink
docs: update to follow up stream (#12)
Browse files Browse the repository at this point in the history
* docs: add rosdep install command (#29)

* docs: to accomodate the PR#30 in autoware-practice, update the command to run the node that publishes Trajectory (#27)

* docs: modify node diagram around the trajectory_follower node (#30)

* docs: add chapter1 docs (#28)

* docs: to use Humble, modify the rosdep command (#31)

* docs: add 2-4 (#23)

---------

Co-authored-by: Masahiro Kubota <[email protected]>
  • Loading branch information
taikitanaka3 and masahiro-kubota authored Jun 10, 2024
1 parent 6364080 commit 7bfea3e
Show file tree
Hide file tree
Showing 14 changed files with 161 additions and 26 deletions.
Binary file modified docs/course/images/2-3/node_diagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/2-4/PlotJuggler1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/2-4/PlotJuggler2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/2-4/PlotJuggler3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/2-4/node_diagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/2-4/pure_pursuit.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/2-4/trajectory_zigzag.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/vehicle-backward-judging.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/vehicle-backward-success.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/vehicle-turning-judging.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/course/images/vehicle-turning-success.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions docs/course/index.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
git clone https://github.com/AutomotiveAIChallenge/autoware-practice.git
cd autoware-practice
vcs import src < autoware.repos
rosdep install -y --from-paths src --ignore-src --rosdistro humble
colcon build --symlink-install
```

Expand Down
52 changes: 42 additions & 10 deletions docs/course/vehicle.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,30 +47,62 @@ ros2 run autoware_practice_course vehicle_forward

## 01-02. 車両の旋回

!!! warning

作成中
- steering_tire_angle を変更して車両を左右のどちらかに動かす
先程と同様に下記のコマンドを実行し、シミュレーターを起動してください。緑色のエリアに車両が入れば課題達成となるため、車両を旋回させるノードを作成していきます。

```bash
ros2 launch autoware_practice_launch practice.launch.xml problem:=vehicle_turning
```

![vehicle-turning-judging](./images/vehicle-turning-judging.png)

先程利用したサンプルのデータを変更して、車両が旋回するようにします。

- [vehicle/forward.hpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/vehicle/forward.hpp)
- [vehicle/forward.cpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/vehicle/forward.cpp)

## 01-03. 車両の後退
```diff
- command.lateral.steering_tire_angle = 0.0;
+ command.lateral.steering_tire_angle = 2.0;
```

!!! warning
コードを書き換えたらビルドして実行します。新しい端末を起動して以下のコマンドを実行してください。 上手く出来ていればシミュレーターの車両が動き、条件を満たして結果が SUCCESS になります。

作成中
- ギアを変更して REVERSE にする
- speed と acceleration を変更して車両を後退させる
- 後退の場合は speed が負で acceleration は正になる
```bash
colcon build --symlink-install --packages-select autoware_practice_course
ros2 run autoware_practice_course vehicle_forward
```

![vehicle-turning-success](./images/vehicle-turning-success.png)

## 01-03. 車両の後退

下記のコマンドを実行し、シミュレーターを起動してください。この緑色のエリアに車両が入れば課題達成となるため、まずは車両を後退させるノードを作成していきます。

```bash
ros2 launch autoware_practice_launch practice.launch.xml problem:=vehicle_backward
```
![vehicle-backward-judging](./images/vehicle-backward-judging.png)


以下に後退するためのコマンドを送信するノードのサンプルを用意しました。直進するためのコードと異なり、ギアを制御するコードが含まれています。サンプルでは停止保持するコマンドを送信し続けるようになっているので、データを変更して車両が後退するようにします。
ギアがREVERSEのときは、目標加速度を正、目標速度を負にします。

- [vehicle/backward.hpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/vehicle/backward.hpp)
- [vehicle/backward.cpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/vehicle/backward.cpp)

```diff
- command.longitudinal.speed = 0.0;
- command.longitudinal.acceleration = -2.5;
+ command.longitudinal.speed = -3.0;
+ command.longitudinal.acceleration = 1.0;
```

コードを書き換えたらビルドして実行します。新しい端末を起動して以下のコマンドを実行してください。 上手く出来ていればシミュレーターの車両が動き、条件を満たして結果が SUCCESS になります。

```bash
colcon build --symlink-install --packages-select autoware_practice_course
ros2 run autoware_practice_course vehicle_backward
```

![vehicle-backward-success](./images/vehicle-backward-success.png)

134 changes: 118 additions & 16 deletions docs/course/velocity_planning.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@

まず、車両の速度を取得してみましょう。

車両の速度は/localization/kinematic_stateというトピックでパブリッシュされます
/localization/kinematic_stateには自車両の位置、姿勢、速度、角速度とそれらの共分散行列の情報が含まれています。
車両の速度は`/localization/kinematic_state`というトピックでパブリッシュされます
`/localization/kinematic_state`には自車両の位置、姿勢、速度、角速度とそれらの共分散行列の情報が含まれています。

本来Autowareでは以下のノードダイアグラムのように、GNSS、Lidar、IMUなどの情報をもとにekf_localizerが/localization/kinematic_stateを計算します
本来Autowareでは以下のノードダイアグラムのように、GNSS、Lidar、IMUなどの情報をもとにekf_localizerが`/localization/kinematic_state`を計算します

<div align="center">
<img src="../images/localization_node.png" alt="Alt Text">
Expand All @@ -20,15 +20,14 @@

<br>

しかし初心者にAutowareの説明をするのにこの構成はかなり複雑なので、今回は以下のようにシンプルな
localizerを用意しました。
しかし初心者にAutowareの説明をするのにこの構成はかなり複雑なので、今回は以下のようにシンプルなdummy_localizerを用意しました。

<br>

<div align="center">
<img src="../images/practice_localization_node.png" alt="Alt Text">
<br>
<em>autoware-practiceのlocalizer周りのノードダイアグラム</em>
<em>autoware-practiceのdummy_localizer周りのノードダイアグラム</em>
</div>

<br>
Expand Down Expand Up @@ -149,7 +148,7 @@ twist:
---
```

[/localization/kinematic_state]()というトピックは [nav_msgs/msgs/Odometry](https://docs.ros2.org/foxy/api/geometry_msgs/msg/Pose.html) というROS2のメッセージ型を利用しています。
`/localization/kinematic_state`というトピックは [nav_msgs/msgs/Odometry](https://docs.ros2.org/foxy/api/geometry_msgs/msg/Pose.html) というROS2のメッセージ型を利用しています。


## 02-02. 車両速度を目標速度に収束させる
Expand Down Expand Up @@ -194,7 +193,7 @@ ros2 run plotjuggler plotjuggler

![plotjuggler_1](./images/plotjuggler_1.png)

/localization/kinematic_stateをクリックし右下のOKをクリックします
`/localization/kinematic_stat`をクリックし右下のOKをクリックします

左下のTimeseries.Listからlocalization > kinematic_state > twist > twist > linear > x を選択し、右側にドラッグ&ドロップをすると速度の時間推移を表すグラフを表示することができます。

Expand All @@ -220,11 +219,27 @@ ros2 run autoware_practice_course p_controller --ros-args -p kp:=5.0 -p target_v

速度計画を行うために車両から目標地点までの間に1mおきに中継地点となるウェイポイントを設定します。各ウェイポイントに目標速度を設定することで速度計画を行います。

各ウェイポイントの目標速度を決定するためのtrajectory_plannerノードと、各ウェイポイントを基に制御入力を決定するlongitudinal_controllerノードを作成しました。
各ウェイポイントの目標速度をcsvファイルから読み取るtrajectory_loaderノードと、各ウェイポイントを基に制御入力を決定するlongitudinal_controllerノードを作成しました。
今回は以下のtrajectory.csvを読み取ります。csvファイルには各ウェイポイントでの目標速度が記載されています。

![alt text](./images/2-3/node_diagram.png)
- [velocity_planning/trajectory_loader.hpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/velocity_planning/trajectory_loader.hpp)
- [velocity_planning/trajectory_loader.cpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/velocity_planning/trajectory_loader.cpp)
- [config/trajectory.csv](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/config/trajectory.csv)
- [velocity_planning/longitudinal_controller.hpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/velocity_planning/longitudinal_controller.hpp)
- [velocity_planning/longitudinal_controller.cpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/velocity_planning/longitudinal_controller.cpp)

trajectory_plannerノードがスタートからゴールまでの各ウェイポイントの目標速度を決定します。
<br>

<div align="center">
<img src="../images/2-3/node_diagram.png" alt="Alt Text">
<br>
<em>autoware-practiceのtrajectory_loader周りのノードダイアグラム</em>
</div>

<br>


trajectory_loaderノードがスタートからゴールまでの各ウェイポイントの目標速度をcsvファイルから読み取ります。
longitudinal_controllerノードが車両に最も近いウェイポイントを探索し、ウェイポイントでの目標速度と現在の車両の速度を基に制御入力を決定します。

各ノードは以下のコマンドを別々のターミナルで実行することで起動することができます。
Expand All @@ -234,7 +249,7 @@ ros2 launch autoware_practice_launch practice.launch.xml
```

```bash
ros2 run autoware_practice_course trajectory_planner
ros2 run autoware_practice_course trajectory_loader --ros-args -p path_file:=src/autoware_practice_course/config/trajectory.csv
```

```bash
Expand Down Expand Up @@ -262,7 +277,7 @@ PlotJugglerが起動したらStartボタンを押します。

![alt text](./images/2-3/PlotJuggler2.png)

/localization/kinematic_state/pose/pose/position/xと/localization/kinematic_state/twist/twist/linear/xを複数選択して**右クリック**でドラッグ&ドロップすることで、位置と速度の関係のグラフを見ることができます。
`/localization/kinematic_state/pose/pose/position/x``/localization/kinematic_state/twist/twist/linear/x`を複数選択して**右クリック**でドラッグ&ドロップすることで、位置と速度の関係のグラフを見ることができます。

![alt text](./images/2-3/PlotJuggler3.png)

Expand All @@ -274,10 +289,10 @@ PlotJugglerが起動したらStartボタンを押します。

![alt text](./images/2-3/PlotJuggler6.png)

次にtrajectory_plannerノードとlongitudinal_controllerノードをそれぞれ別のターミナルで起動します
次にtrajectory_loaderノードとlongitudinal_controllerノードをそれぞれ別のターミナルで起動します

```bash
ros2 run autoware_practice_course trajectory_planner
ros2 run autoware_practice_course trajectory_loader --ros-args -p path_file:=src/autoware_practice_course/config/trajectory.csv
```

```bash
Expand All @@ -288,6 +303,93 @@ ros2 run autoware_practice_course longitudinal_controller --ros-args -p kp:=5.0

グラフより、大体50m付近で10m/sに達し100m付近で停止できていることがわかります。

<script type="text/javascript" async
## 02-04. 横方向制御を行う

図のような、直進・90度旋回・直進・90度旋回・直進となるような経路に追従することを考えます。

<div align="center">
<img src="../images/2-4/trajectory_zigzag.png" alt="Alt Text">
<br>
<em>今回の目標経路</em>
</div>

この経路に追従するためには旋回で適切にステアリングを操作し横制御を行う必要があります。
そこで、P制御による縦方向制御とpure puresuitによる横方向制御を含んだtrajectroy_followerノードを作成しました。

- [velocity_planning/trajectory_follower.hpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/velocity_planning/trajectory_follower.hpp)
- [velocity_planning/trajectory_follower.cpp](https://github.com/AutomotiveAIChallenge/autoware-practice/blob/main/src/autoware_practice_course/src/velocity_planning/trajectory_follower.cpp)

<br>

<div align="center">
<img src="../images/2-4/node_diagram.png" alt="Alt Text">
<br>
<em>autoware-practiceのtrajectory_follower周りのノードダイアグラム</em>
</div>

<br>

pure pursuitは、車両の現在位置と目標経路上の追従点(ルックアヘッドポイント)との距離と方向を基にルックアヘッドポイントに到達するための曲率を計算するアルゴリズムです。以下にpure pursuitの基本的な動作を説明します。

1. **追従点の設定**:
目標経路上に車両の現在位置から一定の距離先に追従点を設定します。この距離はルックアヘッド距離と呼ばれます。

2. **方向ベクトルの計算**:
車両の現在位置と追従点との間の方向ベクトルを計算します。これにより、車両がどの方向に進むべきかがわかります。

3. **ステアリング角度の計算**:
計算された方向ベクトルに基づき曲率を計算し、車両のステアリング角度を求めます。
$$ \theta = \arctan\left(\frac{2 L \sin(\alpha)}{d}\right) $$
$$ \theta: 計算されたステアリング角度 \\ $$
$$ L: 車両のホイールベースの長さ \\ $$
$$ \alpha: 現在の車両の向きとルックアヘッドポイントへの方向ベクトルの間の角度差 \\ $$
$$ d: ルックアヘッド距離 $$


<div align="center">
<img src="../images/2-4/pure_pursuit.png" alt="Pure Pursuit">
<br>
<em>pure pursuitの基本動作</em>
</div>



pure pursuitの利点は、そのシンプルさと実装の容易さにあります。しかし、高速走行や急カーブの多い経路では、別の制御アルゴリズムとの組み合わせが必要になる場合があります。

P制御とpure pursuit制御によって正しく経路に追従できているかをPlotJugglerで確認してみましょう。

これまでと同様に別々のターミナルで以下のコマンドを実行しシミュレータとPlotJugglerを起動します。

```bash
ros2 launch autoware_practice_launch practice.launch.xml
```

```bash
ros2 run plotjuggler plotjuggler
```

PlotJuggler上で`/localization/kinematic_state/pose/pose/position/x``/localization/kinematic_state/pose/pose/position/y`を複数選択し右クリックでドラッグ&ドロップします。

![alt text](./images/2-4/PlotJuggler1.png)

rvizと軸の向きを合わせます。ドラッグ&ドロップした後に表示されるポップアップでSwapを選択して軸を入れ替えてOKを選択します。その後グラフ上で右クリックしてFlip Horizontal Axisを選択して横軸を反転させます。

![alt text](./images/2-4/PlotJuggler2.png)

PlotJugglerの設定ができたら、別々のターミナルで以下のコマンドを実行してtrajectory_loaderノードとtrajectory_followerノードを起動します。

```bash
ros2 run autoware_practice_course trajectory_loader --ros-args -p path_file:=src/autoware_practice_course/config/trajectory_zigzag.csv
```

```bash
ros2 run autoware_practice_course trajectory_follower --ros-args -p kp:=5.0 -p lookahead_distance:=5.0
```

適切に起動できると設定された経路に追従できていることがPlotJuggler上でわかります。

![alt text](./images/2-4/PlotJuggler3.png)

<script type="text/javascript" asyn
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.1.2/es5/tex-mml-chtml.js">
</script>

0 comments on commit 7bfea3e

Please sign in to comment.