EricVoll / ros-sharp

ROS# is a set of open source software libraries and tools in C# for communicating with ROS from .NET applications, in particular Unity3D
Apache License 2.0
36 stars 7 forks source link

Error with Image subscriber #23

Open raucal opened 6 months ago

raucal commented 6 months ago

I am having an error with the subscriber to a topic that publishes messages in sensor_msgs/Image format. This error only occurs when I implement it in Hololens 2. In Unity it works correctly. Attached is the Visual Studio console error and the subscriber script:

Exception thrown at 0x00007FFA4055DDA0 in MRTK Hololens Template.exe: Excepción de Microsoft C++: Il2CppExceptionWrapper en la posición de memoria 0x00000003F5DFCA00. NullReferenceException: Referencia de objeto no establecida a una instancia de un objeto. en RosSharp.RosBridgeClient.Communicator.GetRosName[T] () [0x00000] en <00000000000000000000000000000000>:0 at RosSharp.RosBridgeClient.Subscriber1[T]..ctor (System.String id, System.String topic, RosSharp.RosBridgeClient.SubscriptionHandler1[T] subscriptionHandler, RosSharp.RosBridgeClient.Subscription& subscription, System.Int32 throttle_rate, System.Int32 queue_length, System.Int32 fragment_size, System.String compression) [0x00000] in <00000000000000000000000000000000>:0 at RosSharp.RosBridgeClient.RosSocket.Subscribe[T] (System.String topic, RosSharp.RosBridgeClient.SubscriptionHandler1[T] subscriptionHandler, System.Int32 throttle_rate, System.Int32 queue_length, System.Int32 fragment_size, System.String compression) [0x00000] in <00000000000000000000000000000000>:0 at RosSharp.RosBridgeClient.Subscriber1[T].Start () [0x00000] in <00000000000000000000000000000000>:0 at RosSharp.RosBridgeClient.ImageSubscriber.Start () [0x00000] in <0

Script:

using UnityEngine; using UnityEngine.UI;

namespace RosSharp.RosBridgeClient { [RequireComponent(typeof(RosConnector))] public class ImageSubscriber : Subscriber { public MeshRenderer meshRenderer;

    private Texture2D texture2D;
    private byte[] imageData;
    private bool isMessageReceived;
    public GameObject raw;
    private int width, height;

    protected override void Start()
    {
        base.Start();
        texture2D = new Texture2D(1, 1);
        meshRenderer.material = new Material(Shader.Find("Standard"));
    }
    private void Update()
    {
        if (isMessageReceived)
            ProcessMessage();
    }

    protected override void ReceiveMessage(Messages.Sensor.Image Image)
    {
        width = (int)Image.width; // Ancho de la imagen (número de filas)
        height = (int)Image.height;
        imageData = Image.data;
        isMessageReceived = true;
    }

    private void ProcessMessage()
    {
        //texture2D = new Texture2D(width, height, TextureFormat.RGB24, false);
        texture2D.LoadImage(imageData);
        texture2D.Apply();
        meshRenderer.material.SetTexture("_MainTex", texture2D);
        raw.GetComponent<RawImage>().texture = texture2D;
        isMessageReceived = false;
    }

}

}