#sonar #blue-robotics #rov #robotics #entry-point

bluerobotics-ping

This crate serves as the entry point for embedding applications using Rust on Blue Robotics's Ping devices family

11 unstable releases (3 breaking)

0.3.3 Oct 21, 2024
0.3.2 Oct 10, 2024
0.3.0 Jul 30, 2024
0.2.4 Jul 29, 2024
0.0.0 Apr 24, 2024

#84 in Embedded development

Download history 144/week @ 2024-08-31 308/week @ 2024-09-07 150/week @ 2024-09-14 355/week @ 2024-09-21 179/week @ 2024-09-28 379/week @ 2024-10-05 57/week @ 2024-10-12 199/week @ 2024-10-19 29/week @ 2024-10-26 26/week @ 2024-11-02 79/week @ 2024-11-09 13/week @ 2024-11-16 391/week @ 2024-11-23 285/week @ 2024-11-30

776 downloads per month
Used in ping-viewer-next

MIT license

72KB
1.5K SLoC

🦀 Ping Library 🔊

SONARs, or Sound Navigation And Ranging devices, transmit sound waves and measure their reflections to detect surrounding obstacles and objects.

Sonars and other acoustic devices can be crucial for marine robotics (ROVs, AUVs, boats, etc), as they can provide obstacle detection and distance estimates when the visual field is limited. Building robots with these capabilities enables precise navigation, target identification, and a considerably more efficient exploration of underwater environments.

The open source Ping Protocol allows precise control of sonar devices like those from Blue Robotics, enabling easy integration in your custom applications.

This library provides access to all capabilities of ping family devices, with all the benefits of the Rust development ecosystem!

Here is a minimal example:

use bluerobotics_ping::{
    device::{Ping1D, PingDevice},
    error::PingError,
};
use tokio_serial::{SerialPort, SerialPortBuilderExt};

#[tokio::main]
async fn main() -> Result<(), PingError> {
    let port = tokio_serial::new("/dev/ttyUSB0", 115200).open_native_async()?;
    port.clear(tokio_serial::ClearBuffer::All)?;
    let ping1d = Ping1D::new(port);

    println!("{:#?}", ping1d.device_information().await?);
    println!("{:#?}", ping1d.general_info().await?);
    println!("{:#?}", ping1d.distance().await?);
    Ok(())
}

Try ping today!

📖 Documentation:

🐳 How to Use This Crate:

To harness the capabilities of a Ping1D or Ping360 type device, instantiate the corresponding object provided by this library.

Ping has the capability to work with any kind of layer that implements asynchronous I/O traits. The current examples are focused on serial and UDP, which are the connection methods with official support from Blue Robotics.

Both device types have their own set of methods, as defined by the Ping Protocol specification.

Check the complete set of methods:

🐬 To run examples use:

cargo run --example ping_1d -- --serial-port /dev/ttyUSB0
Result

Terminal output:

Parsing user provided values...
Creating your Ping 1D device
Testing set/get device id: 9
Testing set/get device id: 8
Testing set/get device id: 7
Testing set/get device id: 6
Testing set/get device id: 5
Testing set/get device id: 4
Testing set/get device id: 3
Testing set/get device id: 2
Testing set/get device id: 1
Set gain to auto: true
Test set & get with a new speed of sound: 343.0 m/s
Test set & get with default speed of sound: 1500.0 m/s
Protocol version is: 1.0.0
Device id is: 1
Gain setting is: 6
Processor temperature is: 42.63 °C
Voltage at 5V lane is: 5.006 V
The distance to target is: 4538 mm
Waiting for 30 profiles...
Received 30 profiles
Turning-off the continuous messages stream from Ping1D

Pro tip

For external use via UDP, consider using bridges to share your serial device to the network. Detailed instructions can be found here.

Setting up a host and client

On the host 📡 (Where ping device is connected):

bridges --port /dev/ttyUSB0:3000000 -u 0.0.0.0:8080 --no-udp-disconnection --abr

On the client 💻:

cargo run --example ping_1d -- --udp-address 192.168.0.191 --udp-port 8080

Enjoy exploring with ping-rs! 🌊

Dependencies

~7–17MB
~220K SLoC