Warning

This document is outdated and may contain obsolete information. Please refer to the repositories README on : Qualcomm QRB ROS GitHub.

QRB ROS Audio Service

Overview

The ROS package provides essential audio capabilities, it is the entry point for ROS to provide audio capabilities.

It supports both step-by-step and one-touch playback, allowing playback from built-in sounds. Additionally, it offers recording functionality, with the option to save to a local file or a topic.

Playback and record capabilities depend on qrb_ros_audio_common.

Build

Use QIRP SDK to build.

  1. Build and install QIRP SDK with the steps in qirp-sdk-workflows or Quick start (using the prebuild package).

  2. Set up environments with the steps in Set up the cross-compile environment.

  3. Create the ros_ws directory in <qirp_decompressed_workspace>/qirp-sdk/.

  4. Put qrb_audio_manager, qrb_ros_audio_service, qrb_ros_audio_service_msgs and qrb_ros_audio_common_msgs packages under <qirp_decompressed_workspace>/qirp-sdk/ros_ws.

    # qrb_audio_manager and qrb_ros_audio_service in qrb_ros_audio_service:
    git clone https://github.qualcomm.com/QUIC-QRB-ROS/qrb_ros_audio_service.git
    
    # qrb_ros_audio_service_msgs and qrb_ros_audio_common_msgs in qrb_ros_interfaces
    git clone https://github.qualcomm.com/QUIC-QRB-ROS/qrb_ros_interfaces.git
    
  5. Build this project.

    export AMENT_PREFIX_PATH="${OECORE_TARGET_SYSROOT}/usr;${OECORE_NATIVE_SYSROOT}/usr"
    export PYTHONPATH=${PYTHONPATH}:${OECORE_TARGET_SYSROOT}/usr/lib/python3.10/site-packages
    
    colcon build --merge-install --cmake-args \
      -DPython3_ROOT_DIR=${OECORE_TARGET_SYSROOT}/usr \
      -DPython3_NumPy_INCLUDE_DIR=${OECORE_TARGET_SYSROOT}/usr/lib/python3.10/site-packages/numpy/core/include \
      -DPYTHON_SOABI=cpython-310-aarch64-linux-gnu -DCMAKE_STAGING_PREFIX=$(pwd)/install \
      -DCMAKE_PREFIX_PATH=$(pwd)/install/share \
      -DBUILD_TESTING=OFF
    
  6. Push to the device and Install.

    cd <qirp_decompressed_workspace>/qirp-sdk/ros_ws/install
    tar czvf qrb_ros_audio.tar.gz lib share
    scp qrb_ros_audio_service.tar.gz root@[ip-addr]:/opt/
    ssh root@[ip-addr]
    (ssh) tar -zxf /opt/qrb_ros_audio_service.tar.gz -C /opt/qcom/qirp-sdk/usr/
    

