Unity-Technologies/Unity-Robotics-Hub

Extraction of MessageQueue full via variable Bug in msg getting duplicated.

florianspy opened this issue · 0 comments

Is your feature request related to a problem? Please describe.

Right now it seems that when messages are too large at some point messages get dropped however only a Debug msg ("Queue full! Messages are getting dropped!) gets displayed.
Additionally it seems that message get published then sometimes multiple times instead of just once even so the publish function was not called multiple times
grafik
This is a kinda critical bug as it will effect algorithms working with the data
Having a flag which can be check to then pause simulation/ publishing untill all message got delivered would be helpfulable.
I implemented that feature as show below.
I additionally have a subscriber on the rosside now to check that all message got delivered, then publishes a msg which gets received on unity side and only then let simulation continue,
as otherwise i always lost data at some point.
This issue seems to happen when i use it with a docker as the ros side, however under linux the issue of duplicating message also presist but i didnt observe message drops.

Describe the solution you'd like

I implement that feature in the following way i added to ROSConnection

[SerializeField]
static bool  m_queuefull=false;
public bool queuefull { get => m_queuefull; set => m_queuefull = value; }
public bool Queue(){
			return queuefull;
}

furthermore at the line

int count=0;
while (outgoingQueue.TryDequeue(out OutgoingMessageSender sendsOutgoingMessages))
                        {
                            OutgoingMessageSender.SendToState sendToState = sendsOutgoingMessages.SendInternal(messageSerializer, networkStream);
                            switch (sendToState)
                            {
                                case OutgoingMessageSender.SendToState.Normal:
                                    //This is normal operation.
									count=count+1;
									//this must always be +1 one than your queue size otherwise the stuff gets stuck
									//queue size should always be at least 1 larger than the amount of message you have in one go.
									if(count >=4){
										ROSConnection.m_queuefull=true;	
									}
									Debug.Log("called"+count);
                                    break;
                                case OutgoingMessageSender.SendToState.QueueFullWarning:
                                    //Unable to send messages to ROS as fast as we're generating them.
                                    //This could be caused by a TCP connection that is too slow.
                                    Debug.LogWarning($"Queue full! Messages are getting dropped! " +
                                                     "Try check your connection speed is fast enough to handle the traffic."+count);
									ROSConnection.m_queuefull=true;
                                    break;
                                case OutgoingMessageSender.SendToState.NoMessageToSendError:
                                    //This indicates
                                    Debug.LogError(
                                        "Logic Error! A 'SendsOutgoingMessages' was queued but did not have any messages to send.");
                                    break;
                            }

                            token.ThrowIfCancellationRequested();
                            waitingSinceRealTime = s_RealTimeSinceStartup;
                        }
			ROSConnection.m_queuefull=false;

By this we can read out if the msg queue is full in any program for example via:
ros = ROSConnection.GetOrCreateInstance();
bool rosqueuefull =ros.Queue();
Describe alternatives you've considered

Additional context
Add any other context or screenshots about the feature request here.