覚え書きブログ

読者です 読者をやめる 読者になる 読者になる

強化学習覚え書き(policy gradient法の種類)

強化学習

policyは、状態\bf{s}が与えられたもとで、行動aを選択する条件付き確率\pi(a|\bf{s})とする。

  • PGPE (Policy Gradient with Parameter-Based Exploration)

policyのパラメータ\thetaの事前分布p(\theta|\rho)を導入し、policyを学習する問題を事前分布を学習する問題に置き換える。ただし、policyはgreedyに行動を選択する。これにより、勾配の分散を抑えることができる。
http://people.idsia.ch/~juergen/icann2008sehnke.pdf

  • DeepDPG (Deep Deterministic Policy Gradient)

https://arxiv.org/pdf/1509.02971.pdf

つくばチャレンジ2017

ロボット

2017年のつくばチャレンジのホームページが開設された。
http://www.tsukubachallenge.jp/tc2017/kadai

「つくばチャレンジ」は、つくば市内の遊歩道等の実環境を、移動ロボットに自律走行させる技術チャレンジであり、地域と研究者が協力して行う、人間とロボットが共存する社会の実現のための先端的技術への挑戦です。つくばチャレンジは、2007年からにつくば市内の遊歩道や公園、広場に設定された1km+αのコースを自律走行させることを課題として行われてきました。今までに、大学の研究室や国立研究所、企業などから、延べ500を超えるチームが参加して、自律移動ロボットの開発と、そのロボットの市街地での走行実験を行っています。この活動は、ロボットに、実験室の中のみでなく、市民が日常使っている実際の市街地の中で、自分で環境を認識しつつ自分で行動を決めて走行させる技術を目指しており、移動ロボットの自律走行技術の発展に大きな役割を果たしてきました。実際、つくばチャレンジに参加しているロボットの技術は年々向上し、この活動は、技術的・学術的にも大いに評価されています。

http://www.tsukubachallenge.jp/tc2017/about

Unity覚え書き(LookAtを用いたキャラクターの回転)

ツール&ソフト

Unityで、移動するオブジェクトの方向を、キャラクターが見るスクリプトをLookAtを用いて作ってみた。

1)移動するターゲットオブジェクトを追加し、inspectorのAdd Componentで以下のスクリプト(movingTarget)を追加する。
f:id:hirotaka_hachiya:20170307234411p:plain

using UnityEngine;
using System.Collections;

public class movingTarget : MonoBehaviour {

    bool movingPlus = true;     // プラス方向に移動中か?
    Vector3 initial_position;   // オブジェクトの初期位置
    float randRange = 3f;       // 乱数の範囲
    float posRange = 5f;        // オブジェクトの移動範囲
    float speed = 3f;           // オブジェクトの移動速度
    bool xAxis = true;          // x軸方向か? 

    // Use this for initialization
    void Start()
    {

        // キャラクターの頭部位置取得
        Transform headObj = GameObject.Find("SuitMan").transform;

        // オブジェクトの移動軸の選定
        if (Random.Range(-1f, 1f) > 0)
            xAxis = true;
        else
            xAxis = false;

        // オブジェクトの位置を、頭部位置+ランダムに設定
        Vector3 rand = new Vector3(Random.Range(-randRange, randRange), 0, Random.Range(-randRange, randRange));
        transform.position = headObj.position + rand;
        initial_position = transform.position;
    }

    // Update is called once per frame
    void Update()
    {

        if (movingPlus)
        {
            if (xAxis)
            {
                transform.position += new Vector3(speed * Time.deltaTime, 0f, 0f);
                if ((transform.position.x - initial_position.x) >= posRange)
                    movingPlus = false;
            }
            else
            {
                transform.position += new Vector3(0f, 0f, speed * Time.deltaTime);
                if ((transform.position.z - initial_position.z) >= posRange)
                    movingPlus = false;
            }
        }
        else
        {
            if (xAxis)
            {
                transform.position -= new Vector3(speed * Time.deltaTime, 0f, 0f);
                if ((transform.position.x - initial_position.x) <= -posRange)
                    movingPlus = true;
            }
            else
            {
                transform.position -= new Vector3(0f, 0f, speed * Time.deltaTime);
                if ((transform.position.z - initial_position.z) <= -posRange)
                    movingPlus = true;
            }
        }
    }
}

このスクリプトでは、キャラクターSuitManの位置を中心にランダムに、ターゲットオブジェクトの位置を設定し、ランダムに選択したx軸またはy軸の方向に移動するものである。

2)キャラクターSuitManに、以下のスクリプト(LookAt)追加する
f:id:hirotaka_hachiya:20170307235102p:plain

using UnityEngine;
using System.Collections;

public class LookAt : MonoBehaviour {

    Transform targetObj;    // ターゲットオブジェクト

	// Use this for initialization
	void Start () {

        // ターゲットオブジェクトの取得
        targetObj = GameObject.Find("Target").transform;
	}
	
	// Update is called once per frame
	void Update () {

        // 体をターゲットオブジェクトに向ける
        transform.LookAt(targetObj);
	}
}

体ごと回転するので不自然さはあるが、これでキャラクターを移動するターゲットオブジェクト方向を向かせることができる。
なお、自然な動きをさせるためには、FinalIKのLookAtIKを使った方がよい。
https://www.assetstore.unity3d.com/jp/#!/content/14290
Look At IK