From 5a36bdff514562b04d2cc4598d685ae355616f4b Mon Sep 17 00:00:00 2001 From: chrizog Date: Mon, 3 Jun 2024 20:07:54 +0200 Subject: [PATCH] Minor cleanups, example for replaying ROS --- README.md | 4 +- example_apps/rosbags/Pose.msg | 8 ++ example_apps/rosbags/TurtlesimPose.py | 17 +++ example_apps/rosbags/replay_rosbag.py | 114 ++++++++++++++++++ example_apps/rosbags/test.bag | Bin 0 -> 278248 bytes setup.cfg | 6 +- .../_internal/someip_data_processor.py | 3 - src/someipy/_internal/someip_endpoint.py | 6 +- src/someipy/_internal/someip_sd_builder.py | 19 ++- src/someipy/_internal/someip_sd_extractors.py | 3 +- src/someipy/_internal/tcp_client_manager.py | 4 +- src/someipy/client_service_instance.py | 1 - 12 files changed, 169 insertions(+), 16 deletions(-) create mode 100644 example_apps/rosbags/Pose.msg create mode 100644 example_apps/rosbags/TurtlesimPose.py create mode 100644 example_apps/rosbags/replay_rosbag.py create mode 100644 example_apps/rosbags/test.bag diff --git a/README.md b/README.md index 3c473cc..2e649e7 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ someipy is based on the specification version of R22-11: - [SOME/IP Protocol Specification](https://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_PRS_SOMEIPProtocol.pdf) - [SOME/IP Service Discovery Protocol Specification](https://www.autosar.org/fileadmin/standards/R22-11/FO/AUTOSAR_PRS_SOMEIPServiceDiscoveryProtocol.pdf) -The library is currently developed and tested under Ubuntu 22.04 and Python 3.12. +The library is currently developed and tested under Ubuntu 22.04 and Python 3.8. ## Typical Use Cases @@ -35,7 +35,7 @@ someipy excels in scenarios where a full-scale Autosar (Adaptive or Classic) int The package can be installed from [PyPi](https://pypi.org/project/someipy/). ```bash -pip install someipy +pip3 install someipy ``` ## Example Applications diff --git a/example_apps/rosbags/Pose.msg b/example_apps/rosbags/Pose.msg new file mode 100644 index 0000000..5b3445b --- /dev/null +++ b/example_apps/rosbags/Pose.msg @@ -0,0 +1,8 @@ +# This is the original ROS message for topic "/turtle1/pose" contained in "test.bag" +# This ROS message is just added for demonstration purposes, but not needed for running replay_rosbags.py +float32 x +float32 y +float32 theta + +float32 linear_velocity +float32 angular_velocity \ No newline at end of file diff --git a/example_apps/rosbags/TurtlesimPose.py b/example_apps/rosbags/TurtlesimPose.py new file mode 100644 index 0000000..b05bc31 --- /dev/null +++ b/example_apps/rosbags/TurtlesimPose.py @@ -0,0 +1,17 @@ +from someipy.serialization import SomeIpPayload, Float32 + +# For defining the TurtleSimPose as a SOME/IP message, simply inherit from SomeIpPayload and use +# the provided datatypes such as Float32 for declaring the fields of the message +class TurtlesimPose(SomeIpPayload): + x: Float32 + y: Float32 + theta: Float32 + linear_velocity: Float32 + angular_velocity: Float32 + + def __init__(self): + self.x = Float32() + self.y = Float32() + self.theta = Float32() + self.linear_velocity = Float32() + self.angular_velocity = Float32() diff --git a/example_apps/rosbags/replay_rosbag.py b/example_apps/rosbags/replay_rosbag.py new file mode 100644 index 0000000..d46bd18 --- /dev/null +++ b/example_apps/rosbags/replay_rosbag.py @@ -0,0 +1,114 @@ +import asyncio +import ipaddress +import logging +import rosbag +import TurtlesimPose + +from someipy import TransportLayerProtocol, ServiceBuilder, EventGroup, construct_server_service_instance +from someipy.service_discovery import construct_service_discovery +from someipy.logging import set_someipy_log_level +from someipy.serialization import Float32 + +SD_MULTICAST_GROUP = "224.224.224.245" +SD_PORT = 30490 +INTERFACE_IP = "127.0.0.1" + +SAMPLE_SERVICE_ID = 0x1234 +SAMPLE_INSTANCE_ID = 0x5678 +SAMPLE_EVENTGROUP_ID = 0x0321 +SAMPLE_EVENT_ID = 0x0123 + + +async def main(): + # It's possible to configure the logging level of the someipy library, e.g. logging.INFO, logging.DEBUG, logging.WARN, .. + set_someipy_log_level(logging.DEBUG) + + # Since the construction of the class ServiceDiscoveryProtocol is not trivial and would require an async __init__ function + # use the construct_service_discovery function + # The local interface IP address needs to be passed so that the src-address of all SD UDP packets is correctly set + service_discovery = await construct_service_discovery( + SD_MULTICAST_GROUP, SD_PORT, INTERFACE_IP + ) + + turtle_eventgroup = EventGroup( + id=SAMPLE_EVENTGROUP_ID, event_ids=[SAMPLE_EVENT_ID] + ) + turtle_pose_service = ( + ServiceBuilder() + .with_service_id(SAMPLE_SERVICE_ID) + .with_major_version(1) + .with_eventgroup(turtle_eventgroup) + .build() + ) + + # For sending events use a ServerServiceInstance + service_instance_turtle_pose = await construct_server_service_instance( + turtle_pose_service, + instance_id=SAMPLE_INSTANCE_ID, + endpoint=( + ipaddress.IPv4Address(INTERFACE_IP), + 3000, + ), # src IP and port of the service + ttl=5, + sd_sender=service_discovery, + cyclic_offer_delay_ms=2000, + protocol=TransportLayerProtocol.UDP + ) + + # The service instance has to be attached always to the ServiceDiscoveryProtocol object, so that the service instance + # is notified by the ServiceDiscoveryProtocol about e.g. subscriptions from other ECUs + service_discovery.attach(service_instance_turtle_pose) + + # ..it's also possible to construct another ServerServiceInstance and attach it to service_discovery as well + + # After constructing and attaching ServerServiceInstances to the ServiceDiscoveryProtocol object the + # start_offer method has to be called. This will start an internal timer, which will periodically send + # Offer service entries with a period of "cyclic_offer_delay_ms" which has been passed above + print("Start offering service..") + service_instance_turtle_pose.start_offer() + + bag = rosbag.Bag('test.bag') + + # Get the timestamp of the first message of /turtle1/pose in order to reproduce the timing of the recording + starting_timestamp = next(bag.read_messages(topics=['/turtle1/pose'])).timestamp + + for topic, msg, t in bag.read_messages(topics=['/turtle1/pose']): + + # Calculate the time difference between the current message and the message before + time_sleep = (t - starting_timestamp).to_sec() + + # Use asyncio.sleep to wait for the time difference between the current message and the message before + print(f"Sleeping for {(t - starting_timestamp).to_sec()} seconds") + await asyncio.sleep(time_sleep) + + # Create a SomeIpPayload object and fill it with the values from the rosbag message + someipPose = TurtlesimPose.TurtlesimPose() + someipPose.x = Float32(msg.x) + someipPose.y = Float32(msg.y) + someipPose.theta = Float32(msg.theta) + someipPose.linear_velocity = Float32(msg.linear_velocity) + someipPose.angular_velocity = Float32(msg.angular_velocity) + + # Serialize the SomeIpPayload object to a byte array + payload = someipPose.serialize() + + print(f"Sending event for message {msg}") + # Send the serialized byte array to all subscribers of the event group + service_instance_turtle_pose.send_event( + SAMPLE_EVENTGROUP_ID, SAMPLE_EVENT_ID, payload + ) + + starting_timestamp = t + + bag.close() + + await service_instance_turtle_pose.stop_offer() + print("Service Discovery close..") + service_discovery.close() + print("End main task..") + +if __name__ == "__main__": + try: + asyncio.run(main()) + except KeyboardInterrupt: + pass diff --git a/example_apps/rosbags/test.bag b/example_apps/rosbags/test.bag new file mode 100644 index 0000000000000000000000000000000000000000..cb8cf55cdc05f88c85bcb5eff9f747f739257fd8 GIT binary patch literal 278248 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 brz`w&F)a7X4cgrQ9ml0{uiW9*z=r=3.12 +python_requires = >=3.8 [options.packages.find] where = src \ No newline at end of file diff --git a/src/someipy/_internal/someip_data_processor.py b/src/someipy/_internal/someip_data_processor.py index 9875fed..9fb2df6 100644 --- a/src/someipy/_internal/someip_data_processor.py +++ b/src/someipy/_internal/someip_data_processor.py @@ -16,11 +16,8 @@ def _reset(self): self._expected_bytes = 0 def process_data(self, new_data: bytes) -> bool: - received_length = len(new_data) - print(" ".join(f"{byte:02X}" for byte in new_data)) - # UDP case if self._datagram_mode: header = SomeIpHeader.from_buffer(new_data) diff --git a/src/someipy/_internal/someip_endpoint.py b/src/someipy/_internal/someip_endpoint.py index 015ba11..9136906 100644 --- a/src/someipy/_internal/someip_endpoint.py +++ b/src/someipy/_internal/someip_endpoint.py @@ -1,6 +1,6 @@ import asyncio from abc import ABC, abstractmethod -from typing import Callable, Tuple, Any +from typing import Callable, Tuple, Any, Union from someipy._internal.someip_message import SomeIpMessage from someipy._internal.tcp_client_manager import ( TcpClientManagerInterface, @@ -44,10 +44,10 @@ def set_someip_callback( def connection_made(self, transport: asyncio.DatagramTransport) -> None: self._transport = transport - def connection_lost(self, exc: Exception | None) -> None: + def connection_lost(self, exc: Exception) -> None: pass - def datagram_received(self, data: bytes, addr: Tuple[str | Any | int]) -> None: + def datagram_received(self, data: bytes, addr: Tuple[Union[str, Any, int]]) -> None: result = self._processor.process_data(data) if result and self._callback is not None: self._callback(self._processor.someip_message, addr) diff --git a/src/someipy/_internal/someip_sd_builder.py b/src/someipy/_internal/someip_sd_builder.py index 883c420..9b0e8f3 100644 --- a/src/someipy/_internal/someip_sd_builder.py +++ b/src/someipy/_internal/someip_sd_builder.py @@ -1,4 +1,21 @@ -from .someip_sd_header import * +import ipaddress +from typing import Tuple +from someipy._internal.someip_header import SomeIpHeader +from .someip_sd_header import ( + SD_BYTE_LENGTH_IP4ENDPOINT_OPTION, + SD_SINGLE_ENTRY_LENGTH_BYTES, + SdService, + SomeIpSdHeader, + SdEntry, + SdEntryType, + SdServiceEntry, + SdOptionCommon, + SD_IPV4ENDPOINT_OPTION_LENGTH_VALUE, + SdOptionType, + SdIPV4EndpointOption, + SdEventGroupEntry, +) +from someipy._internal.someip_sd_header import TransportLayerProtocol def build_offer_service_sd_header( diff --git a/src/someipy/_internal/someip_sd_extractors.py b/src/someipy/_internal/someip_sd_extractors.py index 03c8501..debc676 100644 --- a/src/someipy/_internal/someip_sd_extractors.py +++ b/src/someipy/_internal/someip_sd_extractors.py @@ -1,4 +1,5 @@ -from .someip_sd_header import * +from typing import List, Tuple +from .someip_sd_header import SomeIpSdHeader, SdService, SdEntryType, SdIPV4EndpointOption, SdEventGroupEntry def extract_offered_services(someip_sd_header: SomeIpSdHeader) -> List[SdService]: diff --git a/src/someipy/_internal/tcp_client_manager.py b/src/someipy/_internal/tcp_client_manager.py index 2fe7b2a..d457591 100644 --- a/src/someipy/_internal/tcp_client_manager.py +++ b/src/someipy/_internal/tcp_client_manager.py @@ -57,11 +57,11 @@ def _build_key(self, ip_addr: str, port: int) -> str: return f"{ip_addr}-{port}" def register_client(self, client: TcpClientProtocolInterface) -> None: - print(f"Register new client {client.ip_addr}, {client.port}") + #print(f"Register new client {client.ip_addr}, {client.port}") self._clients[self._build_key(client.ip_addr, client.port)] = client def unregister_client(self, client: TcpClientProtocolInterface) -> None: - print(f"Unregister client {client.ip_addr}, {client.port}") + #print(f"Unregister client {client.ip_addr}, {client.port}") if self._build_key(client.ip_addr, client.port) in self._clients.keys(): del self._clients[self._build_key(client.ip_addr, client.port)] diff --git a/src/someipy/client_service_instance.py b/src/someipy/client_service_instance.py index cf2ba67..331fbb3 100644 --- a/src/someipy/client_service_instance.py +++ b/src/someipy/client_service_instance.py @@ -146,7 +146,6 @@ async def call_method(self, method_id: int, payload: bytes) -> Tuple[MethodResul def someip_message_received( self, someip_message: SomeIpMessage, addr: Tuple[str, int] ) -> None: - print(someip_message.header) if ( someip_message.header.client_id == 0x00 and someip_message.header.message_type == MessageType.NOTIFICATION.value