
Research
Security News
Malicious npm Packages Use Telegram to Exfiltrate BullX Credentials
Socket uncovers an npm Trojan stealing crypto wallets and BullX credentials via obfuscated code and Telegram exfiltration.
betterosi - a python library for reading and writing open-simulation-interface files using betterproto2
A python library for reading and writing ASAM OSI (Open-Simulation-Interace) files (either .osi
binary traces or MCAP files) using betterproto2 instead of the default protobuf generated code (better typing and enum support).
betterosi.Writer
and betterosi.read
.betterosi-viewer <filepath.mcap / filepath.osi>
(adapted from esmini)betterosi-to-mcap <filepath to osi>
.The library uses code from esmini (betterosi/viewer.py
) under MPL 2.0 license and the code from open-simulation-interface to read osi traces (betterosi/osi3trace.py
).
The library uses code generation of python-betterproto2-compiler to generate python code from the protobuf definitions of open-simulation-interface.
Since OSI and esmini are under MPL, also this repository is published under MPL-2.0 license.
The proto definitions extend the OSI 3.7.0 definitions in the following ways:
MapAsamOpenDrive
Message: Packages the XML content of an ASAM OpenDRIVE map in a proto MessageSee omega-prime for details.
pip install betterosi
To create an OSI or MCAP trace, you need to use betterosi.Writer
. After creating the OSI Message of your desire, just add it to the Writer
as shown in the examples below for either MCAP traaces or OSI traces.
import betterosi
with betterosi.Writer('test.mcap') as writer:
gt = betterosi.GroundTruth(...)
writer.add(gt)
with betterosi.Writer('test.osi') as writer:
sv = betterosi.SensorView(...)
writer.add(sv)
Below a full example is given which creates three files, and MCAP trace and and OSI trace with GroundTruth messages and a MCAP trace of SensorViews. If you use the code, you obviously just need one of the writers.
import betterosi
NANOS_PER_SEC = 1_000_000_000
with betterosi.Writer('test.mcap') as writer_mcap, betterosi.Writer('test.osi') as writer_osi, betterosi.Writer('test_sv.mcap') as writer_sv:
moving_object = betterosi.MovingObject(id=betterosi.Identifier(value=42),
type = betterosi.MovingObjectType.TYPE_UNKNOWN,
base=betterosi.BaseMoving(
dimension= betterosi.Dimension3D(length=5, width=2, height=1),
position = betterosi.Vector3D(x=0, y=0, z=0),
orientation = betterosi.Orientation3D(roll = 0.0, pitch = 0.0, yaw = 0.0),
velocity = betterosi.Vector3D(x=1, y=0, z=0)
))
gt = betterosi.GroundTruth(
version=betterosi.InterfaceVersion(version_major= 3, version_minor=7, version_patch=0),
timestamp=betterosi.Timestamp(seconds=0, nanos=0),
moving_object=[
moving_object
],
host_vehicle_id=betterosi.Identifier(value=0)
)
sv = betterosi.SensorView(
version=betterosi.InterfaceVersion(version_major= 3, version_minor=7, version_patch=0),
timestamp=betterosi.Timestamp(seconds=0, nanos=0),
global_ground_truth=gt,
host_vehicle_id=betterosi.Identifier(value=0)
)
# Generate 1000 OSI messages for a duration of 10 seconds
for i in range(1000):
total_nanos = i*0.01*NANOS_PER_SEC
gt.timestamp.seconds = int(total_nanos // NANOS_PER_SEC)
gt.timestamp.nanos = int(total_nanos % NANOS_PER_SEC)
moving_object.base.position.x += 0.5
sv.timestamp = gt.timestamp
writer_mcap.add(gt)
writer_osi.add(gt)
writer_sv.add(sv)
When writing MCAP messages you can specifiy the topic in the writer and the add function by setting the topic
argument. When reading such files, set the argument mcap_topic
to the same string.
With betterosi.read
you can read an mcap or osi trace. read
returns a generator. With the following code, you can get a list of the GroundTruth messages from a trace, even if the GroundTruth are nested inside SensorViews. It works the same for OSI traces.
import betterosi
ground_truths = list(betterosi.read('test_sv.mcap', return_ground_truth=True))
print([len(ground_truths), ground_truths[0]])
Above code prints the following:
[1000, GroundTruth(version=InterfaceVersion(version_major=3, version_minor=7), timestamp=Timestamp(), host_vehicle_id=Identifier(), moving_object=[MovingObject(id=Identifier(value=42), base=BaseMoving(dimension=Dimension3D(length=5.0, width=2.0, height=1.0), position=Vector3D(x=0.5), orientation=Orientation3D(), velocity=Vector3D(x=1.0)))])]
If you want a list of the sensor views directly:
import betterosi
sensor_views = betterosi.read('test_sv.mcap', return_sensor_view=True)
print(next(sensor_views))
The above prints:
SensorView(version=InterfaceVersion(version_major=3, version_minor=7), timestamp=Timestamp(), global_ground_truth=GroundTruth(version=InterfaceVersion(version_major=3, version_minor=7), timestamp=Timestamp(), host_vehicle_id=Identifier(), moving_object=[MovingObject(id=Identifier(value=42), base=BaseMoving(dimension=Dimension3D(length=5.0, width=2.0, height=1.0), position=Vector3D(x=0.5), orientation=Orientation3D(), velocity=Vector3D(x=1.0)))]), host_vehicle_id=Identifier())
If you want to read any OSI trace, you just need to give the filename.
import betterosi
any_osi_message = betterosi.read('test.osi')
any_osi_message = betterosi.read('test.mcap')
pip install grpcio-tools git+https://github.com/MichaelSchuldes/python-betterproto2-compiler@serialized_descriptors
cd into osi-proto and run the following command to generate the code
cd osi-proto
mkdir ../betterosi/generated
python -m grpc_tools.protoc -I . --python_betterproto2_out=../betterosi/generated osi_common.proto osi_datarecording.proto osi_detectedlane.proto osi_detectedobject.proto osi_detectedoccupant.proto osi_detectedroadmarking.proto osi_detectedtrafficlight.proto osi_detectedtrafficsign.proto osi_environment.proto osi_featuredata.proto osi_groundtruth.proto osi_hostvehicledata.proto osi_lane.proto osi_logicaldetectiondata.proto osi_logicallane.proto osi_motionrequest.proto osi_object.proto osi_occupant.proto osi_referenceline.proto osi_roadmarking.proto osi_route.proto osi_sensordata.proto osi_sensorspecific.proto osi_sensorview.proto osi_sensorviewconfiguration.proto osi_streamingupdate.proto osi_trafficcommand.proto osi_trafficcommandupdate.proto osi_trafficlight.proto osi_trafficsign.proto osi_trafficupdate.proto osi_version.proto osi_mapasamopendrive.proto
This code is published under MPL-2.0 license. It utilizes and modifies parts of esmini (betterosi/viewer.py) under MPL-2.0 and open-simulation-interface (osi-proto/* and betterosi/osi3trace.py) under MPL-2.o
FAQs
betterosi - a python library for reading and writing open-simulation-interface files using betterproto2
We found that betterosi demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket uncovers an npm Trojan stealing crypto wallets and BullX credentials via obfuscated code and Telegram exfiltration.
Research
Security News
Malicious npm packages posing as developer tools target macOS Cursor IDE users, stealing credentials and modifying files to gain persistent backdoor access.
Security News
AI-generated slop reports are making bug bounty triage harder, wasting maintainer time, and straining trust in vulnerability disclosure programs.