Search Unity

  1. Unity Asset Manager is now available in public beta. Try it out now and join the conversation here in the forums.
    Dismiss Notice

Resolved Publishing and Subscribing not possible at the same time

Discussion in 'Robotics' started by ActiveSim, Mar 3, 2022.

  1. ActiveSim

    ActiveSim

    Joined:
    May 10, 2019
    Posts:
    59
    Hi there,

    my ROS connection works fine when I just subscribe or publish data. When I try both with the same ROSConnection component I do not receive the published data anymore.
    Another weird thing is that if I restart my game multiple times (without changing anything) I receive different logs in the ros_tcp_endpoint running in a docker.

    upload_2022-3-3_8-26-18.png

    Have you made the same experience and how to fix that?

    Side questions:
    • Do I always get an error when I close my game (I already use the disconnect command)?
    • How to unsubscribe from a topic (warning "publisher already registered")
     
    Last edited: Mar 3, 2022
  2. ActiveSim

    ActiveSim

    Joined:
    May 10, 2019
    Posts:
    59
  3. LaurieUnity

    LaurieUnity

    Unity Technologies

    Joined:
    Oct 23, 2020
    Posts:
    77
    The exceptions/warnings when you close the game or re-register a publisher are normal. At some point it would be nice to make this a little more graceful, but it's not actually breaking anything so it's not a high priority fix.

    As for the publishing+subscribing issue you're getting, I'm not sure what would cause the symptoms seen here. It seems likely there's a problem with how things are set up on the Unity side, how are you actually registering that laserscan publisher?
     
  4. ActiveSim

    ActiveSim

    Joined:
    May 10, 2019
    Posts:
    59
    Edit:
    I spend the last day again with debugging and find the following workaround:
    • I got it running by changing the interface script to a MonoBehaviour.
    • Then a "topic is not registered" error showed up, so I added a Thread.Sleep after the registration
    Thanks for answering the common questions @LaurieUnity
    _____________________________________________________

    The first reply was:

    Thanks for your response.
    • My sensors are running as MonoBehaviour on GameObjects
    • To make the sensor interface exchangeable (ROS2, TCP, HTTP request, etc.) it is running in a separate thread.
    • The sensors and the interfaces are controlled by an SensorBase class, to control all sensors and interfaces the same way.
    • To test the ROS connection I use a ROS wrapper which just call the according ROSConnection method
    In the ROS thread first the topic is registered and after that the sensor data is send in a while loop when there is new data available. Here is a part of the sending thread:


    Code (CSharp):
    1.           this.rosWrap.GetOrCreateInstance();
    2.             this.rosWrap.RegisterPublisher<LaserScanMsg>(topic);
    3.  
    4.  
    5.             while (isRunning)
    6.             {
    7.                 try
    8.                 {
    9.                     scanMsg = sensor.GetLatestData();
    10.                     rosMsg = new LaserScanMsg(
    11.                     //fill the rosMsg with my own scanMsg
    12.                     );            
    13.                     this.rosWrap.Publish(topic, rosMsg);
    14.                 }
    15.                 catch
    16.                 {
    17.                     Debug.Log(string.Format(Logs.ros2_closedError, Logs.ros2_lidarThread, topic));
    18.                     isRunning = false;
    19.                 }
    20.  
    21.  
    22.                 //reset event to wait for next laser rotation
    23.                 resetEvent.WaitOne();
    24.                 resetEvent.Reset();
    25.             }
    26.         }
     
    Last edited: Mar 8, 2022