From 0078fcc5744febb07abe93ffc87ae8e89c405865 Mon Sep 17 00:00:00 2001 From: iory Date: Fri, 24 Feb 2023 22:37:42 +0900 Subject: [PATCH 1/6] [audio_to_spectrogram] Use reset option for rosbag loop --- .../scripts/audio_amplitude_plot.py | 16 +++++++++++++++- .../scripts/audio_to_spectrum.py | 15 ++++++++++++++- .../scripts/spectrum_to_spectrogram.py | 18 ++++++++++++++---- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/audio_to_spectrogram/scripts/audio_amplitude_plot.py b/audio_to_spectrogram/scripts/audio_amplitude_plot.py index 856b149fff..c745dd2470 100755 --- a/audio_to_spectrogram/scripts/audio_amplitude_plot.py +++ b/audio_to_spectrogram/scripts/audio_amplitude_plot.py @@ -3,6 +3,8 @@ 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 @@ -42,10 +44,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')): + # 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() diff --git a/audio_to_spectrogram/scripts/audio_to_spectrum.py b/audio_to_spectrogram/scripts/audio_to_spectrum.py index 920bc67c58..f1d4aa939f 100755 --- a/audio_to_spectrogram/scripts/audio_to_spectrum.py +++ b/audio_to_spectrogram/scripts/audio_to_spectrum.py @@ -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 @@ -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')): + # 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: diff --git a/audio_to_spectrogram/scripts/spectrum_to_spectrogram.py b/audio_to_spectrogram/scripts/spectrum_to_spectrogram.py index f5be653334..9d51359f4a 100755 --- a/audio_to_spectrogram/scripts/spectrum_to_spectrogram.py +++ b/audio_to_spectrogram/scripts/spectrum_to_spectrogram.py @@ -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 @@ -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')): + # 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): From d25b8cba342c718803188106b7ccb2968bc2be84 Mon Sep 17 00:00:00 2001 From: iory Date: Fri, 24 Feb 2023 23:09:03 +0900 Subject: [PATCH 2/6] [audio_to_spectrogram] Use Absolute import --- audio_to_spectrogram/src/audio_to_spectrogram/__init__.py | 4 ++-- .../src/audio_to_spectrogram/convert_matplotlib.py | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/audio_to_spectrogram/src/audio_to_spectrogram/__init__.py b/audio_to_spectrogram/src/audio_to_spectrogram/__init__.py index d8d91d0b47..97bca4ffe9 100644 --- a/audio_to_spectrogram/src/audio_to_spectrogram/__init__.py +++ b/audio_to_spectrogram/src/audio_to_spectrogram/__init__.py @@ -1,2 +1,2 @@ -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.convert_matplotlib import convert_matplotlib_to_img diff --git a/audio_to_spectrogram/src/audio_to_spectrogram/convert_matplotlib.py b/audio_to_spectrogram/src/audio_to_spectrogram/convert_matplotlib.py index 0b11d6b801..4324cda94e 100644 --- a/audio_to_spectrogram/src/audio_to_spectrogram/convert_matplotlib.py +++ b/audio_to_spectrogram/src/audio_to_spectrogram/convert_matplotlib.py @@ -7,6 +7,7 @@ import numpy as np import PIL +import PIL.Image def convert_matplotlib_to_img(fig): From 374ef28bb0774b15df2071e5475311991574e3df Mon Sep 17 00:00:00 2001 From: iory Date: Fri, 24 Feb 2023 23:10:48 +0900 Subject: [PATCH 3/6] [audio_to_spectrogram] Use Agg as default and add test --- audio_to_spectrogram/scripts/audio_amplitude_plot.py | 2 ++ audio_to_spectrogram/scripts/spectrum_plot.py | 2 ++ audio_to_spectrogram/test/audio_to_spectrogram.test | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/audio_to_spectrogram/scripts/audio_amplitude_plot.py b/audio_to_spectrogram/scripts/audio_amplitude_plot.py index c745dd2470..2fdd138aaf 100755 --- a/audio_to_spectrogram/scripts/audio_amplitude_plot.py +++ b/audio_to_spectrogram/scripts/audio_amplitude_plot.py @@ -8,6 +8,8 @@ import cv_bridge from dynamic_reconfigure.server import Server from jsk_topic_tools import ConnectionBasedTransport +import matplotlib +matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np import rospy diff --git a/audio_to_spectrogram/scripts/spectrum_plot.py b/audio_to_spectrogram/scripts/spectrum_plot.py index bf27a824f7..01d420176f 100755 --- a/audio_to_spectrogram/scripts/spectrum_plot.py +++ b/audio_to_spectrogram/scripts/spectrum_plot.py @@ -5,6 +5,8 @@ import cv_bridge from jsk_topic_tools import ConnectionBasedTransport +import matplotlib +matplotlib.use('Agg') import matplotlib.pyplot as plt import numpy as np import rospy diff --git a/audio_to_spectrogram/test/audio_to_spectrogram.test b/audio_to_spectrogram/test/audio_to_spectrogram.test index 671975f661..c2ea8bda05 100644 --- a/audio_to_spectrogram/test/audio_to_spectrogram.test +++ b/audio_to_spectrogram/test/audio_to_spectrogram.test @@ -11,6 +11,10 @@ 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 From 4435bc9e5a67c4fbba8fc7cec25c81c45dd771d2 Mon Sep 17 00:00:00 2001 From: iory Date: Fri, 24 Feb 2023 23:21:45 +0900 Subject: [PATCH 4/6] [audio_to_spectrogram] Add jsk_tools for test_depend --- audio_to_spectrogram/package.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/audio_to_spectrogram/package.xml b/audio_to_spectrogram/package.xml index 3d72033ad7..be8cc1181a 100644 --- a/audio_to_spectrogram/package.xml +++ b/audio_to_spectrogram/package.xml @@ -22,6 +22,7 @@ python3-matplotlib sensor_msgs + jsk_tools roslaunch rostest From be635ab86e2c667a2815211292d6a831991e7b54 Mon Sep 17 00:00:00 2001 From: iory Date: Sun, 26 Feb 2023 17:27:52 +0900 Subject: [PATCH 5/6] [audio_to_spectrogram] Add warnings for matplotlib version --- .../scripts/audio_amplitude_plot.py | 1 + audio_to_spectrogram/scripts/spectrum_plot.py | 1 + .../src/audio_to_spectrogram/__init__.py | 1 + .../src/audio_to_spectrogram/compat.py | 25 +++++++++++++++++++ 4 files changed, 28 insertions(+) create mode 100644 audio_to_spectrogram/src/audio_to_spectrogram/compat.py diff --git a/audio_to_spectrogram/scripts/audio_amplitude_plot.py b/audio_to_spectrogram/scripts/audio_amplitude_plot.py index 2fdd138aaf..0592b9c140 100755 --- a/audio_to_spectrogram/scripts/audio_amplitude_plot.py +++ b/audio_to_spectrogram/scripts/audio_amplitude_plot.py @@ -9,6 +9,7 @@ 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') import matplotlib.pyplot as plt import numpy as np diff --git a/audio_to_spectrogram/scripts/spectrum_plot.py b/audio_to_spectrogram/scripts/spectrum_plot.py index 01d420176f..6e1bbec995 100755 --- a/audio_to_spectrogram/scripts/spectrum_plot.py +++ b/audio_to_spectrogram/scripts/spectrum_plot.py @@ -6,6 +6,7 @@ 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 diff --git a/audio_to_spectrogram/src/audio_to_spectrogram/__init__.py b/audio_to_spectrogram/src/audio_to_spectrogram/__init__.py index 97bca4ffe9..07a8ddc083 100644 --- a/audio_to_spectrogram/src/audio_to_spectrogram/__init__.py +++ b/audio_to_spectrogram/src/audio_to_spectrogram/__init__.py @@ -1,2 +1,3 @@ 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 diff --git a/audio_to_spectrogram/src/audio_to_spectrogram/compat.py b/audio_to_spectrogram/src/audio_to_spectrogram/compat.py new file mode 100644 index 0000000000..2a3cce1c82 --- /dev/null +++ b/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 From 85af1afd8f2a5eb29a42ce8d38fef13a1f707ef8 Mon Sep 17 00:00:00 2001 From: iory Date: Sun, 26 Feb 2023 19:34:09 +0900 Subject: [PATCH 6/6] [audio_to_spectrogram] Check whether use_sim_time is true --- audio_to_spectrogram/scripts/audio_amplitude_plot.py | 2 +- audio_to_spectrogram/scripts/audio_to_spectrum.py | 2 +- audio_to_spectrogram/scripts/spectrum_to_spectrogram.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/audio_to_spectrogram/scripts/audio_amplitude_plot.py b/audio_to_spectrogram/scripts/audio_amplitude_plot.py index 0592b9c140..c7d93ba59e 100755 --- a/audio_to_spectrogram/scripts/audio_amplitude_plot.py +++ b/audio_to_spectrogram/scripts/audio_amplitude_plot.py @@ -54,7 +54,7 @@ def start_timer(self): oneshot=False, ) if (LooseVersion(pkg_resources.get_distribution('rospy').version) >= - LooseVersion('1.12.0')): + 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 diff --git a/audio_to_spectrogram/scripts/audio_to_spectrum.py b/audio_to_spectrogram/scripts/audio_to_spectrum.py index f1d4aa939f..22024fd248 100755 --- a/audio_to_spectrogram/scripts/audio_to_spectrum.py +++ b/audio_to_spectrogram/scripts/audio_to_spectrum.py @@ -54,7 +54,7 @@ def __init__(self): oneshot=False, ) if (LooseVersion(pkg_resources.get_distribution('rospy').version) >= - LooseVersion('1.12.0')): + 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 diff --git a/audio_to_spectrogram/scripts/spectrum_to_spectrogram.py b/audio_to_spectrogram/scripts/spectrum_to_spectrogram.py index 9d51359f4a..add73616b1 100755 --- a/audio_to_spectrogram/scripts/spectrum_to_spectrogram.py +++ b/audio_to_spectrogram/scripts/spectrum_to_spectrogram.py @@ -43,7 +43,7 @@ def __init__(self): oneshot=False, ) if (LooseVersion(pkg_resources.get_distribution('rospy').version) >= - LooseVersion('1.12.0')): + 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