Skip to content

Conversation

@berndgassmann
Copy link
Contributor

@berndgassmann berndgassmann commented Nov 21, 2025

Description

Extend ROS2 support Step 3: Rework ROS2 handling

This commit is extending the built-in ROS2 support of CARLA:

  • the internal interface is simplified and object oriented to allow
    easier ROS2 extensions in future and reduce code duplication
  • the sensor/actor stream existing for the TCP counterparts are used
    in a shared manner, which results in lower processing overhead and
    requires little individual code changes for ROS2 within UE-sensors
  • enable Boost and Asio exceptions for FastDDS to ensure properly
  • additional service interfaces are provided to control CARLA directly
    from ROS2 (Map, Blueprint and Episode handling, Spawn/DestroyObject)
  • convenient interfaces previously available via carla_ros_bridge are
    provided (e.g. pseudo sensors, object messages, traffic light/sign,
    actor/sensor lists)
  • new interfaces like e.g. CarlaVehicleTelemetryData, V2X,
    SynchronizationWindow,...
  • get detailed vehicle meshes as exact ground truth for e.g. LiDAR
    perception
  • Vehicle publisher implements a variety of individual publishers to
    mimick also old ROS-bridge convenient publisher:
    • CarlaVehicleInfo
    • CarlaVehicleControlStatus
    • Speed
    • Odometry
    • Object
    • ObjectWithCovariance
    • VehicleTelemetryData
  • Vehicle subscribers:
    • VehicleControlSubscriber
    • AckermannControlSubscriber,
    • SetTransformSubscriber
  • use of c++17 to support std::sample() usage
  • Dynamic switching on ROS visibility is possible for all actors now
  • Default startup behavior is selectable by ROS2TopicVisibility
    parameter in DefaultGame.ini: If true, then all and every topic that
    is currently offered by the implementation is visible from the
    beginning. If false, then only the sensors/actors created via the
    Client- or ROS-Interface are visible by defaults. Others can be
    activated via EnableForRos() calls (this allows for disabling
    interfaces e.g. for leaderboard)
  • ensure multiple service calls at once are working:
    • qos history kind eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS
    • qos reliablility kind
      eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS
    • qos durability kind
      eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS
      for reader, writer, topic
  • add set_transform() call to RGB Cameras
  • add odometry publisher to walkers
  • filter out invalid bounding boxes observed on a few traffic signs
    using bounding box transmission within object data

Where has this been tested?

  • Platform(s): ...Ubuntu 22.04 (some time ago also on 24.04)
  • Python version(s): ...3.10
  • Unreal Engine version(s): ...4.26

Possible Drawbacks

Some features of the old ros-brigde are still not yet implemented

  • lane invasion sensor: unclear on how we should handle this. Move the map code also to server? Or create some ROS2 python node forwarding these events. Moving lane invasion to server side and only calculate if someone is listening would be a possibility...
  • set_autopilot functionality is handled within client code at the moment, so cannot be provided by the server as long as the server is not launching the traffic manager. Might be also implemented by some ROS2 python node to leverage the client functionality...
  • there might be other (smaller) things missing

This change is Reviewable

Introduced a fine grained ServerSynchronization mechanism, where each
synchonization participant is treated independently and interacts
with the synchronization of the carla-server individually. If a client
is disconnected (or dies) the synchronization state of all participants
registered via that client are dropped, i.e. the server will continue
running in case the participants of that client were the only ones
demanding synchronous mode.

The synchronization interface provides means of a time window, up to
which the server is allowed to run. Like this, every client can prevent
the carla-server to run too fast depending on their individual speed.
There is no sync-master anymore. Every client decides for its own if
it requires synchronization or not.

Drawback of this change: some existing code might have to be changed
(see removal of synchronous_master in generate_traffic.py).
Update RPC lib version for windows build

