---
title: 箱庭ドローンの強化学習
tags:  #hakoniwa  
author: [森崇](https://www.docswell.com/user/kanetugu2015)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/972DZQGM7R.jpg?width=480
description: # **箱庭ドローンの強化学習 - OpenAI Gym 統合検討**    ## **概要**   本資料は、箱庭ドローンの制御最適化における **強化学習（SAC）を用いた手法** についてまとめたものです。   従来の **PID パラメータ調整の課題** を解決するため、**OpenAI Gym 環境との統合** を行い、自動最適化を目指しました。    ## **内容**   - **課題**: ドローンごとの制御パラメータ調整が大変   - **制御アーキテクチャ**: 36個の PID パラメータ最適化   - **強化学習の適用方法**: OpenAI Gym + 箱庭シミュレータを利用   - **評価指標**: 整定時間、遅延時間、オーバーシュート、定常偏差   - **実験結果**: 強化学習により最適な制御パラメータを取得   - **気づきと課題**:     - 姿勢角と移動制御の学習を統合した方が効率的     - 学習中の最適パラメータを保持する仕組みが必要    ## **対象読者**   - **ドローン制御・ロボティクスに興味がある方**   - **強化学習による制御最適化を考えているエンジニア**   - **OpenAI Gym / Stable-Baselines3 を活用したい方**    本資料が、強化学習を活用した **制御最適化のヒント** になれば幸いです！🚀
published: February 22, 25
canonical: https://www.docswell.com/s/kanetugu2015/ZV1842-2025-02-22-180635
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/972DZQGM7R.jpg)

箱庭ドローンのOpen AI Gym統合検討
• 背景
• 箱庭ドローンの機体バリエーションが増えてきた
• 今後、もっと増やしていく予定
• 課題
• 機体毎のチューニングが大変
• 特に制御パラメータ調整が課題
1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/DJY2RWVPJM.jpg)

箱庭ドローンの制御アーキテクチャ
制御は全てPID制御
36パラメータ：12x3
目標高度
高度制御
目標速度
高度速度
制御
推力
デューティ1
デューティ2
目標水平位置(y)
水平位置
制御(y)
水平位置
制御(x)
目標姿勢角度(ψ)
目標水平
速度(vy)
目標水平
速度(vx)
水平速度
制御(vy)
水平速度
制御(vx)
目標姿勢
角度(θ)
目標姿勢
角度(φ)
ヨー角度制
御
水平姿勢
角度制御
(θ)
水平姿勢
角度制御
(φ)
目標姿勢
角速度(r)
目標姿勢
角速度(q)
目標姿勢
角速度(p)
ヨー角速度
制御
トルク(Tz)
モータ
プロペラ系
モデル
ミキサー
デューティ3
水平姿勢
角速度制
御(q)
水平姿勢
角速度制
御(p)
トルク(Ty)
物理
モデル
(MuJoCo)
デューティ4
トルク(Tx)
電圧
目標水平位置(x)
物
理
モ
デ
ル
I
/
F
物理
モデル
(質点)
補足：赤字部分は評価ツールから直接入力可能
電流
バッテリーモデル


# Page. 3

![Page Image](https://bcdn.docswell.com/page/V7N8D9MME8.jpg)

PIDパラメータのイメージ
https://github.com/toppers/hakoniwa-px4sim/blob/main/drone_control/config/param-api-mixer.txt
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/YJ9KG2NWJ3.jpg)

強化学習で解決できないか？
• 強化学習モデルにアクションにPIDパラメータのサブセット作ってもらい、
• 箱庭ドローンシミュレータでシミュレーションを実行
• 実行結果を報酬関数で定量化することを繰り返す
環境
アクション
モデル
箱庭ドローンシミュレータ
SACとかPPOとか
報酬
評価関数
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GJ8RV5KR7D.jpg)

箱庭・強化学習のアーキテクチャ
各PIDゲインの範囲を適切に制約(例):
Kp ∈ [0, 10]
Ki ∈ [0, 5]
Kd ∈ [0, 10]
機体
パラメータ
PIDパラメータ
変更
PIDパラメータ
最適化
評価関数
(目標値追従性)
物理モデル
制御モデル
箱庭ドローンシミュレータ
制御モデル
目標値
物理モデル
実測値
PIDパラメータ
評価
シミュレーション
実行
Python APIでシ
ミュレーション実行
順番に試していく
強化学習
アルゴリズム
(SAC)
評価シナリオ


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LJLK5YZ27R.jpg)

評価関数
古典制御理論で使われている指標を利用
オーバー
シュート量
整定時間±5%
定常偏差
90%
10%
立ち上がり時間
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/47M23NV97W.jpg)

評価シナリオ
全てのパラメータを一度に強化学習することは現実的ではない
→依存性が低いPIDパラメータから順番に強化学習を積み重ねていく
1. 上空で安定してホバリングできる高度制御のPIDパラメータを調整
2. 上空でホバリングできている状態から、ヨー角制御のPIDパラメータを調整
3. 上空で水平速度制御のPIDパラメータを調整
1. X方向
ステップ２：
ステップ１：
2. Y方向
安定してホバリング
ヨー角回転
ステップ３：
X方向移動
Y方向移動


# Page. 8

