ROS2
The Robot Operating System or ROS and its associated libraries represent one of the most ubiquitous collections of robotics software in use today. We therefore provide first class support for using ROS2 with ReSim's tools. To enable this without making ReSim's tools explicitly depend on ROS2 libraries, we provide a converter binary that can be used to convert ROS2 bags to the ReSim Log Format which our other tools and libraries natively consume.
Basic Conversion
If you're using common ROS2 message types (e.g. those in
std_msgs
or geometry_msgs
) to log your topics of interest the conversion is
as simple as cloning resim/open-core
and running the following commands.
bazel run //resim/ros2:convert_log -- \
--log </path/to/my/rosbag_dir/> \
--output </path/to/my/converted/log.mcap>
If there are common public types that you need which we don't yet support, feel free to reach out and we can add them.
A pybound version of this converter is
also provided in the resim_ros2
package distributed through our open-core
Releases and can be used like
so:
import resim.ros2.resim_log_from_ros2_python as rlr2
from resim.ros2 import RESIM_DIR
# ...
rlr2.resim_log_from_ros2(
str(RESIM_DIR / "ros2" / "default_converter_plugin.so"), # See plugin info below
input_log_path,
converted_log_path)
Custom Message Types & Converter Plugins
Occasionally, it is necessary or just convenient to convert a custom message type to a serialized ReSim protobuf type so that its contents can be used with ReSim's open source metrics and analysis tools. To facilitate this, the aforementioned converter tools are designed with a plugin architecture to allow custom converters to be written. The core of the plugin interface is the following function:
extern "C" ReSimConverterPluginStatus resim_convert_ros2_to_resim(
const char *const ros2_message_type,
const rcutils_uint8_array_t *const ros2_message,
rcutils_uint8_array_t *const resim_message);
This essentially converts serialized ros2 message bytes to serialized resim message bytes based on the message type given as a string. There are also other functions that the binary needs to interrogate the plugin for:
- Which types are supported for conversion.
- Descriptions of the serialization format for the converted type (as required by Foxglove/MCAP tools).
The best practice here is to simply copy
resim/ros2/default_converter_plugin.cc
and add the messages you care about to it, following its example. One can also
create a minimal plugin which dynamically loads the default converter plugin and
uses it to handle all the common message types. Once you've compiled such a
plugin, it can be provided using the --plugin
flag for convert_log
:
bazel run //resim/ros2:convert_log -- \
--plugin </path/to/my/custom/converter.so> \
--log </path/to/my/rosbag_dir/> \
--output </path/to/my/converted/log.mcap>
or in Python:
import resim.ros2.resim_log_from_ros2_python as rlr2
from resim.ros2 import RESIM_DIR
# ...
rlr2.resim_log_from_ros2(
my_custom_converter_plugin_path,
input_log_path,
converted_log_path,
)