Run

  1. Source this file to set up the environment on your device.

    ssh root@[ip-addr]
    (ssh) export HOME=/opt
    (ssh) source /opt/qcom/qirp-sdk/qirp-setup.sh
    (ssh) export ROS_DOMAIN_ID=xx
    (ssh) source /usr/bin/ros_setup.bash
    
  2. Use this launch file to run this package.

    ros2 launch qrb_ros_audio_service audio_service.launch.py
    
  3. Run qrb_ros_audio_common on another ssh terminal.

  4. Run test cases on a third ssh terminal.

    stream_handle indicate the stream created by Audio Service when command is “create”. The value can be found on third ssh terminal (if use “ROS Command”: stream_handle=***; if use “Python Script”: command create success 1 stream_handle ***).

    Test Case

    Using ROS Command

    Using Python Script

    Get build-in sound names

    mkdir -p /opt/qcom/qirp-sdk/usr/share/qrb-audio-manager/sounds

    chmod 0755 /opt/qcom/qirp-sdk/usr/share/qrb-audio-manager -R

    adb push clip.wav /opt/qcom/qirp-sdk/usr/share/qrb-audio-manager/sounds

    chmod 0644 /opt/qcom/qirp-sdk/usr/share/qrb-audio-manager/sounds/*

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “get-buildin-sound” }”

    python3 audio_service_test.py –get-buildin-sound

    One-touch playback

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “play”, source: “clip”, volume: 100, }”

    The playback will be stopped and released automatically after end of file. Or stop it before end of file:

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “stop”, stream_handle: 3520332881, }”

    Note: One-touch playback will be released after stopping successful.

    python3 audio_service_test.py –mode=’one-touch’ –source=’security’ –volume=100

    “Ctrl+C” audio_service_test.py.

    One-touch playback and repeat

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “play”, source: “clip”, volume: 100, repeat: -1, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “stop”, stream_handle: 3520332881, }”

    python3 audio_service_test.py –mode=’one-touch’ –source=’security’ –volume=100 –repeat=-1

    “Ctrl+C” audio_service_test.py.

    Step-by-step playback

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ type: “playback”, command: “create”, source: “/tmp/music.wav”, volume: 100, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “start”, stream_handle: 2551300426, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “mute”, mute: true, stream_handle: 2551300426, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “mute”, mute: false, stream_handle: 2551300426, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “stop”, stream_handle: 2551300426, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “release”, stream_handle: 2551300426, }”

    python3 audio_service_test.py –type=’playback’ –source=’/tmp/yesterday_48KHz.wav’ –volume=100

    python3 audio_service_test.py –set-mute –mute=True –stream_handle=2124364840

    python3 audio_service_test.py –set-mute –mute=False –stream_handle=2124364840

    “Ctrl+C” audio_service_test.py.

    Streaming playback

    Firstly, create and start a streaming playback, it subscribes audio pcm data from topic “loopback”:

    step-by-step streaming playback:

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ audio_info: { channels: 1, sample_rate: 16000, sample_format: 16, }, type: “playback”, command: “create”, volume: 100, topic_name: “loopback”, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “start”, stream_handle: 1246004764, }”

    one-touch streaming playback:

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ audio_info: { channels: 1, sample_rate: 16000, sample_format: 16, }, command: “play”, volume: 100, topic_name: “loopback”, }”

    Secondly, create and start a step-by-step record, it publishes audio pcm data to topic “loopback”:

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ audio_info: { channels: 1, sample_rate: 16000, sample_format: 16, }, type: “record”, command: “create”, pub_pcm: true, topic_name: “loopback”, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “start”, stream_handle: 2681124530, }”

    Stop and release playback:

    for step-by-step streaming playback:

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “stop”, stream_handle: 1246004764, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “release”, stream_handle: 1246004764, }”

    for one-touch streaming playback:

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “stop”, stream_handle: 1246004764, }”

    Stop and release step-by-step record:

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “stop”, stream_handle: 2681124530, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “release”, stream_handle: 2681124530, }”

    step-by-step streaming playback:

    python3 audio_service_test.py –type=’playback’ –channels=1 –sample_rate=16000 –sample_format=16 –pub_pcm=True –volume=100 –topic_name=’loopback’

    one-touch streaming playback:

    python3 audio_service_test.py –mode=’one-touch’ –channels=1 –sample_rate=16000 –sample_format=16 –pub_pcm=True –volume=100 –topic_name=’loopback’

    python3 audio_service_test.py –type=’record’ –channels=1 –sample_rate=16000 –sample_format=16 –pub_pcm=True –topic_name=’loopback’

    “Ctrl+C” playback audio_service_test.py.

    “Ctrl+C” record audio_service_test.py.

    Step-by-step record

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ audio_info: { channels: 1, sample_rate: 16000, sample_format: 16, }, type: “record”, command: “create”, source: “/tmp/rec.wav”, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “start”, stream_handle: 1502099078, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “stop”, stream_handle: 1502099078, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “release”, stream_handle: 1502099078, }”

    python3 audio_service_test.py –type=’record’ –source=’/tmp/rec.wav’ –channels=1 –sample_rate=16000 –sample_format=16

    “Ctrl+C” audio_service_test.py.

    Publish recording data

    publish recording data to a topic (default topic name is “qrb_audiodata”, but it can be specified using topic_name):

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ audio_info: { channels: 1, sample_rate: 16000, sample_format: 16, }, type: “record”, command: “create”, pub_pcm: true, }”

    or, publish recording data to /qrb_audiodata. meanwhile, save it to file:

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ audio_info: { channels: 1, sample_rate: 16000, sample_format: 16, }, type: “record”, command: “create”, pub_pcm: true, source: “/tmp/rec.wav”, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{command: “start”, stream_handle: 806639317, }”

    ros2 topic echo /qrb_audiodata

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “stop”, stream_handle: 806639317, }”

    ros2 service call /audio_server qrb_ros_audio_service_msgs/srv/AudioRequest “{ command: “release”, stream_handle: 806639317, }”

    publish recording data to a topic (default topic name is “qrb_audiodata”, but it can be specified using topic_name): python3 audio_service_test.py –type=’record’ –source=’/tmp/rec.wav’ –channels=1 –sample_rate=16000 –sample_format=16 –pub_pcm=True

    or, publish recording data to /qrb_audiodata. meanwhile, save it to file:

    python3 audio_service_test.py –type=’record’ –source=’/tmp/rec.wav’ –channels=1 –sample_rate=16000 –sample_format=16 –pub_pcm=True

    ros2 topic echo /qrb_audiodata

Packages

Supported Platforms

This package is designed and tested to be compatible with ROS 2 Humble running on Qualcomm RB3 gen2.

Hardware

Software

Qualcomm RB3 gen2

LE.QCROBOTICS.1.0

Updates

Date

Changes

2024-09-26

Initial release

2025-01-03

Update index.rst