2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

autonomalabsのAWSIMを動かしてみる

Posted at

概要

AWSIMをforkしたプロジェクトにautonomalabsのAWSIMがあります.これは,一般車ではなく,レーシングカーのシミュレーションのようです.本記事では,これを動かしてみたいと思います!Screenshot from 2023-09-21 17-23-35.png

インストール方法

基本的にはリポジトリのREADMEに従います.ただ,現時点で,実行ファイルをそのままダウンロードすることは出来なさそうだったので,Unityをインストールして,自らビルドする必要がありそうです.

遊んで見る

Screenshot from 2023-09-21 17-51-15.png

このメニュー画面で,人間が運転するか,ROSに接続するか,車を何台使うかなど,様々選択できます.人間が運転するを選択すると,特にプログラムを記述することなくシミュレータで遊ぶことができます.

慣れないと少し難しいですが,カーレスゲームとしても割と面白いです.

また,ROSとの接続を使って,Joystickから操作するためのノードを以下に書いてみました!

import rclpy
from autonoma_msgs.msg import VehicleInputs
from rclpy.node import Node
from sensor_msgs.msg import Joy


class AutonomaManualNode(Node):
    def __init__(self):
        super().__init__("awsim_autonoma_manual")
        self.publisher_ = self.create_publisher(VehicleInputs, "vehicle_inputs", 10)
        self.joy_subscriber_ = self.create_subscription(
            Joy, "joy", self.joy_callback, 10
        )

    def joy_callback(self, msg: Joy):
        self.get_logger().info(f"Axis 0: {msg.axes[0]}, Axis 1: {msg.axes[1]}")
        vehicle_inputs = VehicleInputs()
        vehicle_inputs.throttle_cmd = msg.buttons[1] * 20.0
        if msg.buttons[0] == 1:
            vehicle_inputs.brake_cmd = 1000.0
        vehicle_inputs.steering_cmd = msg.axes[0] * 100.0
        self.publisher_.publish(vehicle_inputs)


def main():
    rclpy.init()
    node = AutonomaManualNode()
    rclpy.spin(node)
    rclpy.shutdown()


if __name__ == "__main__":
    main()

このノードは,joystickの指令を,車への入力であるvehicle_inputsに変換してpublishしている単純なものです.

シミュレータから,どのようなトピックが出ているかが気になる方は,
https://github.com/autonomalabs/AWSIM/blob/racing-main/docs/RacingSim/ROS2Interface/index.md
を参照してみてください.

強化学習で車体を一定速で直進させてみる

このシミュレーションにおいて,車への入力は速度のような単純なものではなく,スロットル(「エンジンに対して行う空気供給量を調整するという役割を持つパーツ・システムをいう」らしい)とハンドルの傾きとなっており,ダイナミクスなどを真面目に考えると,複雑になっている気がします.

なので,その複雑さを考慮せず制御を行うために,強化学習を導入してみようと思います.導入する手法はPETS(arxiv)というものです.

この手法は大まかに,ニューラルネットワークでダイナミクスモデルを学習し,学習されたモデルに対してMPCを行うといったものです.

今回は,その手法に対して,
$$
r = - \alpha (v_x - v_{x_{ref}})^2 - \beta (y - y_{ref})^2
$$
のような,直進しながら一定速度を出してほしいという気持ちを込めた報酬を設計して動かしてみました.

以下,結果の動画です.

このときは,15mphで動くようにパラメータを調整しました.ただ,見る限り上手く走っていないです...恐らく,学習不足か何かしらの実装ミスがあるのだと思います.上手く調整して走らせたいですね!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?