From 681b7a7870bd369491380001cf237e6ffe16fdf4 Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Wed, 22 Jul 2020 17:09:45 -0700 Subject: [PATCH 01/14] new scene: set up of the asymmetric cube in the multilple objects scene --- .../Assets/Materials/AlphabetCubeMaterial.mat | 78 +++++ .../Materials/AlphabetCubeMaterial.mat.meta | 8 + .../Materials/NonsymmetricCubeTexture.png | Bin 0 -> 18089 bytes .../NonsymmetricCubeTexture.png.meta | 94 ++++++ ArmRobot/Assets/Models.meta | 8 + .../Assets/Scenes/ArticulationRobot.unity | 310 ++++++++---------- .../Assets/Scripts/DomainRandomization.cs | 9 +- .../Scripts/RandomizerPositionObject.cs | 1 + 8 files changed, 335 insertions(+), 173 deletions(-) create mode 100644 ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat create mode 100644 ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat.meta create mode 100644 ArmRobot/Assets/Materials/NonsymmetricCubeTexture.png create mode 100644 ArmRobot/Assets/Materials/NonsymmetricCubeTexture.png.meta create mode 100644 ArmRobot/Assets/Models.meta diff --git a/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat b/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat new file mode 100644 index 00000000..0d108acb --- /dev/null +++ b/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: AlphabetCubeMaterial + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 2800000, guid: 452601e9fe9ce416a839845ba14929ee, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat.meta b/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat.meta new file mode 100644 index 00000000..b052cab0 --- /dev/null +++ b/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 66bcd89a9bb8148f8beb3c24e3ac3cee +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/ArmRobot/Assets/Materials/NonsymmetricCubeTexture.png b/ArmRobot/Assets/Materials/NonsymmetricCubeTexture.png new file mode 100644 index 0000000000000000000000000000000000000000..85e114b403405728ebcffb403ca51f0b5d1d37b4 GIT binary patch literal 18089 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 X=l4&XqD~NZz%A9gH}Zb7c=q1_aennK literal 0 HcmV?d00001 diff --git a/ArmRobot/Assets/Materials/NonsymmetricCubeTexture.png.meta b/ArmRobot/Assets/Materials/NonsymmetricCubeTexture.png.meta new file mode 100644 index 00000000..d1295afc --- /dev/null +++ b/ArmRobot/Assets/Materials/NonsymmetricCubeTexture.png.meta @@ -0,0 +1,94 @@ +fileFormatVersion: 2 +guid: 452601e9fe9ce416a839845ba14929ee +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/ArmRobot/Assets/Models.meta b/ArmRobot/Assets/Models.meta new file mode 100644 index 00000000..a9713899 --- /dev/null +++ b/ArmRobot/Assets/Models.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3ae04a772a441465f8329fdee8653011 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ArmRobot/Assets/Scenes/ArticulationRobot.unity b/ArmRobot/Assets/Scenes/ArticulationRobot.unity index f7814787..1e8ad9bc 100644 --- a/ArmRobot/Assets/Scenes/ArticulationRobot.unity +++ b/ArmRobot/Assets/Scenes/ArticulationRobot.unity @@ -129,6 +129,139 @@ Transform: type: 3} m_PrefabInstance: {fileID: 1783092415} m_PrefabAsset: {fileID: 0} +--- !u!1001 &174459725 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalPosition.x + value: 40 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalPosition.y + value: 57 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalPosition.z + value: -20 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalRotation.x + value: -0.7071068 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalRotation.w + value: 0.7071067 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_RootOrder + value: 9 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalScale.x + value: 380 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalScale.y + value: 380 + objectReference: {fileID: 0} + - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_LocalScale.z + value: 380 + objectReference: {fileID: 0} + - target: {fileID: -7511558181221131132, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_Materials.Array.data[0] + value: + objectReference: {fileID: 2100000, guid: 66bcd89a9bb8148f8beb3c24e3ac3cee, type: 2} + - target: {fileID: 919132149155446097, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_Name + value: Cube + objectReference: {fileID: 0} + - target: {fileID: 919132149155446097, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + propertyPath: m_TagString + value: Cube + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} +--- !u!1 &174459726 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 3e59c8daa92034cdc906b0103d57c584, + type: 3} + m_PrefabInstance: {fileID: 174459725} + m_PrefabAsset: {fileID: 0} +--- !u!114 &174459730 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174459726} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ee5bbc0d497a34c1b8d8a3ce2896749d, type: 3} + m_Name: + m_EditorClassIdentifier: + hueMin: 0 + hueMax: 1 + saturationMin: 1 + saturationMax: 1 + valueMin: 0.6 + valueMax: 1 +--- !u!114 &174459731 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174459726} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 12c87eca3d37f49ce94654534ab6996c, type: 3} + m_Name: + m_EditorClassIdentifier: + robotMinReach: 20 + robotMaxReach: 50 + yAltitudeTable: 57 --- !u!1 &385129266 GameObject: m_ObjectHideFlags: 0 @@ -533,7 +666,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 7 + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &886963046 MonoBehaviour: @@ -549,7 +682,7 @@ MonoBehaviour: m_EditorClassIdentifier: _camera: {fileID: 1207423634} maxSamples: 10 - cube: {fileID: 1383161865} + cube: {fileID: 174459726} fileCounter: 0 --- !u!114 &886963047 MonoBehaviour: @@ -563,7 +696,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c5d07dd5795be4425aa7c56e4d8da379, type: 3} m_Name: m_EditorClassIdentifier: - cube: {fileID: 1383161865} + cube: {fileID: 174459726} robot: {fileID: 1442213767} table: {fileID: 1064094162} DomainRandomizationObject: {fileID: 1054542686} @@ -580,7 +713,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 2ba02a69f809d49a48b8a6ebaaff6e18, type: 3} m_Name: m_EditorClassIdentifier: - cube: {fileID: 1383161865} + cube: {fileID: 174459726} _camera: {fileID: 1207423634} --- !u!1 &948141744 GameObject: @@ -1013,7 +1146,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: table: {fileID: 1064094162} - cube: {fileID: 1383161865} + cube: {fileID: 174459726} robot: {fileID: 1442213767} scaleObject: {x: 7, y: 7, z: 7} nbMaxDistractorObjects: 2 @@ -1033,7 +1166,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 9 + m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1054542689 MonoBehaviour: @@ -1656,169 +1789,8 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 8 + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 15, y: 0, z: 0} ---- !u!1 &1383161865 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1383161871} - - component: {fileID: 1383161870} - - component: {fileID: 1383161869} - - component: {fileID: 1383161868} - - component: {fileID: 1383161867} - - component: {fileID: 1383161866} - - component: {fileID: 1383161872} - - component: {fileID: 1383161874} - m_Layer: 0 - m_Name: Cube - m_TagString: Cube - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1383161866 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1383161865} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ee5bbc0d497a34c1b8d8a3ce2896749d, type: 3} - m_Name: - m_EditorClassIdentifier: - hueMin: 0 - hueMax: 1 - saturationMin: 1 - saturationMax: 1 - valueMin: 0.5 - valueMax: 1 ---- !u!54 &1383161867 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1383161865} - serializedVersion: 2 - m_Mass: 0.1 - m_Drag: 0 - m_AngularDrag: 0 - m_UseGravity: 1 - m_IsKinematic: 0 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!65 &1383161868 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1383161865} - m_Material: {fileID: 13400000, guid: 3d0bf61d361114f57882dd46e8074bae, type: 2} - m_IsTrigger: 0 - m_Enabled: 1 - serializedVersion: 2 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &1383161869 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1383161865} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 351a807c5fbdd4ff19fde1c2c5449e8c, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &1383161870 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1383161865} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &1383161871 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1383161865} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 40, y: 57, z: -20} - m_LocalScale: {x: 7, y: 7, z: 7} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1383161872 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1383161865} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 12c87eca3d37f49ce94654534ab6996c, type: 3} - m_Name: - m_EditorClassIdentifier: - robotMinReach: 20 - robotMaxReach: 50 - yAltitudeTable: 57 ---- !u!114 &1383161874 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1383161865} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 10a84cf46a89e4e3ab47779e4de8d31e, type: 3} - m_Name: - m_EditorClassIdentifier: - width: 10 --- !u!1 &1442213767 GameObject: m_ObjectHideFlags: 0 @@ -2155,7 +2127,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 6 + m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1557304991 MonoBehaviour: diff --git a/ArmRobot/Assets/Scripts/DomainRandomization.cs b/ArmRobot/Assets/Scripts/DomainRandomization.cs index 4f8f228c..1ad9703a 100644 --- a/ArmRobot/Assets/Scripts/DomainRandomization.cs +++ b/ArmRobot/Assets/Scripts/DomainRandomization.cs @@ -25,7 +25,7 @@ public class DomainRandomization : MonoBehaviour void Start() { - cube.tag = "Cube"; + //cube.tag = "Cube"; RandomizerPositionObject tablePositionRandomizerCube = cube.GetComponent(); robotMinReach = tablePositionRandomizerCube.robotMinReach; @@ -57,8 +57,8 @@ public void DomainRandomizationScene(int index) // then we change its pattern - CheckerBoard checkerBoardCube = cube.GetComponent(); - checkerBoardCube.CheckerBoardChange(); + //CheckerBoard checkerBoardCube = cube.GetComponent(); + //checkerBoardCube.CheckerBoardChange(); // then we change its color @@ -68,6 +68,7 @@ public void DomainRandomizationScene(int index) listOfAlreadyMovedObjects.Add(cube); + // We desactive the older objects DesactiveObjects(); @@ -84,7 +85,7 @@ public void DomainRandomizationScene(int index) listOfAlreadyMovedObjects.Add(gameobject); // we add the gameobject to the already moved objects } - + // move robot MoveRobot(rotationAngle); diff --git a/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs b/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs index 5f78b68c..7e2d18fa 100644 --- a/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs +++ b/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs @@ -90,6 +90,7 @@ public Vector2 RandomPoint(float minRadius, float maxRadius, List li // edge (2 * maxRadius - radiusOfTheGameObject) to be sure that the point is reachable by the robot float gameObjectRadius = GameObjectRadius(gameObject); + Debug.Log("gameObjectRadius :" + gameObjectRadius); float randomX; float randomZ; From 9bded404c685d83e816f0ac19eab86241ec215f0 Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Wed, 22 Jul 2020 17:15:38 -0700 Subject: [PATCH 02/14] modification of the scene --- .../Assets/Scenes/ArticulationRobot.unity | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/ArmRobot/Assets/Scenes/ArticulationRobot.unity b/ArmRobot/Assets/Scenes/ArticulationRobot.unity index 1e8ad9bc..a7d69d2b 100644 --- a/ArmRobot/Assets/Scenes/ArticulationRobot.unity +++ b/ArmRobot/Assets/Scenes/ArticulationRobot.unity @@ -229,6 +229,35 @@ GameObject: type: 3} m_PrefabInstance: {fileID: 174459725} m_PrefabAsset: {fileID: 0} +--- !u!54 &174459727 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174459726} + serializedVersion: 2 + m_Mass: 1 + m_Drag: 0 + m_AngularDrag: 0.05 + m_UseGravity: 1 + m_IsKinematic: 0 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!65 &174459728 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 174459726} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 0.02, y: 0.019999998, z: 0.019999998} + m_Center: {x: 0, y: 0, z: 0} --- !u!114 &174459730 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1149,7 +1178,7 @@ MonoBehaviour: cube: {fileID: 174459726} robot: {fileID: 1442213767} scaleObject: {x: 7, y: 7, z: 7} - nbMaxDistractorObjects: 2 + nbMaxDistractorObjects: 8 rotationAngle: 10 yAltitudeTable: 57 minimumDistanceWithoutObjects: 0.35 From 9383cccc55cf03159e2f053ed7fd78a0b108e40d Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 10:59:06 -0700 Subject: [PATCH 03/14] changes to set up the asymmetric cube scene --- .../Assets/Scenes/ArticulationRobot.unity | 20 ++--- .../Assets/Scripts/DomainRandomization.cs | 73 ++++++++++++------- .../Scripts/RandomizerPositionObject.cs | 8 +- .../Scripts/Robot/RobotVisionCapture.cs | 17 ++--- .../Scripts/Robot/RobotVisionDataPoint.cs | 14 +++- README.md | 15 ++++ 6 files changed, 92 insertions(+), 55 deletions(-) diff --git a/ArmRobot/Assets/Scenes/ArticulationRobot.unity b/ArmRobot/Assets/Scenes/ArticulationRobot.unity index a7d69d2b..3e31f707 100644 --- a/ArmRobot/Assets/Scenes/ArticulationRobot.unity +++ b/ArmRobot/Assets/Scenes/ArticulationRobot.unity @@ -139,7 +139,7 @@ PrefabInstance: - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalPosition.x - value: 40 + value: 20 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} @@ -149,7 +149,7 @@ PrefabInstance: - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalPosition.z - value: -20 + value: -35 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} @@ -194,17 +194,17 @@ PrefabInstance: - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalScale.x - value: 380 + value: 350 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalScale.y - value: 380 + value: 350 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalScale.z - value: 380 + value: 350 objectReference: {fileID: 0} - target: {fileID: -7511558181221131132, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} @@ -289,7 +289,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: robotMinReach: 20 - robotMaxReach: 50 + robotMaxReach: 35 yAltitudeTable: 57 --- !u!1 &385129266 GameObject: @@ -710,7 +710,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _camera: {fileID: 1207423634} - maxSamples: 10 + maxSamples: 20000 cube: {fileID: 174459726} fileCounter: 0 --- !u!114 &886963047 @@ -729,7 +729,6 @@ MonoBehaviour: robot: {fileID: 1442213767} table: {fileID: 1064094162} DomainRandomizationObject: {fileID: 1054542686} - index: 0 --- !u!114 &886963048 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1177,11 +1176,12 @@ MonoBehaviour: table: {fileID: 1064094162} cube: {fileID: 174459726} robot: {fileID: 1442213767} + maxdistanceToTheCenter: 35 scaleObject: {x: 7, y: 7, z: 7} nbMaxDistractorObjects: 8 rotationAngle: 10 yAltitudeTable: 57 - minimumDistanceWithoutObjects: 0.35 + minimumDistanceWithoutObjects: 3.5 nbMaxLights: 3 --- !u!4 &1054542688 Transform: @@ -1296,7 +1296,7 @@ PrefabInstance: - target: {fileID: -4216859302048453862, guid: 3fba682e7b5a0444eb5e51e6fc772147, type: 3} propertyPath: m_LocalScale.z - value: 0.7 + value: 1 objectReference: {fileID: 0} - target: {fileID: -927199367670048503, guid: 3fba682e7b5a0444eb5e51e6fc772147, type: 3} diff --git a/ArmRobot/Assets/Scripts/DomainRandomization.cs b/ArmRobot/Assets/Scripts/DomainRandomization.cs index 1ad9703a..47fbe768 100644 --- a/ArmRobot/Assets/Scripts/DomainRandomization.cs +++ b/ArmRobot/Assets/Scripts/DomainRandomization.cs @@ -7,30 +7,25 @@ public class DomainRandomization : MonoBehaviour public GameObject table; public GameObject cube; public GameObject robot; - float robotMinReach; - float robotMaxReach; + + public int maxdistanceToTheCenter = 35; public Vector3 scaleObject = new Vector3 (7f, 7f, 7f); - public int nbMaxDistractorObjects = 8; + public int nbMaxDistractorObjects = 7; public float rotationAngle = 10.0f; public float yAltitudeTable = 57f; - public float minimumDistanceWithoutObjects = 0.35f; + public float minimumDistanceWithoutObjects = 3.5f; public int nbMaxLights = 3; void Start() { - //cube.tag = "Cube"; - - RandomizerPositionObject tablePositionRandomizerCube = cube.GetComponent(); - robotMinReach = tablePositionRandomizerCube.robotMinReach; - robotMaxReach = tablePositionRandomizerCube.robotMaxReach; - + cube.tag = "Cube"; } @@ -45,7 +40,7 @@ public List InitializationObjects(){ } - public void DomainRandomizationScene(int index) + public void DomainRandomizationScene() { // we create a list that will contains all the objects we have already moved List listOfAlreadyMovedObjects = new List(); @@ -57,13 +52,12 @@ public void DomainRandomizationScene(int index) // then we change its pattern - //CheckerBoard checkerBoardCube = cube.GetComponent(); + CheckerBoard checkerBoardCube = cube.GetComponent(); //checkerBoardCube.CheckerBoardChange(); // then we change its color - ColorRandomizer colorRandomizerCube = cube.GetComponent(); - colorRandomizerCube.ChangeColor(); + //colorRandomizerCube.ChangeColor(); listOfAlreadyMovedObjects.Add(cube); @@ -129,23 +123,50 @@ List CreateRandomListDistractors() { // this function is designed to create a list of a random number of cylinders and instantiate them float minimumDistanceBetweenObjects = scaleObject[0] + minimumDistanceWithoutObjects; + int randomNumberDistractors = 1 + Random.Range(1, nbMaxDistractorObjects); List listOfDistractors = new List(); for (var i = 0; i < randomNumberDistractors; i++) { int typeObject = Random.Range(0,2); GameObject distractor; - if (typeObject == 0){ - - Vector3 position = new Vector3(robotMaxReach - 2*minimumDistanceWithoutObjects, - yAltitudeTable, robotMaxReach - 2*minimumDistanceWithoutObjects - minimumDistanceBetweenObjects*i); - distractor = CreateCylinder(position, scaleObject); + if (i <= 2) { + Vector3 position = new Vector3(maxdistanceToTheCenter - 2*minimumDistanceWithoutObjects, + yAltitudeTable, maxdistanceToTheCenter - minimumDistanceWithoutObjects - minimumDistanceBetweenObjects*i); + if (typeObject == 0){ + distractor = CreateCylinder(position, scaleObject); + } + else { + distractor = CreateShere(position, scaleObject); + } + listOfDistractors.Add(distractor); } - else { - Vector3 position = new Vector3(robotMaxReach - 2*minimumDistanceWithoutObjects - minimumDistanceBetweenObjects, - yAltitudeTable, robotMaxReach - 2*minimumDistanceWithoutObjects - minimumDistanceBetweenObjects*i); - distractor = CreateShere(position, scaleObject); + if ((2 < i) && (i <=5)) { + Vector3 position = new Vector3(maxdistanceToTheCenter - 2*minimumDistanceWithoutObjects - minimumDistanceBetweenObjects, + yAltitudeTable, maxdistanceToTheCenter - minimumDistanceWithoutObjects - minimumDistanceBetweenObjects*(i-2)); + Debug.Log("position"); + Debug.Log(position); + if (typeObject == 0){ + distractor = CreateCylinder(position, scaleObject); + } + else { + distractor = CreateShere(position, scaleObject); + } + listOfDistractors.Add(distractor); } - listOfDistractors.Add(distractor); + + if (i > 5) { + Vector3 position = new Vector3(maxdistanceToTheCenter - 2*minimumDistanceWithoutObjects - 2 * minimumDistanceBetweenObjects, + yAltitudeTable, maxdistanceToTheCenter - minimumDistanceWithoutObjects - minimumDistanceBetweenObjects*(i-5)); + + if (typeObject == 0){ + distractor = CreateCylinder(position, scaleObject); + } + else { + distractor = CreateShere(position, scaleObject); + } + listOfDistractors.Add(distractor); + } + } return listOfDistractors; } @@ -175,7 +196,7 @@ void DesactiveObjects(){ GameObject CreateCylinder(Vector3 position, Vector3 scale) { // method to create a cylinder gameobject - GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder); + GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder); cylinder.transform.position = position; cylinder.tag = "Cylinder"; @@ -195,7 +216,7 @@ GameObject CreateCylinder(Vector3 position, Vector3 scale) { GameObject CreateShere(Vector3 position, Vector3 scale) { // method to create a sphere gameobject - GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); + GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere.transform.position = position; sphere.tag = "Sphere"; diff --git a/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs b/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs index 7e2d18fa..255e776c 100644 --- a/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs +++ b/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs @@ -7,8 +7,8 @@ public class RandomizerPositionObject : MonoBehaviour private GameObject gameObjectSeen; - public float robotMinReach = 20f; - public float robotMaxReach = 50f; + public float robotMinReach = 20; + public float robotMaxReach = 35; Bounds tableBounds; public float yAltitudeTable = 57f; @@ -38,6 +38,7 @@ public void Move(List listOfAlreadyMovedObjects) Random.value * 360.0f, transform.rotation.eulerAngles.z); transform.rotation = Quaternion.Euler(randomRotation); + } @@ -90,8 +91,7 @@ public Vector2 RandomPoint(float minRadius, float maxRadius, List li // edge (2 * maxRadius - radiusOfTheGameObject) to be sure that the point is reachable by the robot float gameObjectRadius = GameObjectRadius(gameObject); - Debug.Log("gameObjectRadius :" + gameObjectRadius); - + float randomX; float randomZ; int randomConstraint = Random.Range(0, 2); diff --git a/ArmRobot/Assets/Scripts/Robot/RobotVisionCapture.cs b/ArmRobot/Assets/Scripts/Robot/RobotVisionCapture.cs index b083005e..34e8cd03 100644 --- a/ArmRobot/Assets/Scripts/Robot/RobotVisionCapture.cs +++ b/ArmRobot/Assets/Scripts/Robot/RobotVisionCapture.cs @@ -8,7 +8,6 @@ public class RobotVisionCapture : MonoBehaviour public GameObject robot; public GameObject table; public GameObject DomainRandomizationObject; - public int index; @@ -27,23 +26,19 @@ private void Update() VisionDataCollector visionDataCollector = GetComponent(); string imageName = visionDataCollector.NextImageName(); Vector3 relativeCubePosition = cube.transform.position - robot.transform.position; - - CameraPixel cameraPixel = GetComponent(); - Vector2 screenPos = cameraPixel.GetPixelPosition(); - - - RobotVisionDataPoint dataPoint = new RobotVisionDataPoint(screenPos, relativeCubePosition, imageName); + + Quaternion cube_orientation = cube.transform.rotation; + RobotVisionDataPoint dataPoint = new RobotVisionDataPoint(cube_orientation, relativeCubePosition, imageName); bool didCapture = visionDataCollector.CaptureIfNecessary(imageName, dataPoint); if (didCapture) { - Reset(index); - index = index + 1; + Reset(); } } - private void Reset(int index) + private void Reset() { /* Here we will do the domain randomization. Thus we will randomize: - number and shape of distractor objects on the table (cylinders and spheres) @@ -53,7 +48,7 @@ private void Reset(int index) */ if (DomainRandomizationObject.GetComponent() != null){ DomainRandomization domainRandomization = DomainRandomizationObject.GetComponent(); - domainRandomization.DomainRandomizationScene(index); + domainRandomization.DomainRandomizationScene(); } } diff --git a/ArmRobot/Assets/Scripts/Robot/RobotVisionDataPoint.cs b/ArmRobot/Assets/Scripts/Robot/RobotVisionDataPoint.cs index a7644d02..4e8e9a86 100644 --- a/ArmRobot/Assets/Scripts/Robot/RobotVisionDataPoint.cs +++ b/ArmRobot/Assets/Scripts/Robot/RobotVisionDataPoint.cs @@ -9,18 +9,24 @@ public class RobotVisionDataPoint public float x; public float y; public float z; + public float q_w; + public float q_x; + public float q_y; + public float q_z; public string screenCaptureName; - public RobotVisionDataPoint(Vector2 screenPos, Vector3 relativeCubePosition, string screenCaptureName) + public RobotVisionDataPoint(Quaternion cube_orientation, Vector3 relativeCubePosition, string screenCaptureName) { - - this.pixel_x = screenPos[0]; - this.pixel_y = 1028 - screenPos[1]; // we need to switch from bottom left corner to top left corner this.x = relativeCubePosition[0]; this.y = relativeCubePosition[1]; this.z = relativeCubePosition[2]; + this.q_w = cube_orientation[3]; + this.q_x = cube_orientation[0]; + this.q_y = cube_orientation[1]; + this.q_z = cube_orientation[2]; + this.screenCaptureName = screenCaptureName; } diff --git a/README.md b/README.md index 808d3461..6bbaf7b4 100755 --- a/README.md +++ b/README.md @@ -34,6 +34,21 @@ Then, I need to check if the proposed position does not interfer which other obj For the other elements which are randomized, follow the code inside `DomainRandomization.cs` and go to the corresponding files to understand how it is done. + +## Switch to an asymetric cube +The advantage to switch to an asymmetric cube is to train a model for predicting orientation. We define the orientation of an object by its quaternion represensation and to have an asymmetric cube in the scene they are some few steps to do. +- delete the `Cube` gameObject in the `Hierarchy` +- inside the `Project` pannel, you have a folder `Models` where there is a sub-folder `SymmetryCube2`. Inside this sub-folder there is a prefab called `SymmetryCube`. Drag and drop the prefab inside the `Hierarchy`. Thus, you have just created a new gameObject called `SymmetryCube`. You need to change the name to `Cube`. +- now click on the `DomainRandomizationObject` GameObject. In the inspector view, under the `DomainRandomization (script)` you can see a variable `Cube` equal to `None`. You need to drag and drop the `Cube` GameObject at that location. +- now click on the `VisionDataCollection` GameObject. In the inspector view, under the `VisionDataCollector (script)` you can see a variable `Cube` equal to `None`. You need to drag and drop the `Cube` GameObject at that location. Also, you do the same for `RobotVisionCapture (script)` and `CameraPixel (script)`. +- you need to add two components in the `Cube` GameObject. Thus click on the `Cube` GameObject and under the inspector view you can add components. You need to add `boxCollider` and a `RigidBody`. + + + +Finally the scene should look like the following: + + + ## Run Simulation Open `Scenes` > `ArticulationRobot`, and press play. To control the number of data you want to extract, you need to change the value of variable `Max Samples` in the inspector of the `VisionDataCollector` game object. Then, when you press start and the ismulation is over, if you go to the log, you can see the path on your computer where the data was loaded. From 8bb244aa50669f752c2c8be2b6947075db143f3e Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 16:11:30 -0700 Subject: [PATCH 04/14] add a new section - switch to an asymmetric cube --- README.md | 20 +++++++++++--------- docs/images/asymmetric_cube.png | Bin 0 -> 130511 bytes 2 files changed, 11 insertions(+), 9 deletions(-) create mode 100644 docs/images/asymmetric_cube.png diff --git a/README.md b/README.md index 6bbaf7b4..ff3635df 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Single Cube Environment +# Multiple objects Environment In this branch, we set up an environment with a [Universal Robotics UR3e](https://www.universal-robots.com/products/ur3-robot/) robot on a table along with a cube. @@ -36,14 +36,16 @@ For the other elements which are randomized, follow the code inside `DomainRando ## Switch to an asymetric cube -The advantage to switch to an asymmetric cube is to train a model for predicting orientation. We define the orientation of an object by its quaternion represensation and to have an asymmetric cube in the scene they are some few steps to do. -- delete the `Cube` gameObject in the `Hierarchy` -- inside the `Project` pannel, you have a folder `Models` where there is a sub-folder `SymmetryCube2`. Inside this sub-folder there is a prefab called `SymmetryCube`. Drag and drop the prefab inside the `Hierarchy`. Thus, you have just created a new gameObject called `SymmetryCube`. You need to change the name to `Cube`. -- now click on the `DomainRandomizationObject` GameObject. In the inspector view, under the `DomainRandomization (script)` you can see a variable `Cube` equal to `None`. You need to drag and drop the `Cube` GameObject at that location. -- now click on the `VisionDataCollection` GameObject. In the inspector view, under the `VisionDataCollector (script)` you can see a variable `Cube` equal to `None`. You need to drag and drop the `Cube` GameObject at that location. Also, you do the same for `RobotVisionCapture (script)` and `CameraPixel (script)`. -- you need to add two components in the `Cube` GameObject. Thus click on the `Cube` GameObject and under the inspector view you can add components. You need to add `boxCollider` and a `RigidBody`. - - +The advantage to switch to an asymmetric cube is to train a model for predicting orientation. We define the orientation of an object by its quaternion represensation and to have an asymmetric cube in the scene they are some few steps to do. + +- in the `Project` pannel click on `Materials`. You will see a file called `NonSymmetricCubeTexture` +- then click on the `Cube` GameObject in the `Hierarchy`. +- go under `Alphabet Cube Material (Material)` +- drag and drop the `NonSymmetricCubeTexture` file in the `Albedo` variable under `Main Maps` + +Then if you want to go back to a symmetric cube, click on the little circle in front of `Albedo` and select `None`. Then you can also change the color of the cube. + + Finally the scene should look like the following: diff --git a/docs/images/asymmetric_cube.png b/docs/images/asymmetric_cube.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b192c2ccda173ec4459ef023157376dd0eb4ea GIT binary patch literal 130511 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%0DTlfcz#GbTvTUEya@z3P;oO^L)bhJ17 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 VjR_XDbutj}QB}O5fR-}}{y%dZqci{j literal 0 HcmV?d00001 From 349c8ce316535afe313aa54698c33059df2c20d4 Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 16:51:37 -0700 Subject: [PATCH 05/14] some changes to the readme file --- README.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ff3635df..4784ed8a 100755 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Below is the list of element we randomize: The domain randomization process is controlled by the script `DomainRandomization.cs` under `Assets` > `Scripts` + ## Glimpse into the code The orchestror file is `Robot` > `RobotVisionCapture.cs`. In this file, at each frame, we extract the position of the cube relative to the camera and we create a datapoint object which is the vector of data we want to extract (see `Robot` > `RobotVisionDataPoint.cs`). Then, we capture the image of the mainCamera and we load the image and the datapoint. We do these two actions in when we call the `CaptureIfNeccessary` method inside `VisionDataCollector.cs` file. Then, if we didn't reach the number of simulated data we want to extract, we repeat the process but we need to change the environment of the data by performing domain randomization. This is done in the `Reset` method. @@ -38,6 +39,8 @@ For the other elements which are randomized, follow the code inside `DomainRando ## Switch to an asymetric cube The advantage to switch to an asymmetric cube is to train a model for predicting orientation. We define the orientation of an object by its quaternion represensation and to have an asymmetric cube in the scene they are some few steps to do. + + - in the `Project` pannel click on `Materials`. You will see a file called `NonSymmetricCubeTexture` - then click on the `Cube` GameObject in the `Hierarchy`. - go under `Alphabet Cube Material (Material)` @@ -45,11 +48,6 @@ The advantage to switch to an asymmetric cube is to train a model for predicting Then if you want to go back to a symmetric cube, click on the little circle in front of `Albedo` and select `None`. Then you can also change the color of the cube. - - -Finally the scene should look like the following: - - ## Run Simulation Open `Scenes` > `ArticulationRobot`, and press play. To control the number of data you want to extract, you need to change the value of variable `Max Samples` in the inspector of the `VisionDataCollector` game object. Then, when you press start and the ismulation is over, if you go to the log, you can see the path on your computer where the data was loaded. @@ -58,14 +56,14 @@ Open `Scenes` > `ArticulationRobot`, and press play. To control the number of da Then, there is two folders inside the data folder: Logs and ScreenCapture. The ScreenCapture folder gathers all the images captured by the mainCanera object whereas Logs gathers all the datapoints inside txt files. -## Survey +## Survey Your opinion matters a great deal to us. Only by hearing your thoughts can we continue to make Unity a better simulator for robotics. Please take a few minutes to let us know about it. [Fill out the survey](https://docs.google.com/forms/d/e/1FAIpQLSc77ah4azt6D4AOxCWhjpCBgM6Si6f0DA_dunM-ZhDf5xJlgg/viewform) -## License +## License [Apache License 2.0](LICENSE) From 7b5de17a138106bc22144be344519e40f7e6a8f5 Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 17:15:33 -0700 Subject: [PATCH 06/14] some changes to the readMe file, --- ArmRobot/Assets/Scripts/DomainRandomization.cs | 17 +++-------------- README.md | 3 ++- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/ArmRobot/Assets/Scripts/DomainRandomization.cs b/ArmRobot/Assets/Scripts/DomainRandomization.cs index 47fbe768..fa9b93b8 100644 --- a/ArmRobot/Assets/Scripts/DomainRandomization.cs +++ b/ArmRobot/Assets/Scripts/DomainRandomization.cs @@ -7,19 +7,12 @@ public class DomainRandomization : MonoBehaviour public GameObject table; public GameObject cube; public GameObject robot; - public int maxdistanceToTheCenter = 35; - - - public Vector3 scaleObject = new Vector3 (7f, 7f, 7f); - public int nbMaxDistractorObjects = 7; public float rotationAngle = 10.0f; - public float yAltitudeTable = 57f; public float minimumDistanceWithoutObjects = 3.5f; - public int nbMaxLights = 3; @@ -28,8 +21,6 @@ void Start() cube.tag = "Cube"; } - - public List InitializationObjects(){ List listOfObjectsTable = CreateRandomListDistractors(); @@ -39,7 +30,6 @@ public List InitializationObjects(){ return listOfObjectsTable; } - public void DomainRandomizationScene() { // we create a list that will contains all the objects we have already moved @@ -50,7 +40,6 @@ public void DomainRandomizationScene() RandomizerPositionObject tablePositionRandomizerCube = cube.GetComponent(); tablePositionRandomizerCube.Move(listOfAlreadyMovedObjects); - // then we change its pattern CheckerBoard checkerBoardCube = cube.GetComponent(); //checkerBoardCube.CheckerBoardChange(); @@ -61,7 +50,6 @@ public void DomainRandomizationScene() listOfAlreadyMovedObjects.Add(cube); - // We desactive the older objects DesactiveObjects(); @@ -195,7 +183,7 @@ void DesactiveObjects(){ } GameObject CreateCylinder(Vector3 position, Vector3 scale) { - // method to create a cylinder gameobject + // method to create a cylinder GameObject GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder); cylinder.transform.position = position; cylinder.tag = "Cylinder"; @@ -215,7 +203,7 @@ GameObject CreateCylinder(Vector3 position, Vector3 scale) { } GameObject CreateShere(Vector3 position, Vector3 scale) { - // method to create a sphere gameobject + // method to create a sphere GameObject GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere.transform.position = position; sphere.tag = "Sphere"; @@ -235,6 +223,7 @@ GameObject CreateShere(Vector3 position, Vector3 scale) { } GameObject CreateLight(){ + // method to create a light GameObject GameObject light = new GameObject(); light.tag = "Light"; diff --git a/README.md b/README.md index 4784ed8a..072993b4 100755 --- a/README.md +++ b/README.md @@ -45,8 +45,9 @@ The advantage to switch to an asymmetric cube is to train a model for predicting - then click on the `Cube` GameObject in the `Hierarchy`. - go under `Alphabet Cube Material (Material)` - drag and drop the `NonSymmetricCubeTexture` file in the `Albedo` variable under `Main Maps` +- go into `Scripts` under `Project pannel` and open the `DomainRandomization.cs` script. Scroll down and comment `//` the lines 45 and 49. These two lines are responsible of imposing a checker pattern to the cube and also of changing its color. -Then if you want to go back to a symmetric cube, click on the little circle in front of `Albedo` and select `None`. Then you can also change the color of the cube. +Then if you want to go back to a symmetric cube, click on the little circle in front of `Albedo` and select `None`. Then you can also change the color of the cube. You can also uncomment lignes 45 and 49 of the `DomainRandomization.cs` script. ## Run Simulation From ddf6f1491ef949357f55002b40e52dfee45eecef Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 17:20:53 -0700 Subject: [PATCH 07/14] changes on readme file --- ArmRobot/Assets/Scripts/VisionDataCollector.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ArmRobot/Assets/Scripts/VisionDataCollector.cs b/ArmRobot/Assets/Scripts/VisionDataCollector.cs index e530e25e..cfd7882e 100644 --- a/ArmRobot/Assets/Scripts/VisionDataCollector.cs +++ b/ArmRobot/Assets/Scripts/VisionDataCollector.cs @@ -88,6 +88,7 @@ IEnumerator Quit() private void Capture(string imageName, System.Object dataPoint) + // method to take a capture of the scene and save it inside the ScreenCapture file but also save the data into the Log file { RenderTexture currentRT = RenderTexture.active; RenderTexture.active = _camera.targetTexture; From ecd78fbfd9af7f9b880e227fa794468608e29542 Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 18:20:31 -0700 Subject: [PATCH 08/14] remote the logs --- ArmRobot/Assets/Scripts/DomainRandomization.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ArmRobot/Assets/Scripts/DomainRandomization.cs b/ArmRobot/Assets/Scripts/DomainRandomization.cs index fa9b93b8..c1b6a1ab 100644 --- a/ArmRobot/Assets/Scripts/DomainRandomization.cs +++ b/ArmRobot/Assets/Scripts/DomainRandomization.cs @@ -131,8 +131,6 @@ List CreateRandomListDistractors() if ((2 < i) && (i <=5)) { Vector3 position = new Vector3(maxdistanceToTheCenter - 2*minimumDistanceWithoutObjects - minimumDistanceBetweenObjects, yAltitudeTable, maxdistanceToTheCenter - minimumDistanceWithoutObjects - minimumDistanceBetweenObjects*(i-2)); - Debug.Log("position"); - Debug.Log(position); if (typeObject == 0){ distractor = CreateCylinder(position, scaleObject); } From 30450ca2584ea8091246efde1a24b3687a05c573 Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 18:29:07 -0700 Subject: [PATCH 09/14] changes brought to the domain randomization file --- ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat | 2 +- ArmRobot/Assets/Scenes/ArticulationRobot.unity | 4 +++- ArmRobot/Assets/Scripts/DomainRandomization.cs | 10 ++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat b/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat index 0d108acb..9dceea8f 100644 --- a/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat +++ b/ArmRobot/Assets/Materials/AlphabetCubeMaterial.mat @@ -73,6 +73,6 @@ Material: - _UVSec: 0 - _ZWrite: 1 m_Colors: - - _Color: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 0.7607844, g: 0.7607844, b: 0.7607844, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} m_BuildTextureStacks: [] diff --git a/ArmRobot/Assets/Scenes/ArticulationRobot.unity b/ArmRobot/Assets/Scenes/ArticulationRobot.unity index 3e31f707..04966656 100644 --- a/ArmRobot/Assets/Scenes/ArticulationRobot.unity +++ b/ArmRobot/Assets/Scenes/ArticulationRobot.unity @@ -710,7 +710,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _camera: {fileID: 1207423634} - maxSamples: 20000 + maxSamples: 20 cube: {fileID: 174459726} fileCounter: 0 --- !u!114 &886963047 @@ -1176,6 +1176,8 @@ MonoBehaviour: table: {fileID: 1064094162} cube: {fileID: 174459726} robot: {fileID: 1442213767} + _camera: {fileID: 0} + directionalLight: {fileID: 0} maxdistanceToTheCenter: 35 scaleObject: {x: 7, y: 7, z: 7} nbMaxDistractorObjects: 8 diff --git a/ArmRobot/Assets/Scripts/DomainRandomization.cs b/ArmRobot/Assets/Scripts/DomainRandomization.cs index c1b6a1ab..cfa22a0c 100644 --- a/ArmRobot/Assets/Scripts/DomainRandomization.cs +++ b/ArmRobot/Assets/Scripts/DomainRandomization.cs @@ -7,6 +7,8 @@ public class DomainRandomization : MonoBehaviour public GameObject table; public GameObject cube; public GameObject robot; + public GameObject _camera; + public GameObject directionalLight; public int maxdistanceToTheCenter = 35; public Vector3 scaleObject = new Vector3 (7f, 7f, 7f); public int nbMaxDistractorObjects = 7; @@ -78,11 +80,8 @@ public void DomainRandomizationScene() colorRandomizerChildRobot.ChangeColor(); } - - // move the camera - GameObject camera = GameObject.Find("VisionCamera"); - RandomizerPositionCamera randomizedPositionCamera = camera.GetComponent(); + RandomizerPositionCamera randomizedPositionCamera = _camera.GetComponent(); randomizedPositionCamera.Move(); @@ -91,8 +90,7 @@ public void DomainRandomizationScene() colorRandomizerTable.ChangeColor(); // change the Directionalight - GameObject directionLight = GameObject.Find("DirectionalLight"); - DirectionalLightRandomization directionalLightRandomizer = directionLight.GetComponent(); + DirectionalLightRandomization directionalLightRandomizer = directionalLight.GetComponent(); directionalLightRandomizer.UpdateLight(); } From 125623b66994231512ca4394f6e5552032e1ffb3 Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 19:10:02 -0700 Subject: [PATCH 10/14] some changes on the domain rnadomization script --- ArmRobot/Assets/Scenes/ArticulationRobot.unity | 5 ++--- ArmRobot/Assets/Scripts/DomainRandomization.cs | 4 ++-- ArmRobot/Assets/Scripts/RandomizerPositionObject.cs | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ArmRobot/Assets/Scenes/ArticulationRobot.unity b/ArmRobot/Assets/Scenes/ArticulationRobot.unity index 04966656..f5d9ef24 100644 --- a/ArmRobot/Assets/Scenes/ArticulationRobot.unity +++ b/ArmRobot/Assets/Scenes/ArticulationRobot.unity @@ -290,7 +290,6 @@ MonoBehaviour: m_EditorClassIdentifier: robotMinReach: 20 robotMaxReach: 35 - yAltitudeTable: 57 --- !u!1 &385129266 GameObject: m_ObjectHideFlags: 0 @@ -1176,8 +1175,8 @@ MonoBehaviour: table: {fileID: 1064094162} cube: {fileID: 174459726} robot: {fileID: 1442213767} - _camera: {fileID: 0} - directionalLight: {fileID: 0} + _camera: {fileID: 1207423632} + directionalLight: {fileID: 954335180} maxdistanceToTheCenter: 35 scaleObject: {x: 7, y: 7, z: 7} nbMaxDistractorObjects: 8 diff --git a/ArmRobot/Assets/Scripts/DomainRandomization.cs b/ArmRobot/Assets/Scripts/DomainRandomization.cs index cfa22a0c..9689e313 100644 --- a/ArmRobot/Assets/Scripts/DomainRandomization.cs +++ b/ArmRobot/Assets/Scripts/DomainRandomization.cs @@ -40,7 +40,7 @@ public void DomainRandomizationScene() // Then we start moving the objects and changing the color // move cube RandomizerPositionObject tablePositionRandomizerCube = cube.GetComponent(); - tablePositionRandomizerCube.Move(listOfAlreadyMovedObjects); + tablePositionRandomizerCube.Move(listOfAlreadyMovedObjects, yAltitudeTable); // then we change its pattern CheckerBoard checkerBoardCube = cube.GetComponent(); @@ -65,7 +65,7 @@ public void DomainRandomizationScene() // we iterate through the listOfObjects and move them one by one foreach (GameObject gameobject in listOfObjectsTable) { RandomizerPositionObject tablePositionRandomizerObject = gameobject.GetComponent(); - tablePositionRandomizerObject.Move(listOfAlreadyMovedObjects); + tablePositionRandomizerObject.Move(listOfAlreadyMovedObjects, yAltitudeTable); listOfAlreadyMovedObjects.Add(gameobject); // we add the gameobject to the already moved objects } diff --git a/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs b/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs index 255e776c..dcc60117 100644 --- a/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs +++ b/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs @@ -11,12 +11,11 @@ public class RandomizerPositionObject : MonoBehaviour public float robotMaxReach = 35; Bounds tableBounds; - public float yAltitudeTable = 57f; // CONTROL - public void Move(List listOfAlreadyMovedObjects) + public void Move(List listOfAlreadyMovedObjects, float yAltitudeTable) { Vector3 initialRotation = new Vector3(0f, 0f, 0f); transform.rotation = Quaternion.Euler(initialRotation); From 68a2b910f7dda6cfda6d5342bdeb17a97e3f1e9c Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 22:28:19 -0700 Subject: [PATCH 11/14] modification of the scene --- ArmRobot/Assets/Scripts/DomainRandomization.cs | 2 +- ArmRobot/Assets/Scripts/Robot/RobotVisionDataPoint.cs | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/ArmRobot/Assets/Scripts/DomainRandomization.cs b/ArmRobot/Assets/Scripts/DomainRandomization.cs index 9689e313..2c3efc02 100644 --- a/ArmRobot/Assets/Scripts/DomainRandomization.cs +++ b/ArmRobot/Assets/Scripts/DomainRandomization.cs @@ -110,7 +110,7 @@ List CreateRandomListDistractors() // this function is designed to create a list of a random number of cylinders and instantiate them float minimumDistanceBetweenObjects = scaleObject[0] + minimumDistanceWithoutObjects; - int randomNumberDistractors = 1 + Random.Range(1, nbMaxDistractorObjects); + int randomNumberDistractors = Random.Range(0, nbMaxDistractorObjects); List listOfDistractors = new List(); for (var i = 0; i < randomNumberDistractors; i++) { int typeObject = Random.Range(0,2); diff --git a/ArmRobot/Assets/Scripts/Robot/RobotVisionDataPoint.cs b/ArmRobot/Assets/Scripts/Robot/RobotVisionDataPoint.cs index 4e8e9a86..4ce6d2ff 100644 --- a/ArmRobot/Assets/Scripts/Robot/RobotVisionDataPoint.cs +++ b/ArmRobot/Assets/Scripts/Robot/RobotVisionDataPoint.cs @@ -3,9 +3,6 @@ [System.Serializable] public class RobotVisionDataPoint { - public float pixel_x; - public float pixel_y; - public float x; public float y; public float z; From ad0ae78ed88ee61e768a23fc2b3f7d00c614c6ed Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 23:25:55 -0700 Subject: [PATCH 12/14] modification of the scene --- .../Assets/Scenes/ArticulationRobot.unity | 78 +++++++++---------- .../Assets/Scripts/DomainRandomization.cs | 8 +- .../Scripts/RandomizerPositionObject.cs | 4 +- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/ArmRobot/Assets/Scenes/ArticulationRobot.unity b/ArmRobot/Assets/Scenes/ArticulationRobot.unity index f5d9ef24..226a2361 100644 --- a/ArmRobot/Assets/Scenes/ArticulationRobot.unity +++ b/ArmRobot/Assets/Scenes/ArticulationRobot.unity @@ -139,22 +139,22 @@ PrefabInstance: - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalPosition.x - value: 20 + value: 0.2 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalPosition.y - value: 57 + value: 0.815 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalPosition.z - value: -35 + value: 0 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalRotation.x - value: -0.7071068 + value: 0 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} @@ -164,17 +164,17 @@ PrefabInstance: - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalRotation.z - value: -0 + value: 0 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalRotation.w - value: 0.7071067 + value: 1 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_RootOrder - value: 9 + value: 5 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} @@ -194,17 +194,17 @@ PrefabInstance: - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalScale.x - value: 350 + value: 5 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalScale.y - value: 350 + value: 5 objectReference: {fileID: 0} - target: {fileID: -8679921383154817045, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} propertyPath: m_LocalScale.z - value: 350 + value: 5 objectReference: {fileID: 0} - target: {fileID: -7511558181221131132, guid: 3e59c8daa92034cdc906b0103d57c584, type: 3} @@ -239,9 +239,9 @@ Rigidbody: serializedVersion: 2 m_Mass: 1 m_Drag: 0 - m_AngularDrag: 0.05 + m_AngularDrag: 0 m_UseGravity: 1 - m_IsKinematic: 0 + m_IsKinematic: 1 m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 @@ -288,8 +288,8 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 12c87eca3d37f49ce94654534ab6996c, type: 3} m_Name: m_EditorClassIdentifier: - robotMinReach: 20 - robotMaxReach: 35 + robotMinReach: 0.2 + robotMaxReach: 0.5 --- !u!1 &385129266 GameObject: m_ObjectHideFlags: 0 @@ -336,7 +336,7 @@ ArticulationBody: m_GameObject: {fileID: 385129266} m_Enabled: 1 m_Mass: 1 - m_ParentAnchorPosition: {x: 0, y: 0.06584515, z: -0.0643453} + m_ParentAnchorPosition: {x: 0, y: 0.06584513, z: -0.0643453} m_ParentAnchorRotation: {x: 0.49999997, y: -0.49999997, z: -0.49999997, w: -0.49999997} m_AnchorPosition: {x: 0, y: 0, z: 0} m_AnchorRotation: {x: 0.49999997, y: -0.49999997, z: -0.49999997, w: -0.49999997} @@ -522,7 +522,7 @@ ArticulationBody: m_GameObject: {fileID: 622386702} m_Enabled: 1 m_Mass: 1 - m_ParentAnchorPosition: {x: 0, y: 0.037492096, z: -0.038539764} + m_ParentAnchorPosition: {x: 0, y: 0.037492037, z: -0.038539764} m_ParentAnchorRotation: {x: 0, y: 0, z: 0.70710677, w: 0.70710677} m_AnchorPosition: {x: 0, y: 0, z: 0} m_AnchorRotation: {x: 0, y: 0, z: 0.70710677, w: 0.70710677} @@ -694,7 +694,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 6 + m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &886963046 MonoBehaviour: @@ -788,7 +788,7 @@ ArticulationBody: m_GameObject: {fileID: 948141744} m_Enabled: 1 m_Mass: 1 - m_ParentAnchorPosition: {x: -0.000031095744, y: 0.24224612, z: -0.005073361} + m_ParentAnchorPosition: {x: -0.000031095744, y: 0.24224609, z: -0.0050733536} m_ParentAnchorRotation: {x: -0.49999997, y: 0.49999997, z: -0.49999997, w: -0.49999997} m_AnchorPosition: {x: 0, y: 0, z: 0} m_AnchorRotation: {x: -0.49999997, y: 0.49999997, z: -0.49999997, w: -0.49999997} @@ -1056,7 +1056,7 @@ ArticulationBody: m_GameObject: {fileID: 995377197} m_Enabled: 1 m_Mass: 1 - m_ParentAnchorPosition: {x: 0, y: 0.045000076, z: -0.04700001} + m_ParentAnchorPosition: {x: 0, y: 0.045000076, z: -0.046999995} m_ParentAnchorRotation: {x: -0.5, y: 0.5, z: 0.5, w: 0.5} m_AnchorPosition: {x: 0, y: 0, z: 0} m_AnchorRotation: {x: 0, y: 0, z: 0.70710677, w: 0.70710677} @@ -1177,12 +1177,12 @@ MonoBehaviour: robot: {fileID: 1442213767} _camera: {fileID: 1207423632} directionalLight: {fileID: 954335180} - maxdistanceToTheCenter: 35 - scaleObject: {x: 7, y: 7, z: 7} - nbMaxDistractorObjects: 8 + maxdistanceToTheCenter: 0 + scaleObject: {x: 0.1, y: 0.1, z: 0.1} + nbMaxDistractorObjects: 5 rotationAngle: 10 - yAltitudeTable: 57 - minimumDistanceWithoutObjects: 3.5 + yAltitudeTable: 0.815 + minimumDistanceWithoutObjects: 0.035 nbMaxLights: 3 --- !u!4 &1054542688 Transform: @@ -1196,7 +1196,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 8 + m_RootOrder: 9 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1054542689 MonoBehaviour: @@ -1287,17 +1287,17 @@ PrefabInstance: - target: {fileID: -4216859302048453862, guid: 3fba682e7b5a0444eb5e51e6fc772147, type: 3} propertyPath: m_LocalScale.x - value: 0.7 + value: 0.01 objectReference: {fileID: 0} - target: {fileID: -4216859302048453862, guid: 3fba682e7b5a0444eb5e51e6fc772147, type: 3} propertyPath: m_LocalScale.y - value: 0.7 + value: 0.01 objectReference: {fileID: 0} - target: {fileID: -4216859302048453862, guid: 3fba682e7b5a0444eb5e51e6fc772147, type: 3} propertyPath: m_LocalScale.z - value: 1 + value: 0.01 objectReference: {fileID: 0} - target: {fileID: -927199367670048503, guid: 3fba682e7b5a0444eb5e51e6fc772147, type: 3} @@ -1576,7 +1576,7 @@ ArticulationBody: m_GameObject: {fileID: 1207038283} m_Enabled: 1 m_Mass: 1 - m_ParentAnchorPosition: {x: 0, y: 0.044682086, z: -0.04507106} + m_ParentAnchorPosition: {x: 0, y: 0.044682026, z: -0.045071054} m_ParentAnchorRotation: {x: -0.49999997, y: 0.49999997, z: -0.49999997, w: -0.49999997} m_AnchorPosition: {x: 0, y: 0, z: 0} m_AnchorRotation: {x: -0.49999997, y: 0.49999997, z: -0.49999997, w: -0.49999997} @@ -1815,11 +1815,11 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1207423632} m_LocalRotation: {x: 0.13052616, y: 0, z: 0, w: 0.9914449} - m_LocalPosition: {x: 1.7, y: 98, z: -104.8} + m_LocalPosition: {x: 0.052, y: 1.71, z: -1.91} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 7 + m_RootOrder: 8 m_LocalEulerAnglesHint: {x: 15, y: 0, z: 0} --- !u!1 &1442213767 GameObject: @@ -2007,8 +2007,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1442213767} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 52, z: 0} - m_LocalScale: {x: 70, y: 70, z: 70} + m_LocalPosition: {x: 0, y: 0.77, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 1089875217} m_Father: {fileID: 0} @@ -2060,7 +2060,7 @@ ArticulationBody: m_GameObject: {fileID: 1449517471} m_Enabled: 1 m_Mass: 1 - m_ParentAnchorPosition: {x: -0.5230001, y: 11.505005, z: -1.3913959} + m_ParentAnchorPosition: {x: -0.52300006, y: 11.505002, z: -1.3914019} m_ParentAnchorRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} m_AnchorPosition: {x: 0, y: 0, z: 0} m_AnchorRotation: {x: 0, y: 0, z: 0.70710677, w: 0.70710677} @@ -2157,7 +2157,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 5 + m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1557304991 MonoBehaviour: @@ -2263,7 +2263,7 @@ Transform: m_GameObject: {fileID: 1709081025} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 20, y: 1, z: 20} + m_LocalScale: {x: 0.2, y: 0.01, z: 0.2} m_Children: [] m_Father: {fileID: 0} m_RootOrder: 2 @@ -2365,7 +2365,7 @@ ArticulationBody: m_GameObject: {fileID: 1838417712} m_Enabled: 1 m_Mass: 1 - m_ParentAnchorPosition: {x: 0.5230001, y: 11.505004, z: 1.3914145} + m_ParentAnchorPosition: {x: 0.52300006, y: 11.505001, z: 1.3913966} m_ParentAnchorRotation: {x: 0, y: 0, z: 0.7071068, w: 0.7071068} m_AnchorPosition: {x: 0, y: 0, z: 0} m_AnchorRotation: {x: 0, y: 0, z: 0.70710677, w: 0.70710677} @@ -2487,7 +2487,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 2114954002} m_LocalRotation: {x: 0.13052616, y: 0, z: 0, w: 0.9914449} - m_LocalPosition: {x: 1.7, y: 98, z: -104.8} + m_LocalPosition: {x: 0.052, y: 1.601, z: -1.507} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 0} @@ -2539,7 +2539,7 @@ ArticulationBody: m_GameObject: {fileID: 2127710631} m_Enabled: 1 m_Mass: 1 - m_ParentAnchorPosition: {x: 0.000031095744, y: 0.1733774, z: 0.042625256} + m_ParentAnchorPosition: {x: 0.000031095744, y: 0.1733774, z: 0.04262526} m_ParentAnchorRotation: {x: 0, y: 0, z: 0.70710677, w: 0.70710677} m_AnchorPosition: {x: 0, y: 0, z: 0} m_AnchorRotation: {x: 0, y: 0, z: 0.70710677, w: 0.70710677} diff --git a/ArmRobot/Assets/Scripts/DomainRandomization.cs b/ArmRobot/Assets/Scripts/DomainRandomization.cs index 2c3efc02..cd7c5f4c 100644 --- a/ArmRobot/Assets/Scripts/DomainRandomization.cs +++ b/ArmRobot/Assets/Scripts/DomainRandomization.cs @@ -9,12 +9,12 @@ public class DomainRandomization : MonoBehaviour public GameObject robot; public GameObject _camera; public GameObject directionalLight; - public int maxdistanceToTheCenter = 35; - public Vector3 scaleObject = new Vector3 (7f, 7f, 7f); + public float maxdistanceToTheCenter = 0.35f; + public Vector3 scaleObject = new Vector3 (0.1f, 0.1f, 0.1f); public int nbMaxDistractorObjects = 7; public float rotationAngle = 10.0f; - public float yAltitudeTable = 57f; - public float minimumDistanceWithoutObjects = 3.5f; + public float yAltitudeTable = 0.815f; + public float minimumDistanceWithoutObjects = 0.35f; public int nbMaxLights = 3; diff --git a/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs b/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs index dcc60117..c9dd7473 100644 --- a/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs +++ b/ArmRobot/Assets/Scripts/RandomizerPositionObject.cs @@ -7,8 +7,8 @@ public class RandomizerPositionObject : MonoBehaviour private GameObject gameObjectSeen; - public float robotMinReach = 20; - public float robotMaxReach = 35; + public float robotMinReach = 0.20f; + public float robotMaxReach = 0.35f; Bounds tableBounds; From 938d0278dd3dd3be1c84518a2c835538c086b4ff Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 23:27:32 -0700 Subject: [PATCH 13/14] modif --- ArmRobot/Assets/Scenes/ArticulationRobot.unity | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ArmRobot/Assets/Scenes/ArticulationRobot.unity b/ArmRobot/Assets/Scenes/ArticulationRobot.unity index 226a2361..eb798e10 100644 --- a/ArmRobot/Assets/Scenes/ArticulationRobot.unity +++ b/ArmRobot/Assets/Scenes/ArticulationRobot.unity @@ -709,7 +709,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: _camera: {fileID: 1207423634} - maxSamples: 20 + maxSamples: 10 cube: {fileID: 174459726} fileCounter: 0 --- !u!114 &886963047 From 3f839cfd6cf7174e565c7cc55788cbe2460288da Mon Sep 17 00:00:00 2001 From: Jonathan Leban Date: Thu, 23 Jul 2020 23:58:00 -0700 Subject: [PATCH 14/14] modification of the readme file --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 072993b4..424aa8d0 100755 --- a/README.md +++ b/README.md @@ -22,6 +22,8 @@ Below is the list of element we randomize: The domain randomization process is controlled by the script `DomainRandomization.cs` under `Assets` > `Scripts` +`IMPORTANT`: to activate more than one object on the scene you need to go in the `Hierarchy` project and select `DomainRandomizationObject` game object. Go in the `Inspector` pannel. Then in the component `DomainRandomization` there is a variable called `NbMaxDistractorObjects`. This variable corresponds to maximum number of distractors (objects other than the cube) than we can generate on the table at each frame (each simulation). + ## Glimpse into the code The orchestror file is `Robot` > `RobotVisionCapture.cs`. In this file, at each frame, we extract the position of the cube relative to the camera and we create a datapoint object which is the vector of data we want to extract (see `Robot` > `RobotVisionDataPoint.cs`). Then, we capture the image of the mainCamera and we load the image and the datapoint. We do these two actions in when we call the `CaptureIfNeccessary` method inside `VisionDataCollector.cs` file. Then, if we didn't reach the number of simulated data we want to extract, we repeat the process but we need to change the environment of the data by performing domain randomization. This is done in the `Reset` method. @@ -35,6 +37,8 @@ Then, I need to check if the proposed position does not interfer which other obj For the other elements which are randomized, follow the code inside `DomainRandomization.cs` and go to the corresponding files to understand how it is done. +## Switch from a single cube to a scene composed by a cube and multiple object +`Hierarchy` > `DomainRandomizationObject` then in the `Inspector` pannel, go in the `DomainRandomization` component and set the variable `NbMaxDistractorObjects` to more than 0. ## Switch to an asymetric cube The advantage to switch to an asymmetric cube is to train a model for predicting orientation. We define the orientation of an object by its quaternion represensation and to have an asymmetric cube in the scene they are some few steps to do.