From 7f90c13cc284eeee8ad1d39bf411afca16c022f3 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Mon, 4 Sep 2023 12:08:58 +0200 Subject: [PATCH] Automatically convert from `StructScalar` to `ArrayData` in ROS2 publish method --- examples/python-ros2-dataflow/random_turtle.py | 2 +- libraries/extensions/ros2-bridge/python/src/lib.rs | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/examples/python-ros2-dataflow/random_turtle.py b/examples/python-ros2-dataflow/random_turtle.py index caf96ec1..3fcc139c 100755 --- a/examples/python-ros2-dataflow/random_turtle.py +++ b/examples/python-ros2-dataflow/random_turtle.py @@ -51,7 +51,7 @@ for i in range(500): }, } - direction_arrow = pa.array([pa.scalar(direction)]) + direction_arrow = pa.scalar(direction) twist_writer.publish(direction_arrow) case "external": diff --git a/libraries/extensions/ros2-bridge/python/src/lib.rs b/libraries/extensions/ros2-bridge/python/src/lib.rs index 32827345..22ac574f 100644 --- a/libraries/extensions/ros2-bridge/python/src/lib.rs +++ b/libraries/extensions/ros2-bridge/python/src/lib.rs @@ -11,7 +11,7 @@ use eyre::{eyre, Context, ContextCompat}; use futures::{Stream, StreamExt}; use pyo3::{ prelude::{pyclass, pymethods}, - types::PyModule, + types::{PyList, PyModule}, PyAny, PyObject, PyResult, Python, }; use typed::{ @@ -182,7 +182,15 @@ pub struct Ros2Publisher { #[pymethods] impl Ros2Publisher { pub fn publish(&self, data: &PyAny) -> eyre::Result<()> { - // TODO: add support for arrow types + let pyarrow = PyModule::import(data.py(), "pyarrow")?; + + let data = if data.is_instance(pyarrow.getattr("StructScalar")?)? { + let list = PyList::new(data.py(), [data]); + pyarrow.getattr("array")?.call1((list,))? + } else { + data + }; + let value = arrow::array::ArrayData::from_pyarrow(data)?; //// add type info to ensure correct serialization (e.g. struct types //// and map types need to be serialized differently)