Skip to content

Commit 5b7519a

Browse files
committed
created monochrome camera
1 parent ff701cd commit 5b7519a

13 files changed

+1290
-10
lines changed

Runtime/Scripts/ROS/Unity/Publishers/ZOROSImagePublisher.cs

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,14 @@ private void Initialize() {
7979
ROSBridgeConnection.Advertise(ImageROSTopic, _rosImageMessage.MessageType);
8080
ROSBridgeConnection.Advertise(CameraInfoROSTopic, _rosCameraInfoMessage.MessageType);
8181

82+
8283
// hookup to the sensor update delegate
83-
_rgbCameraSensor.OnPublishRGBImageDelegate = OnPublishRGBImageDelegate;
84+
if (RGBCameraSensor.IsMonochrome == true) {
85+
_rgbCameraSensor.OnPublishRGBImageDelegate = OnPublishMonoImageDelegate;
86+
} else {
87+
_rgbCameraSensor.OnPublishRGBImageDelegate = OnPublishRGBImageDelegate;
88+
}
89+
8490

8591
}
8692

@@ -146,6 +152,55 @@ private Task OnPublishRGBImageDelegate(ZORGBCamera rgbCamera, string cameraId, i
146152
return Task.CompletedTask;
147153
}
148154

155+
/// <summary>
156+
/// Publishes raw camera U8 data as a ROS Image message.
157+
/// See: http://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/Image.html
158+
/// </summary>
159+
/// <param name="rgbCamera">The camera component</param>
160+
/// <param name="cameraId">Camera ID</param>
161+
/// <param name="width">Frame width</param>
162+
/// <param name="height">Frame height</param>
163+
/// <param name="rgbData">Raw RBG8 data. Note: we only sample the first channel assuming all channels have same monochrome value. </param>
164+
/// <returns></returns>
165+
private Task OnPublishMonoImageDelegate(ZORGBCamera rgbCamera, string cameraId, int width, int height, byte[] rgbData) {
166+
167+
// figure out the transforms
168+
ZOROSTransformPublisher transformPublisher = GetComponent<ZOROSTransformPublisher>();
169+
if (transformPublisher != null) {
170+
_rosImageMessage.header.frame_id = transformPublisher.ChildFrameID;
171+
_rosCameraInfoMessage.header.frame_id = transformPublisher.ChildFrameID;
172+
} else {
173+
_rosImageMessage.header.frame_id = Name;
174+
_rosCameraInfoMessage.header.frame_id = Name;
175+
}
176+
177+
// setup and send Image message
178+
_rosImageMessage.header.Update();
179+
_rosImageMessage.height = (uint)height;
180+
_rosImageMessage.width = (uint)width;
181+
_rosImageMessage.encoding = "mono8";
182+
_rosImageMessage.is_bigendian = 0;
183+
_rosImageMessage.step = 1 * (uint)width;
184+
_rosImageMessage.data = rgbData;
185+
ROSBridgeConnection.Publish<ImageMessage>(_rosImageMessage, _imageROSTopic, Name);
186+
187+
// setup and send CameraInfo message
188+
_rosCameraInfoMessage.Update();
189+
_rosCameraInfoMessage.header = _rosImageMessage.header;
190+
// initialize the camera info
191+
if (RGBCameraSensor.UnityCamera.usePhysicalProperties == true) {
192+
_rosCameraInfoMessage.BuildCameraInfo((uint)RGBCameraSensor.Width, (uint)RGBCameraSensor.Height,
193+
(double)RGBCameraSensor.FocalLengthMM,
194+
(double)RGBCameraSensor.SensorSizeMM.x, (double)RGBCameraSensor.SensorSizeMM.y);
195+
} else {
196+
_rosCameraInfoMessage.BuildCameraInfo((uint)RGBCameraSensor.Width, (uint)RGBCameraSensor.Height, (double)RGBCameraSensor.FieldOfViewDegrees);
197+
}
198+
199+
ROSBridgeConnection.Publish<CameraInfoMessage>(_rosCameraInfoMessage, _cameraInfoROSTopic, cameraId);
200+
201+
return Task.CompletedTask;
202+
}
203+
149204
#region ZOSerializationInterface
150205
public override string Type {
151206
get { return "ros.publisher.image"; }
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!1 &891913994308376444
4+
GameObject:
5+
m_ObjectHideFlags: 0
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInstance: {fileID: 0}
8+
m_PrefabAsset: {fileID: 0}
9+
serializedVersion: 6
10+
m_Component:
11+
- component: {fileID: 891913994308376443}
12+
- component: {fileID: 891913994308376441}
13+
- component: {fileID: 891913994308376442}
14+
- component: {fileID: 682675020479464245}
15+
- component: {fileID: 682675020479464244}
16+
m_Layer: 0
17+
m_Name: ROSMonoCamera
18+
m_TagString: Untagged
19+
m_Icon: {fileID: 0}
20+
m_NavMeshLayer: 0
21+
m_StaticEditorFlags: 0
22+
m_IsActive: 1
23+
--- !u!4 &891913994308376443
24+
Transform:
25+
m_ObjectHideFlags: 0
26+
m_CorrespondingSourceObject: {fileID: 0}
27+
m_PrefabInstance: {fileID: 0}
28+
m_PrefabAsset: {fileID: 0}
29+
m_GameObject: {fileID: 891913994308376444}
30+
m_LocalRotation: {x: 0, y: 0.7071068, z: -0, w: -0.7071068}
31+
m_LocalPosition: {x: -0, y: 2.76, z: 1.41}
32+
m_LocalScale: {x: 1, y: 1, z: 1}
33+
m_Children: []
34+
m_Father: {fileID: 0}
35+
m_RootOrder: 0
36+
m_LocalEulerAnglesHint: {x: 0, y: 270, z: 0}
37+
--- !u!20 &891913994308376441
38+
Camera:
39+
m_ObjectHideFlags: 0
40+
m_CorrespondingSourceObject: {fileID: 0}
41+
m_PrefabInstance: {fileID: 0}
42+
m_PrefabAsset: {fileID: 0}
43+
m_GameObject: {fileID: 891913994308376444}
44+
m_Enabled: 1
45+
serializedVersion: 2
46+
m_ClearFlags: 1
47+
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
48+
m_projectionMatrixMode: 2
49+
m_GateFitMode: 2
50+
m_FOVAxisMode: 1
51+
m_SensorSize: {x: 3.68, y: 2.76}
52+
m_LensShift: {x: 0, y: 0}
53+
m_FocalLength: 3.04
54+
m_NormalizedViewPortRect:
55+
serializedVersion: 2
56+
x: 0
57+
y: 0
58+
width: 1
59+
height: 1
60+
near clip plane: 0.3
61+
far clip plane: 1000
62+
field of view: 48.831097
63+
orthographic: 0
64+
orthographic size: 5
65+
m_Depth: 0
66+
m_CullingMask:
67+
serializedVersion: 2
68+
m_Bits: 4294967295
69+
m_RenderingPath: -1
70+
m_TargetTexture: {fileID: 0}
71+
m_TargetDisplay: 0
72+
m_TargetEye: 3
73+
m_HDR: 1
74+
m_AllowMSAA: 1
75+
m_AllowDynamicResolution: 0
76+
m_ForceIntoRT: 0
77+
m_OcclusionCulling: 1
78+
m_StereoConvergence: 10
79+
m_StereoSeparation: 0.022
80+
--- !u!114 &891913994308376442
81+
MonoBehaviour:
82+
m_ObjectHideFlags: 0
83+
m_CorrespondingSourceObject: {fileID: 0}
84+
m_PrefabInstance: {fileID: 0}
85+
m_PrefabAsset: {fileID: 0}
86+
m_GameObject: {fileID: 891913994308376444}
87+
m_Enabled: 1
88+
m_EditorHideFlags: 0
89+
m_Script: {fileID: 11500000, guid: 7de0e78cad1cc57a3b409bbb96c7af6a, type: 3}
90+
m_Name:
91+
m_EditorClassIdentifier:
92+
_updateRateHz: 30
93+
_debug: 1
94+
_currentUpdateHz: 0
95+
_currentFixedUpdateHz: 0
96+
_camera: {fileID: 891913994308376441}
97+
_isMonochrome: 0
98+
_width: 640
99+
_height: 480
100+
_postProcessMaterial: {fileID: 2100000, guid: 2e597e5b56537481a894fb4316ff9bff,
101+
type: 2}
102+
_debugWindowPosition: {x: 10, y: 10}
103+
_name:
104+
--- !u!114 &682675020479464245
105+
MonoBehaviour:
106+
m_ObjectHideFlags: 0
107+
m_CorrespondingSourceObject: {fileID: 0}
108+
m_PrefabInstance: {fileID: 0}
109+
m_PrefabAsset: {fileID: 0}
110+
m_GameObject: {fileID: 891913994308376444}
111+
m_Enabled: 1
112+
m_EditorHideFlags: 0
113+
m_Script: {fileID: 11500000, guid: 6013e0556113f1e9f95189e724e765fc, type: 3}
114+
m_Name:
115+
m_EditorClassIdentifier:
116+
_updateRateHz: 30
117+
_debug: 0
118+
_currentUpdateHz: 0
119+
_currentFixedUpdateHz: 0
120+
_ROSTopic:
121+
_name: ros.publisher.transform_ROSImagePublisher
122+
_frameId: world
123+
_childFrameId: image
124+
--- !u!114 &682675020479464244
125+
MonoBehaviour:
126+
m_ObjectHideFlags: 0
127+
m_CorrespondingSourceObject: {fileID: 0}
128+
m_PrefabInstance: {fileID: 0}
129+
m_PrefabAsset: {fileID: 0}
130+
m_GameObject: {fileID: 891913994308376444}
131+
m_Enabled: 1
132+
m_EditorHideFlags: 0
133+
m_Script: {fileID: 11500000, guid: 4eab68bc499af59ddb04d723f31065f2, type: 3}
134+
m_Name:
135+
m_EditorClassIdentifier:
136+
_updateRateHz: 30
137+
_debug: 0
138+
_currentUpdateHz: 0
139+
_currentFixedUpdateHz: 0
140+
_ROSTopic: unity_image/image
141+
_name:
142+
_rgbCameraSensor: {fileID: 891913994308376442}
143+
_imageROSTopic: image/image_raw
144+
_cameraInfoROSTopic: image/camera_info

Runtime/Scripts/Sensors/RGBCamera/ROSMonoCamera.prefab.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!21 &2100000
4+
Material:
5+
serializedVersion: 6
6+
m_ObjectHideFlags: 0
7+
m_CorrespondingSourceObject: {fileID: 0}
8+
m_PrefabInstance: {fileID: 0}
9+
m_PrefabAsset: {fileID: 0}
10+
m_Name: ZOMonoPostProcessMaterial
11+
m_Shader: {fileID: 4800000, guid: 0545a9ce3d114017fa91b1c8be6db0fa, type: 3}
12+
m_ShaderKeywords: FLIP_Y
13+
m_LightmapFlags: 4
14+
m_EnableInstancingVariants: 0
15+
m_DoubleSidedGI: 0
16+
m_CustomRenderQueue: -1
17+
stringTagMap: {}
18+
disabledShaderPasses: []
19+
m_SavedProperties:
20+
serializedVersion: 3
21+
m_TexEnvs:
22+
- _BumpMap:
23+
m_Texture: {fileID: 0}
24+
m_Scale: {x: 1, y: 1}
25+
m_Offset: {x: 0, y: 0}
26+
- _DetailAlbedoMap:
27+
m_Texture: {fileID: 0}
28+
m_Scale: {x: 1, y: 1}
29+
m_Offset: {x: 0, y: 0}
30+
- _DetailMask:
31+
m_Texture: {fileID: 0}
32+
m_Scale: {x: 1, y: 1}
33+
m_Offset: {x: 0, y: 0}
34+
- _DetailNormalMap:
35+
m_Texture: {fileID: 0}
36+
m_Scale: {x: 1, y: 1}
37+
m_Offset: {x: 0, y: 0}
38+
- _EmissionMap:
39+
m_Texture: {fileID: 0}
40+
m_Scale: {x: 1, y: 1}
41+
m_Offset: {x: 0, y: 0}
42+
- _MainTex:
43+
m_Texture: {fileID: 0}
44+
m_Scale: {x: 1, y: 1}
45+
m_Offset: {x: 0, y: 0}
46+
- _MetallicGlossMap:
47+
m_Texture: {fileID: 0}
48+
m_Scale: {x: 1, y: 1}
49+
m_Offset: {x: 0, y: 0}
50+
- _OcclusionMap:
51+
m_Texture: {fileID: 0}
52+
m_Scale: {x: 1, y: 1}
53+
m_Offset: {x: 0, y: 0}
54+
- _ParallaxMap:
55+
m_Texture: {fileID: 0}
56+
m_Scale: {x: 1, y: 1}
57+
m_Offset: {x: 0, y: 0}
58+
m_Floats:
59+
- _BumpScale: 1
60+
- _Cutoff: 0.5
61+
- _DetailNormalMapScale: 1
62+
- _DstBlend: 0
63+
- _FlipX: 0
64+
- _FlipY: 1
65+
- _GlossMapScale: 1
66+
- _Glossiness: 0.5
67+
- _GlossyReflections: 1
68+
- _Metallic: 0
69+
- _Mode: 0
70+
- _OcclusionStrength: 1
71+
- _Parallax: 0.02
72+
- _SmoothnessTextureChannel: 0
73+
- _SpecularHighlights: 1
74+
- _SrcBlend: 1
75+
- _UVSec: 0
76+
- _ZWrite: 1
77+
m_Colors:
78+
- _Color: {r: 1, g: 1, b: 1, a: 1}
79+
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
80+
m_BuildTextureStacks: []

Runtime/Scripts/Sensors/RGBCamera/ZOMonoPostProcessMaterial.mat.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
Shader "ZOSim/ZOMonoPostProcessShader"
2+
{
3+
Properties
4+
{
5+
_MainTex ("Texture", 2D) = "white" {}
6+
[Toggle(FLIP_Y)]
7+
_FlipY ("Flip Y", Float) = 0
8+
9+
[Toggle(FLIP_X)]
10+
_FlipX ("Flip X", Float) = 0
11+
12+
}
13+
SubShader
14+
{
15+
// No culling or depth
16+
Cull Off ZWrite Off ZTest Always
17+
18+
Pass
19+
{
20+
CGPROGRAM
21+
#pragma vertex vert
22+
#pragma fragment frag
23+
24+
#pragma shader_feature FLIP_Y
25+
#pragma shader_feature FLIP_X
26+
27+
#include "UnityCG.cginc"
28+
29+
struct appdata
30+
{
31+
float4 vertex : POSITION;
32+
float2 uv : TEXCOORD0;
33+
};
34+
35+
struct v2f
36+
{
37+
float2 uv : TEXCOORD0;
38+
float4 vertex : SV_POSITION;
39+
};
40+
41+
v2f vert (appdata v)
42+
{
43+
v2f o;
44+
o.vertex = UnityObjectToClipPos(v.vertex);
45+
o.uv = v.uv;
46+
#ifdef FLIP_Y
47+
o.uv.y = 1.0 - o.uv.y;
48+
#endif
49+
50+
#ifdef FLIP_X
51+
o.uv.x = 1.0 - o.uv.x;
52+
#endif
53+
54+
return o;
55+
}
56+
57+
sampler2D _MainTex;
58+
59+
fixed4 frag (v2f i) : SV_Target
60+
{
61+
fixed4 col = tex2D(_MainTex, i.uv);
62+
float avg = (col.r * 0.21) + (col.g * 0.72) + (col.b * 0.07);
63+
col.r = avg;
64+
col.g = avg;
65+
col.b = avg;
66+
return col;
67+
}
68+
ENDCG
69+
}
70+
}
71+
}

Runtime/Scripts/Sensors/RGBCamera/ZOMonoPostProcessShader.shader.meta

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)