Ensure tick calls are ignored if sync mode is not active.
And prevent client changes of fixed_delta_seconds triggering warning
message.
@berndgassmann berndgassmann force-pushed the mai/ue4-extend-ros2-step3 branch from 99dfc13 to 26a6111 Compare November 30, 2025 00:10
@berndgassmann
Copy link
Contributor Author

Rebased to the (hopefully) fixed step2 commit.
And reverted some unnecessary interface changes on ROS side to allow maximum compatibility to the previous ros_bridge behavior.
Currently mainly some features implemented at CARLA client side are missing e.g. lane invasion, set_autopilot (because traffic manager is handled by client).

on non synchronous mode
This commit is extending the built-in ROS2 support of CARLA:
- the internal interface is simplified and object oriented to allow
  easier ROS2 extensions in future and reduce code duplication
- the sensor/actor stream existing for the TCP counterparts are used
  in a shared manner, which results in lower processing overhead and
  requires little individual code changes for ROS2 within UE-sensors
- enable Boost and Asio exceptions for FastDDS to ensure  properly
- additional service interfaces are provided to control CARLA directly
  from ROS2 (Map, Blueprint and Episode handling, Spawn/DestroyObject)
- convenient interfaces previously available via carla_ros_bridge are
  provided (e.g. pseudo sensors, object messages, traffic light/sign,
  actor/sensor lists)
- new interfaces like e.g. CarlaVehicleTelemetryData, V2X,
  SynchronizationWindow,...
- get detailed vehicle meshes as exact ground truth for e.g. LiDAR
  perception
- Vehicle publisher implements a variety of individual publishers to
  mimick also old ROS-bridge convenient publisher:
  + CarlaVehicleInfo
  + CarlaVehicleControlStatus
  + Speed
  + Odometry
  + Object
  + ObjectWithCovariance
  + VehicleTelemetryData
- Vehicle subscribers:
  + VehicleControlSubscriber
  + AckermannControlSubscriber,
  + SetTransformSubscriber
- use of c++17 to support std::sample() usage
- Dynamic switching on ROS visibility is possible for all actors now
- Default startup behavior is selectable by ROS2TopicVisibility
  parameter in DefaultGame.ini: If true, then all and every topic that
  is currently offered by the implementation is visible from the
  beginning. If false, then only the sensors/actors created via the
  Client- or ROS-Interface are visible by defaults. Others can be
  activated via EnableForRos() calls (this allows for disabling
  interfaces e.g. for leaderboard)
- ensure multiple service calls at once are working:
  + qos history kind eprosima::fastdds::dds::KEEP_ALL_HISTORY_QOS
  + qos reliablility kind
    eprosima::fastdds::dds::RELIABLE_RELIABILITY_QOS
  + qos durability kind
    eprosima::fastdds::dds::TRANSIENT_LOCAL_DURABILITY_QOS
    for reader, writer, topic
- add set_transform() call to RGB Cameras
- add odometry publisher to walkers
- filter out invalid bounding boxes observed on a few traffic signs
using bounding box transmission within object data
@berndgassmann berndgassmann force-pushed the mai/ue4-extend-ros2-step3 branch from 26a6111 to 3de7c09 Compare December 1, 2025 09:26
Update telemetry data of VehiclePublisher within process messages step
This ensures that the vehicle/wheel data in the engine can not be updated
while gathering the data

Improve object classification to match existing base-class blueprint patterns.

Reduce some ROS2 log output severity
@berndgassmann berndgassmann marked this pull request as ready for review December 3, 2025 17:31
@berndgassmann berndgassmann requested a review from a team as a code owner December 3, 2025 17:31
@berndgassmann
Copy link
Contributor Author

When this is merged, also the updated carla_msgs should be merged into the dev branch
carla-simulator/ros-carla-msgs#24

Then we should create also dev branch within the ros-bridge repository that we don't mess up the master with the development changes.

After the carla_msgs have been merged I can update the ros-bridge PR with the correct carla_msgs commit here:
carla-simulator/ros-bridge#762

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants