diff --git a/examples/python-ros2-dataflow/random_turtle.py b/examples/python-ros2-dataflow/random_turtle.py index 3fcc139c..003c39f9 100755 --- a/examples/python-ros2-dataflow/random_turtle.py +++ b/examples/python-ros2-dataflow/random_turtle.py @@ -51,8 +51,7 @@ for i in range(500): }, } - direction_arrow = pa.scalar(direction) - twist_writer.publish(direction_arrow) + twist_writer.publish(direction) case "external": pose = event.inner()[0].as_py() diff --git a/libraries/extensions/ros2-bridge/python/src/lib.rs b/libraries/extensions/ros2-bridge/python/src/lib.rs index 22ac574f..01d4f8c6 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::{PyList, PyModule}, + types::{PyDict, PyList, PyModule}, PyAny, PyObject, PyResult, Python, }; use typed::{ @@ -184,7 +184,15 @@ impl Ros2Publisher { pub fn publish(&self, data: &PyAny) -> eyre::Result<()> { let pyarrow = PyModule::import(data.py(), "pyarrow")?; + let data = if data.is_instance_of::() { + // convert to arrow struct scalar + pyarrow.getattr("scalar")?.call1((data,))? + } else { + data + }; + let data = if data.is_instance(pyarrow.getattr("StructScalar")?)? { + // convert to arrow array let list = PyList::new(data.py(), [data]); pyarrow.getattr("array")?.call1((list,))? } else {