浏览代码
Merge commit '9450d3fc0dda4547a14c5ed1b7e13fc6e3a15413' into develop-nopreviousactions
/develop/nopreviousactions
Merge commit '9450d3fc0dda4547a14c5ed1b7e13fc6e3a15413' into develop-nopreviousactions
/develop/nopreviousactions
Ervin Teng
5 年前
当前提交
d10d27e2
共有 37 个文件被更改,包括 1071 次插入 和 620 次删除
-
8.github/PULL_REQUEST_TEMPLATE.md
-
5com.unity.ml-agents/CHANGELOG.md
-
4com.unity.ml-agents/Editor/DemonstrationImporter.cs
-
29com.unity.ml-agents/Runtime/Academy.cs
-
135com.unity.ml-agents/Runtime/Agent.cs
-
2com.unity.ml-agents/Runtime/InferenceBrain/TensorProxy.cs
-
4com.unity.ml-agents/Runtime/Sensor/ISensor.cs
-
534com.unity.ml-agents/Runtime/Sensor/RayPerceptionSensor.cs
-
4com.unity.ml-agents/Runtime/Sensor/RayPerceptionSensorComponent2D.cs
-
4com.unity.ml-agents/Runtime/Sensor/RayPerceptionSensorComponent3D.cs
-
38com.unity.ml-agents/Runtime/Sensor/RayPerceptionSensorComponentBase.cs
-
6com.unity.ml-agents/Runtime/Sensor/WriteAdapter.cs
-
50com.unity.ml-agents/Tests/Editor/DemonstrationTests.cs
-
2config/gail_config.yaml
-
9docs/API-Reference.md
-
3docs/Migrating.md
-
2docs/Training-Imitation-Learning.md
-
133docs/dox-ml-agents.conf
-
145gym-unity/gym_unity/envs/__init__.py
-
77gym-unity/gym_unity/tests/test_gym.py
-
62ml-agents-envs/mlagents_envs/environment.py
-
14ml-agents/mlagents/trainers/learn.py
-
13ml-agents/mlagents/trainers/tests/test_learn.py
-
2com.unity.ml-agents/Runtime/Demonstrations/Demonstration.cs.meta
-
2com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs.meta
-
14com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs.meta
-
104com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs
-
4com.unity.ml-agents/Runtime/Demonstrations/Demonstration.cs
-
8com.unity.ml-agents/Runtime/Demonstrations.meta
-
179com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs
-
95com.unity.ml-agents/Runtime/DemonstrationRecorder.cs
-
0/com.unity.ml-agents/Runtime/Demonstrations/Demonstration.cs.meta
-
0/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationRecorder.cs.meta
-
0/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs.meta
-
0/com.unity.ml-agents/Runtime/Demonstrations/DemonstrationWriter.cs
-
0/com.unity.ml-agents/Runtime/Demonstrations/Demonstration.cs
|
|||
fileFormatVersion: 2 |
|||
guid: a79c7ccb2cd042b5b1e710b9588d921b |
|||
timeCreated: 1537388072 |
|||
fileFormatVersion: 2 |
|||
guid: ebaf7878a8cc74ee3aae07daf9e1b6f2 |
|||
MonoImporter: |
|||
externalObjects: {} |
|||
serializedVersion: 2 |
|||
defaultReferences: [] |
|||
executionOrder: 0 |
|||
icon: {instanceID: 0} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
fileFormatVersion: 2 |
|||
guid: 85e02c21d231b4f5fa0c5f87e5f907a2 |
|||
folderAsset: yes |
|||
DefaultImporter: |
|||
externalObjects: {} |
|||
userData: |
|||
assetBundleName: |
|||
assetBundleVariant: |
|
|||
using System.IO.Abstractions; |
|||
using System.Text.RegularExpressions; |
|||
using UnityEngine; |
|||
using System.IO; |
|||
|
|||
namespace MLAgents |
|||
{ |
|||
/// <summary>
|
|||
/// Demonstration Recorder Component.
|
|||
/// </summary>
|
|||
[RequireComponent(typeof(Agent))] |
|||
[AddComponentMenu("ML Agents/Demonstration Recorder", (int)MenuGroup.Default)] |
|||
public class DemonstrationRecorder : MonoBehaviour |
|||
{ |
|||
[Tooltip("Whether or not to record demonstrations.")] |
|||
public bool record; |
|||
|
|||
[Tooltip("Base demonstration file name. Will have numbers appended to make unique.")] |
|||
public string demonstrationName; |
|||
|
|||
[Tooltip("Base directory to write the demo files. If null, will use {Application.dataPath}/Demonstrations.")] |
|||
public string demonstrationDirectory; |
|||
|
|||
DemonstrationWriter m_DemoWriter; |
|||
internal const int MaxNameLength = 16; |
|||
|
|||
const string k_ExtensionType = ".demo"; |
|||
IFileSystem m_FileSystem; |
|||
|
|||
Agent m_Agent; |
|||
|
|||
void OnEnable() |
|||
{ |
|||
m_Agent = GetComponent<Agent>(); |
|||
} |
|||
|
|||
void Update() |
|||
{ |
|||
if (record) |
|||
{ |
|||
LazyInitialize(); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates demonstration store for use in recording.
|
|||
/// Has no effect if the demonstration store was already created.
|
|||
/// </summary>
|
|||
internal DemonstrationWriter LazyInitialize(IFileSystem fileSystem = null) |
|||
{ |
|||
if (m_DemoWriter != null) |
|||
{ |
|||
return m_DemoWriter; |
|||
} |
|||
|
|||
if (m_Agent == null) |
|||
{ |
|||
m_Agent = GetComponent<Agent>(); |
|||
} |
|||
|
|||
m_FileSystem = fileSystem ?? new FileSystem(); |
|||
var behaviorParams = GetComponent<BehaviorParameters>(); |
|||
if (string.IsNullOrEmpty(demonstrationName)) |
|||
{ |
|||
demonstrationName = behaviorParams.behaviorName; |
|||
} |
|||
if (string.IsNullOrEmpty(demonstrationDirectory)) |
|||
{ |
|||
demonstrationDirectory = Path.Combine(Application.dataPath, "Demonstrations"); |
|||
} |
|||
|
|||
demonstrationName = SanitizeName(demonstrationName, MaxNameLength); |
|||
var filePath = MakeDemonstrationFilePath(m_FileSystem, demonstrationDirectory, demonstrationName); |
|||
var stream = m_FileSystem.File.Create(filePath); |
|||
m_DemoWriter = new DemonstrationWriter(stream); |
|||
|
|||
m_DemoWriter.Initialize( |
|||
demonstrationName, |
|||
behaviorParams.brainParameters, |
|||
behaviorParams.fullyQualifiedBehaviorName |
|||
); |
|||
|
|||
AddDemonstrationWriterToAgent(m_DemoWriter); |
|||
|
|||
return m_DemoWriter; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Removes all characters except alphanumerics from demonstration name.
|
|||
/// Shorten name if it is longer than the maxNameLength.
|
|||
/// </summary>
|
|||
internal static string SanitizeName(string demoName, int maxNameLength) |
|||
{ |
|||
var rgx = new Regex("[^a-zA-Z0-9 -]"); |
|||
demoName = rgx.Replace(demoName, ""); |
|||
// If the string is too long, it will overflow the metadata.
|
|||
if (demoName.Length > maxNameLength) |
|||
{ |
|||
demoName = demoName.Substring(0, maxNameLength); |
|||
} |
|||
return demoName; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets a unique path for the demonstrationName in the demonstrationDirectory.
|
|||
/// </summary>
|
|||
/// <param name="fileSystem"></param>
|
|||
/// <param name="demonstrationDirectory"></param>
|
|||
/// <param name="demonstrationName"></param>
|
|||
/// <returns></returns>
|
|||
internal static string MakeDemonstrationFilePath( |
|||
IFileSystem fileSystem, string demonstrationDirectory, string demonstrationName |
|||
) |
|||
{ |
|||
// Create the directory if it doesn't already exist
|
|||
if (!fileSystem.Directory.Exists(demonstrationDirectory)) |
|||
{ |
|||
fileSystem.Directory.CreateDirectory(demonstrationDirectory); |
|||
} |
|||
|
|||
var literalName = demonstrationName; |
|||
var filePath = Path.Combine(demonstrationDirectory, literalName + k_ExtensionType); |
|||
var uniqueNameCounter = 0; |
|||
while (fileSystem.File.Exists(filePath)) |
|||
{ |
|||
// TODO should we use a timestamp instead of a counter here? This loops an increasing number of times
|
|||
// as the number of demos increases.
|
|||
literalName = demonstrationName + "_" + uniqueNameCounter; |
|||
filePath = Path.Combine(demonstrationDirectory, literalName + k_ExtensionType); |
|||
uniqueNameCounter++; |
|||
} |
|||
|
|||
return filePath; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Close the DemonstrationWriter and remove it from the Agent.
|
|||
/// Has no effect if the DemonstrationWriter is already closed (or wasn't opened)
|
|||
/// </summary>
|
|||
public void Close() |
|||
{ |
|||
if (m_DemoWriter != null) |
|||
{ |
|||
RemoveDemonstrationWriterFromAgent(m_DemoWriter); |
|||
|
|||
m_DemoWriter.Close(); |
|||
m_DemoWriter = null; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Clean up the DemonstrationWriter when shutting down or destroying the Agent.
|
|||
/// </summary>
|
|||
void OnDestroy() |
|||
{ |
|||
Close(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Add additional DemonstrationWriter to the Agent. It is still up to the user to Close this
|
|||
/// DemonstrationWriters when recording is done.
|
|||
/// </summary>
|
|||
/// <param name="demoWriter"></param>
|
|||
public void AddDemonstrationWriterToAgent(DemonstrationWriter demoWriter) |
|||
{ |
|||
m_Agent.DemonstrationWriters.Add(demoWriter); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Remove additional DemonstrationWriter to the Agent. It is still up to the user to Close this
|
|||
/// DemonstrationWriters when recording is done.
|
|||
/// </summary>
|
|||
/// <param name="demoWriter"></param>
|
|||
public void RemoveDemonstrationWriterFromAgent(DemonstrationWriter demoWriter) |
|||
{ |
|||
m_Agent.DemonstrationWriters.Remove(demoWriter); |
|||
} |
|||
} |
|||
} |
|
|||
using System.IO.Abstractions; |
|||
using System.Text.RegularExpressions; |
|||
using UnityEngine; |
|||
using System.Collections.Generic; |
|||
|
|||
namespace MLAgents |
|||
{ |
|||
/// <summary>
|
|||
/// Demonstration Recorder Component.
|
|||
/// </summary>
|
|||
[RequireComponent(typeof(Agent))] |
|||
[AddComponentMenu("ML Agents/Demonstration Recorder", (int)MenuGroup.Default)] |
|||
public class DemonstrationRecorder : MonoBehaviour |
|||
{ |
|||
public bool record; |
|||
public string demonstrationName; |
|||
string m_FilePath; |
|||
DemonstrationStore m_DemoStore; |
|||
public const int MaxNameLength = 16; |
|||
|
|||
void Start() |
|||
{ |
|||
if (Application.isEditor && record) |
|||
{ |
|||
InitializeDemoStore(); |
|||
} |
|||
} |
|||
|
|||
void Update() |
|||
{ |
|||
if (Application.isEditor && record && m_DemoStore == null) |
|||
{ |
|||
InitializeDemoStore(); |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Creates demonstration store for use in recording.
|
|||
/// </summary>
|
|||
public void InitializeDemoStore(IFileSystem fileSystem = null) |
|||
{ |
|||
m_DemoStore = new DemonstrationStore(fileSystem); |
|||
var behaviorParams = GetComponent<BehaviorParameters>(); |
|||
demonstrationName = SanitizeName(demonstrationName, MaxNameLength); |
|||
m_DemoStore.Initialize( |
|||
demonstrationName, |
|||
behaviorParams.brainParameters, |
|||
behaviorParams.fullyQualifiedBehaviorName); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Removes all characters except alphanumerics from demonstration name.
|
|||
/// Shorten name if it is longer than the maxNameLength.
|
|||
/// </summary>
|
|||
public static string SanitizeName(string demoName, int maxNameLength) |
|||
{ |
|||
var rgx = new Regex("[^a-zA-Z0-9 -]"); |
|||
demoName = rgx.Replace(demoName, ""); |
|||
// If the string is too long, it will overflow the metadata.
|
|||
if (demoName.Length > maxNameLength) |
|||
{ |
|||
demoName = demoName.Substring(0, maxNameLength); |
|||
} |
|||
return demoName; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Forwards AgentInfo to Demonstration Store.
|
|||
/// </summary>
|
|||
public void WriteExperience(AgentInfo info, List<ISensor> sensors) |
|||
{ |
|||
m_DemoStore?.Record(info, sensors); |
|||
} |
|||
|
|||
public void Close() |
|||
{ |
|||
if (m_DemoStore != null) |
|||
{ |
|||
m_DemoStore.Close(); |
|||
m_DemoStore = null; |
|||
} |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Closes Demonstration store.
|
|||
/// </summary>
|
|||
void OnApplicationQuit() |
|||
{ |
|||
if (Application.isEditor && record) |
|||
{ |
|||
Close(); |
|||
} |
|||
} |
|||
} |
|||
} |
撰写
预览
正在加载...
取消
保存
Reference in new issue