Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix audio to spectrogram plot and add test #2764

Merged
merged 6 commits into from Feb 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions audio_to_spectrogram/package.xml
Expand Up @@ -22,6 +22,7 @@
<exec_depend condition="$ROS_PYTHON_VERSION == 3">python3-matplotlib</exec_depend>
<exec_depend>sensor_msgs</exec_depend>

<test_depend>jsk_tools</test_depend>
<test_depend>roslaunch</test_depend>
<test_depend>rostest</test_depend>

Expand Down
19 changes: 18 additions & 1 deletion audio_to_spectrogram/scripts/audio_amplitude_plot.py
Expand Up @@ -3,9 +3,14 @@

from __future__ import division

from distutils.version import LooseVersion
import pkg_resources
import cv_bridge
from dynamic_reconfigure.server import Server
from jsk_topic_tools import ConnectionBasedTransport
import matplotlib
from audio_to_spectrogram import check_matplotlib_version; check_matplotlib_version()
matplotlib.use('Agg')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iory please add code to check version of matlab and display warning if it is not apt installed one.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

be635ab
Thank you. I added warning code for users.

import matplotlib.pyplot as plt
import numpy as np
import rospy
Expand Down Expand Up @@ -42,10 +47,22 @@ def start_timer(self):
if rate == 0:
rospy.logwarn('You cannot set 0 as the rate; change it to 10.')
rate = 10
self.timer = rospy.Timer(rospy.Duration(1.0 / rate), self.timer_cb)

timer_kwargs = dict(
period=rospy.Duration(1.0 / rate),
callback=self.timer_cb,
oneshot=False,
)
if (LooseVersion(pkg_resources.get_distribution('rospy').version) >=
LooseVersion('1.12.0')) and rospy.get_param('/use_sim_time', None):
# on >=kinetic, it raises ROSTimeMovedBackwardsException
# when we use rosbag play --loop.
timer_kwargs['reset'] = True
self.timer = rospy.Timer(**timer_kwargs)

def stop_timer(self):
self.timer.shutdown()
self.timer = None

def subscribe(self):
self.audio_buffer.subscribe()
Expand Down
15 changes: 14 additions & 1 deletion audio_to_spectrogram/scripts/audio_to_spectrum.py
Expand Up @@ -2,6 +2,8 @@

import numpy as np
import rospy
from distutils.version import LooseVersion
import pkg_resources

from audio_common_msgs.msg import AudioData
from jsk_recognition_msgs.msg import Spectrum
Expand Down Expand Up @@ -45,7 +47,18 @@ def __init__(self):
'~spectrum', Spectrum, queue_size=1)
self.pub_spectrum_filtered = rospy.Publisher(
'~spectrum_filtered', Spectrum, queue_size=1)
rospy.Timer(rospy.Duration(1. / self.fft_exec_rate), self.timer_cb)

timer_kwargs = dict(
period=rospy.Duration(1.0 / self.fft_exec_rate),
callback=self.timer_cb,
oneshot=False,
)
if (LooseVersion(pkg_resources.get_distribution('rospy').version) >=
LooseVersion('1.12.0')) and rospy.get_param('/use_sim_time', None):
# on >=kinetic, it raises ROSTimeMovedBackwardsException
# when we use rosbag play --loop.
timer_kwargs['reset'] = True
self.timer = rospy.Timer(**timer_kwargs)

def timer_cb(self, timer):
if len(self.audio_buffer) != self.audio_buffer.audio_buffer_len:
Expand Down
3 changes: 3 additions & 0 deletions audio_to_spectrogram/scripts/spectrum_plot.py
Expand Up @@ -5,6 +5,9 @@

import cv_bridge
from jsk_topic_tools import ConnectionBasedTransport
import matplotlib
from audio_to_spectrogram import check_matplotlib_version; check_matplotlib_version()
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np
import rospy
Expand Down
18 changes: 14 additions & 4 deletions audio_to_spectrogram/scripts/spectrum_to_spectrogram.py
Expand Up @@ -4,6 +4,8 @@
from cv_bridge import CvBridge
import numpy as np
import rospy
from distutils.version import LooseVersion
import pkg_resources

from jsk_recognition_msgs.msg import Spectrum
from sensor_msgs.msg import Image
Expand Down Expand Up @@ -34,10 +36,18 @@ def __init__(self):
'~spectrogram', Image, queue_size=1)
publish_rate = rospy.get_param(
'~publish_rate', float(self.image_width / self.spectrogram_period))
rospy.Timer(
rospy.Duration(
1.0 / publish_rate),
self.timer_cb)

timer_kwargs = dict(
period=rospy.Duration(1.0 / publish_rate),
callback=self.timer_cb,
oneshot=False,
)
if (LooseVersion(pkg_resources.get_distribution('rospy').version) >=
LooseVersion('1.12.0')) and rospy.get_param('/use_sim_time', None):
# on >=kinetic, it raises ROSTimeMovedBackwardsException
# when we use rosbag play --loop.
timer_kwargs['reset'] = True
self.timer = rospy.Timer(**timer_kwargs)
self.bridge = CvBridge()

def audio_cb(self, msg):
Expand Down
5 changes: 3 additions & 2 deletions audio_to_spectrogram/src/audio_to_spectrogram/__init__.py
@@ -1,2 +1,3 @@
from .audio_buffer import AudioBuffer
from .convert_matplotlib import convert_matplotlib_to_img
from audio_to_spectrogram.audio_buffer import AudioBuffer
from audio_to_spectrogram.compat import check_matplotlib_version
from audio_to_spectrogram.convert_matplotlib import convert_matplotlib_to_img
25 changes: 25 additions & 0 deletions audio_to_spectrogram/src/audio_to_spectrogram/compat.py
@@ -0,0 +1,25 @@
import os
import subprocess
import warnings

import matplotlib


def check_matplotlib_version(
python_version=os.getenv('ROS_PYTHON_VERSION')):
if python_version == '2':
python = 'python'
else:
python = 'python{}'.format(python_version)
out = subprocess.check_output(
['dpkg', '-L', '{}-matplotlib'.format(python)])
if isinstance(out, bytes):
out = out.decode('utf-8')
matplotlib_filelists = out.split()
if os.path.dirname(matplotlib.__file__) in matplotlib_filelists:
return True
else:
warnings.warn(
"It looks like you are using pip's matplotlib. "
"Apt's matplotlib is recommended.")
return False
Expand Up @@ -7,6 +7,7 @@

import numpy as np
import PIL
import PIL.Image


def convert_matplotlib_to_img(fig):
Expand Down
4 changes: 4 additions & 0 deletions audio_to_spectrogram/test/audio_to_spectrogram.test
Expand Up @@ -11,6 +11,10 @@
<rosparam>
topic_0: /spectrum_to_spectrogram/spectrogram
timeout_0: 30
topic_1: /audio_amplitude_plot/output/viz
timeout_1: 30
topic_2: /spectrum_plot/output/viz
timeout_2: 30
</rosparam>
</test>

Expand Down