-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathImageSubscriber.cs
81 lines (74 loc) · 2.45 KB
/
ImageSubscriber.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using UnityEngine;
using UnityEngine.UI;
using Unity.Robotics.ROSTCPConnector;
using CompressedImageMsg = RosMessageTypes.Sensor.CompressedImageMsg;
/// <summary>
/// カメラデータ(CompressedImageMsg)を受信し、描画するためのクラス
/// </summary>
public class ImageSubscriber : MonoBehaviour
{
// 受信するROSのトピック名
[SerializeField] string rosTopicName = "image_raw/compressed";
// デバッグモードとするかどうか(デバッグモードではコンソールにログを出力)
[SerializeField] bool isDebugMode = true;
// カメラデータを貼り付けるRawImageオブジェクト
[SerializeField] RawImage rawImage;
private Texture2D texture2D;
private CameraImage cameraImage = new CameraImage();
private bool isMessageReceived;
/// <summary>
/// 初期化用のイベント関数
/// https://docs.unity3d.com/ja/2020.3/Manual/ExecutionOrder.html
/// </summary>
void Start()
{
ROSConnection.GetOrCreateInstance().Subscribe<CompressedImageMsg>(rosTopicName, ImageMsgUpdate);
texture2D = new Texture2D(1, 1);
}
/// <summary>
/// 1フレーム毎に呼び出されるイベント関数
/// https://docs.unity3d.com/ja/2020.3/Manual/ExecutionOrder.html
/// </summary>
void Update()
{
if (isMessageReceived)
{
ProcessMessage();
}
}
/// <summary>
/// ROSトピックを受け取った際に呼ばれるコールバック関数
/// </summary>
void ImageMsgUpdate(CompressedImageMsg rawImage)
{
lock (cameraImage)
{
cameraImage.imageData = rawImage.data;
if (isDebugMode)
{
Debug.Log("rawImage recieved. length :" + System.Buffer.ByteLength(cameraImage.imageData));
}
}
isMessageReceived = true;
}
/// <summary>
/// ImageMsgのデータをTextureに反映する関数
/// </summary>
void ProcessMessage()
{
lock (cameraImage)
{
texture2D.LoadImage(cameraImage.imageData);
texture2D.Apply();
}
rawImage.texture = texture2D;
isMessageReceived = false;
}
}
/// <summary>
/// アクセス制限用のカメライメージデータ格納配列
/// </summary>
class CameraImage
{
public byte[] imageData { get; set; }
}