# STS3215 pan/tilt + LD19: a no-SDK 3D scanning module for ROS 2 Jazzy

**URL:** https://discourse.openrobotics.org/t/sts3215-pan-tilt-ld19-a-no-sdk-3d-scanning-module-for-ros-2-jazzy/55447
**Category:** ROS General
**Tags:** ros2, hardware, lidar, jazzy, driver
**Created:** [June 12, 2026, 5:32pm UTC](https://discourse.openrobotics.org/t/sts3215-pan-tilt-ld19-a-no-sdk-3d-scanning-module-for-ros-2-jazzy/55447 "2026-06-12T17:32:59Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![Gizmo](https://avatars.discourse-cdn.com/v4/letter/g/7feea3/32.png) [@Gizmo](https://discourse.openrobotics.org/u/Gizmo)
#### Post date: [June 12, 2026, 5:32pm UTC](https://discourse.openrobotics.org/t/sts3215-pan-tilt-ld19-a-no-sdk-3d-scanning-module-for-ros-2-jazzy/55447/1 "2026-06-12T17:32:59Z")

</div>

I put together a small ROS 2 subsystem that turns a 2-DOF pan/tilt platform and a cheap 2D LiDAR into a stop-and-capture 3D scanner, and figured it might be useful to someone else here.

The setup: two Feetech STS3215 serial-bus servos aim an LDROBOT LD19. A node sweeps the platform and an assembler stacks the 2D scans into a `PointCloud2` using the live TF tree. There’s an optional MQTT bridge so an external controller (in my case a microcontroller mission queue on a rover) can trigger scans and get a completion handshake back.

It’s a \*complete\* project — it even includes a fix to the LiDAR driver (upstream `ldlidar_stl_ros2` won’t build on recent GCC/glibc; the patched fork is linked below). It talks to the rover over a well-defined set of MQTT messages, but every command also has an equivalent ROS 2 topic, so if you want a pure ROS 2 setup you just don’t launch the bridge. (Personally I love the MQTT side — it lets me drive the whole thing from a tablet.)

No vendor SDK — the Feetech STS/SMS half-duplex protocol is implemented directly over pyserial, including handling the URT-1 adapter’s habit of echoing every TX byte back on the RX line (the kind of thing that eats an evening if you don’t know it’s coming). The assembler is driver-agnostic: it consumes standard `sensor_msgs/LaserScan` on `/scan`, so any conformant 2D LiDAR should work.

It’s running on an RK3588 today and is built to go headless on a Pi 5.

This is the first piece I’m open-sourcing from a larger autonomous rover project, GPL-3.0. I’d genuinely welcome feedback — particularly from anyone who’s done multi-LiDAR or TF-timing work, since the scan-to-TF synchronization was the fussiest part to get right. But it does work! Happy to answer questions about any of it.

- Project: [GitHub - aa2mz/pan\_tilt\_lidar: A ROS 2 (Jazzy) subsystem that turns a 2-DOF pan/tilt platform and a 2D LiDAR into a 3D scanner. · GitHub](https://github.com/aa2mz/pan_tilt_lidar)

- Patched LiDAR driver: [GitHub - aa2mz/ldlidar\_stl\_ros2: LDROBOT DTOF LiDAR ROS2 Package · GitHub](https://github.com/aa2mz/ldlidar_stl_ros2)

 ![PXL_20260612_195814220~2](https://us1.discourse-cdn.com/flex022/uploads/ros/original/3X/f/d/fd6b43e3002e6a919452544c0c4865ddda5ef1f2.jpeg)

---

<div class="post-metadata">

### Author: ![Katherine\_Scott](https://sea2.discourse-cdn.com/flex022/user_avatar/discourse.openrobotics.org/katherine_scott/32/4434_2.png) [@Katherine\_Scott](https://discourse.openrobotics.org/u/Katherine_Scott)
#### Post date: [June 12, 2026, 6:38pm UTC](https://discourse.openrobotics.org/t/sts3215-pan-tilt-ld19-a-no-sdk-3d-scanning-module-for-ros-2-jazzy/55447/2 "2026-06-12T18:38:02Z")

</div>

Some pictures / videos here might help. =)

Also if you want some help open sourcing and certifying the hardware I can give you a few pointers.

---

<div class="post-metadata">

### Author: ![kgregson](https://sea2.discourse-cdn.com/flex022/user_avatar/discourse.openrobotics.org/kgregson/32/13532_2.png) [@kgregson](https://discourse.openrobotics.org/u/kgregson)
#### Post date: [June 13, 2026, 3:50am UTC](https://discourse.openrobotics.org/t/sts3215-pan-tilt-ld19-a-no-sdk-3d-scanning-module-for-ros-2-jazzy/55447/3 "2026-06-13T03:50:10Z")

</div>

Looks interesting!

Curious if the echo is a truly a feature of the URT-1 or possibly the line discipline on the serial interface that a “stty -echo” might fix?

---

<div class="post-metadata">

### Author: ![Gizmo](https://avatars.discourse-cdn.com/v4/letter/g/7feea3/32.png) [@Gizmo](https://discourse.openrobotics.org/u/Gizmo)
#### Post date: [June 13, 2026, 2:06pm UTC](https://discourse.openrobotics.org/t/sts3215-pan-tilt-ld19-a-no-sdk-3d-scanning-module-for-ros-2-jazzy/55447/4 "2026-06-13T14:06:04Z")

</div>

Thank you Katherine Scott, though I had to look up what open sourcing hardware in this example might mean. I’m a overworked hobbist; I think the picture, the urdf and naming the brand of duct tape I used is about as much as I can do for this one. (Someone else asked me to characterize the pointing accuracy of the servos… ) I see that all documentation is important but I hope that someone who actually needs the information will find this setup simple enough and have the resources to do that themselves. Thanks again. -Ed.T

p.s. I apologize calling it “complete” without matching open hardware . 🤔

---

<div class="post-metadata">

### Author: ![Gizmo](https://avatars.discourse-cdn.com/v4/letter/g/7feea3/32.png) [@Gizmo](https://discourse.openrobotics.org/u/Gizmo)
#### Post date: [June 13, 2026, 2:46pm UTC](https://discourse.openrobotics.org/t/sts3215-pan-tilt-ld19-a-no-sdk-3d-scanning-module-for-ros-2-jazzy/55447/5 "2026-06-13T14:46:53Z")

</div>

Thank you kgregson. It’s a good thought. Console type lines typically do echo. But this connection is opened as raw binary so if the port was echoing would be a big bug. FWIW, I think Feetech sees it as part of their “rugged protocol.” -Ed.T
