概要
AWSIMをforkしたプロジェクトにautonomalabsのAWSIMがあります.これは,一般車ではなく,レーシングカーのシミュレーションのようです.本記事では,これを動かしてみたいと思います!
インストール方法
基本的にはリポジトリのREADMEに従います.ただ,現時点で,実行ファイルをそのままダウンロードすることは出来なさそうだったので,Unityをインストールして,自らビルドする必要がありそうです.
遊んで見る
このメニュー画面で,人間が運転するか,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で動くようにパラメータを調整しました.ただ,見る限り上手く走っていないです...恐らく,学習不足か何かしらの実装ミスがあるのだと思います.上手く調整して走らせたいですね!