![Page Image](https://bcdn.docswell.com/page/P7RMQD29J9.jpg)

Open AI Gymのフレームワークを利用
gym.Env
継承
実験完了後、オーバーシュート量
や遅延時間などの指標をベースに
報酬を計算
HakoDroneEnv
与えられたPIDパラメータで、
ステップ応答実験を行う
step()
ドローンの内部状態(位置、速度等)
PIDパラメータ
observation
action
reward
アクション評価結果
強化学習モデル
load
Stable-Baselines3
様々な強化学習モデル
SAC, PPO, ...


# Page. 9

![Page Image](https://bcdn.docswell.com/page/PJXV51D3EX.jpg)

強化学習の風景
• https://www.youtube.com
/watch?v=b_jP57hutHw
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/3JKQ62XNJD.jpg)

強化学習結果
BEFORE
AFTER
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/LE3P645ZJ5.jpg)

気づきや工夫したところ等
• 気づき
• Open AI Gymは使いやすかった
• パラメータのとりえる値の範囲は経験ベースで入れるしかないような
• 工夫したところ
• 姿勢角制御と移動制御のパラメータは、一度に学習させたほうが良い
• 最初はロール角の２パラメータを最適化してから、水平速度制御の３パラメータを最適化していた
• でも、５パラメータだけなら、一度にやった方が効率的だと気づいた
• 悪のPIDパラメータは固定値にして、探索からは外しました
• まだ苦労しているところ
• 学習中に最高のPIDパラメータができたとしても、学習中のデータなので消えてしまう
• 学習後に、PIDパラメータセットを生成しても、制御として成り立つものが出るとは限らない
• 調査中（やり方が間違っている？学習が足りてない？？）
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/8EDLVQD4JG.jpg)

ここからが本番
• それぞれの制御について、それ単体でのステップ応答は良いけど、
• 全体として制御が成り立っているかは別問題。
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/V7P2VLXV78.jpg)

でも動画（上昇）
BEFORE:
https://www.youtube.com/watch?v=iQBKou4AiNg
PID_YAW_Kp 0.9299530982971191
PID_YAW_Ki 0.17777666449546814
PID_YAW_Kd 0.6158142685890198
PID_YAW_RATE_Kp 0.8161411285400391
PID_YAW_RATE_Ki 0.35235244035720825
PID_YAW_RATE_Kd 0.5419761538505554
AFTER:
https://www.youtube.com/watch?v=Q-ntytUzv3I
PID_YAW_Kp 2.7070183753967285
PID_YAW_Ki 0.008221190422773361
PID_YAW_Kd 0.0037256197538226843
PID_YAW_RATE_Kp 1.1107832193374634
PID_YAW_RATE_Ki 0.009345252066850662
PID_YAW_RATE_Kd 2.1629395484924316
上昇のPIDパラメータ値に対して、ヨー角のPID値が釣り合ってない
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/2JVDZQLRJQ.jpg)

ヨー角の学習調整
• ステップ値：10°→1°
• パラメータ範囲：
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/5EGY4WX6EL.jpg)

でも動画（ヨー角）
https://www.youtube.com/watch?v=jX-lvPBuhzU
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/4JQMG3827P.jpg)

水平移動
AFTER:
BEFORE:
https://www.youtube.com/watch?v=b7BM17grxcw https://www.youtube.com/watch?v=10Yyanrph3A
# 水平速度制御のPIDパラメータ
PID_POS_VX_Kp 12.940427780151367
PID_POS_VX_Ki 4.012768268585205
PID_POS_VX_Kd 4.2381978034973145
PID_POS_VY_Kp 15.795845031738281
PID_POS_VY_Ki 4.079137325286865
PID_POS_VY_Kd 4.740286827087402
## ロール角度とロール角速度制御のPIDパラメータ
PID_ROLL_Kp 2.3472726345062256
PID_ROLL_RATE_Kp 1.7110514640808105
## ロール角度とロール角速度制御のPIDパラメータ
PID_ROLL_Kp
1.4871772527694702
PID_ROLL_RATE_Kp
13.485973358154297
## ピッチ角度とピッチ角速度制御のPIDパラメータ
PID_PITCH_Kp 0.2191523015499115
PID_PITCH_RATE_Kp 1.559105634689331
## ピッチ角度とピッチ角速度制御のPIDパラメータ
PID_PITCH_Kp
1.4871772527694702
PID_PITCH_RATE_Kp
13.485973358154297
ロール、ピッチ角の角速度のゲインが小さすぎた
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/K74V512PJ1.jpg)

角度制御の学習調整
• パラメータ範囲：
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/LJ13WGMX7G.jpg)

コントローラ操作テストしたら動かなかった
• 現象と原因
• 上昇させようとすると、吹っ飛ぶ
• 上昇のPIDパラメータ値に対して、ヨー角のPID値が釣り合ってない。
• ホバリングすると振動する
• ロール、ピッチ角の角速度のゲインが小さすぎた。。
• 気づき
• 制御間の辻褄が合ってない
• 上昇とヨー角度制御
• ロール、ピッチ制御と水平移動制御
• スティック操作だと、どうしてもノイズが乗る
• 上昇させようとすると、ヨー角の操作が若干入る
• 前進させようとすると、横方向の操作が若干入る
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/GJWP6K3K72.jpg)

まとめと課題、今後について
• まとめ
• 各制御についてはパラメータチューニングできるようになった
• 課題と今後について
• 制御間のパラメータチューニングが必要
• ノイズが入った場合の学習が必要
• プロ操縦士の操縦ログからの学習をやった方が良い
• パラメータ範囲やステップ入力の強さも自動調整してもらいたい
• 出口
• 人間のノウハウを評価シナリオや評価関数として与えたら勝手にやってくれる感じにしたい
19


