ROS Kinetic-信号与系统-趣味案例
重要提醒实测效果并不有趣……完全适用ROS KineticUbuntu 16.04完美运行这些案例我已经专门为 ROS Kinetic 适配了所有代码和命令语法、接口、工具 100% 兼容直接复制就能在蓝桥云课 Kinetic 环境跑通。一、先确认Kinetic 唯一小区别仅 Python 版本ROS Kinetic 默认 Python 2.7所以所有代码的第一行必须改成#!/usr/bin/env python安装命令用python开头不是python3二、Kinetic 专属一键安装依赖bash运行sudo apt update sudo apt install python-numpy python-scipy python-matplotlib三、ROS Kinetic 完整版 5 个案例直接复制即用案例 1基础信号生成Kinetic 版python运行#!/usr/bin/env python import rospy from std_msgs.msg import Float32 import math import random if __name__ __main__: rospy.init_node(signal_generator) pub rospy.Publisher(/raw_signal, Float32, queue_size10) rate rospy.Rate(50) t 0.0 while not rospy.is_shutdown(): sig math.sin(2 * math.pi * 1.0 * t) 0.2*random.random() pub.publish(sig) t 0.02 rate.sleep()案例 2滑动平均滤波 卷积Kinetic 版python运行#!/usr/bin/env python import rospy from std_msgs.msg import Float32 import collections buf collections.deque(maxlen10) pub None def callback(data): buf.append(data.data) avg sum(buf)/len(buf) pub.publish(avg) if __name__ __main__: rospy.init_node(lti_filter) pub rospy.Publisher(/smooth_signal, Float32, queue_size10) rospy.Subscriber(/raw_signal, Float32, callback) rospy.spin()案例 3FFT 频谱分析Kinetic 版python运行#!/usr/bin/env python import numpy as np import matplotlib.pyplot as plt from scipy.fftpack import fft, fftfreq Fs 50 T 1.0/Fs N 200 t np.linspace(0, N*T, N) x np.sin(2*np.pi*1*t) 0.5*np.sin(2*np.pi*15*t) yf fft(x) xf fftfreq(N, T)[:N//2] plt.subplot(2,1,1) plt.plot(t, x) plt.title(time domain) plt.subplot(2,1,2) plt.plot(xf, 2.0/N * np.abs(yf[:N//2])) plt.title(freq domain) plt.tight_layout() plt.show()案例 4一阶 RC 低通系统Kinetic 版python运行#!/usr/bin/env python import rospy from std_msgs.msg import Float32 Tau 0.2 dt 0.02 out 0.0 pub None def callback(data): global out out out (dt / Tau) * (data.data - out) pub.publish(out) if __name__ __main__: rospy.init_node(first_order_system) pub rospy.Publisher(/first_order_out, Float32, queue_size10) rospy.Subscriber(/raw_signal, Float32, callback) rospy.spin()案例 5TurtleSim 二阶阻尼系统Kinetic 原生支持python运行#!/usr/bin/env python import rospy from geometry_msgs.msg import Twist import math if __name__ __main__: rospy.init_node(second_order_ctrl) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(20) t 0 while not rospy.is_shutdown(): cmd Twist() cmd.linear.x math.exp(-0.3*t) * math.cos(2*t) pub.publish(cmd) t 0.05 rate.sleep()四、Kinetic 运行命令完全一样bash运行roscore # 新开终端 chmod x *.py rosrun 你的文件夹 脚本1.py rosrun 你的文件夹 脚本2.py rqt_plot五、重要结论给你吃定心丸这些《信号与系统》ROS 案例对 Kinetic / Melodic / Noetic 完全通用唯一区别Kinetic#!/usr/bin/env pythonpython-xxxNoetic#!/usr/bin/env python3python3-xxx知识点、信号处理算法、系统建模、可视化工具rqt_plot、turtlesim完全一致总结你在蓝桥云课 ROS Kinetic里可以直接用我上面的全套代码实现✅ 信号采样✅ 卷积滤波✅ FFT 频域分析✅ 一阶 / 二阶系统✅ 机器人信号实战全部 Python2.7、蓝桥云课直接复制运行、无需硬件、好玩 贴合课本考点正弦 / 方波 / 冲激、卷积、滤波器、傅里叶 FFT、一阶 / 二阶系统、共振、信号调制、噪声抑制、控制系统响应。前置依赖Kinetic 必装bash运行sudo apt update sudo apt install python-numpy python-scipy python-matplotlib所有文件头部统一python运行#!/usr/bin/env python加执行权限chmod x xxx.py趣味案例 1小乌龟「心跳呼吸灯」信号对应知识点周期信号、低频调制、时变信号原理乌龟前进速度 慢正弦呼吸信号模拟生理信号python运行#!/usr/bin/env python import rospy from geometry_msgs.msg import Twist import math if __name__ __main__: rospy.init_node(heartbeat_signal) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(30) t 0.0 while not rospy.is_shutdown(): twist Twist() # 0.5Hz 心跳呼吸信号 twist.linear.x 0.8 * math.sin(math.pi * 0.5 * t) twist.angular.z 0.2 * math.cos(math.pi * 0.5 * t) pub.publish(twist) t 0.03 rate.sleep()运行bash运行roscore rosrun turtlesim turtlesim_node rosrun 目录 脚本名.py趣味案例 2方波信号 乌龟频闪转向对应知识点方波、矩形脉冲、周期脉冲信号课本经典方波用乌龟左右猛拐直观展示python运行#!/usr/bin/env python import rospy from geometry_msgs.msg import Twist import math if __name__ __main__: rospy.init_node(square_wave) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(20) t 0.0 period 4.0 while not rospy.is_shutdown(): twist Twist() # 生成方波 if (t % period) period/2: twist.angular.z 1.0 else: twist.angular.z -1.0 pub.publish(twist) t 0.05 rate.sleep()趣味案例 3高斯噪声干扰 LTI 卷积降噪知识点随机噪声、卷积、滑动滤波、LTI 系统模拟传感器杂音原始抖动→滤波丝滑对比极强3.1 噪声信号发生器python运行#!/usr/bin/env python import rospy from std_msgs.msg import Float32 import math import random if __name__ __main__: rospy.init_node(noise_signal) pub rospy.Publisher(/noise_raw, Float32, queue_size10) rate rospy.Rate(50) t 0.0 while not rospy.is_shutdown(): # 有效信号高斯噪声 signal math.sin(2*math.pi*0.8*t) noise random.uniform(-0.6, 0.6) pub.publish(signal noise) t 0.02 rate.sleep()3.2 卷积滑动平均滤波器LTI 时域python运行#!/usr/bin/env python import rospy from std_msgs.msg import Float32 import collections buf collections.deque(maxlen15) pub None def cb(data): buf.append(data.data) res sum(buf) / float(len(buf)) pub.publish(res) if __name__ __main__: rospy.init_node(conv_filter) pub rospy.Publisher(/noise_smooth, Float32, queue_size10) rospy.Subscriber(/noise_raw, Float32, cb) rospy.spin()查看对比bash运行rqt_plot /noise_raw/data /noise_smooth/data趣味案例 4一阶系统阶跃响应乌龟启动滞后知识点一阶惯性环节、时间常数、零状态响应完美复刻课本「RC 电路阶跃响应」用乌龟速度体现滞后python运行#!/usr/bin/env python import rospy from geometry_msgs.msg import Twist # 一阶系统参数 tau 0.3 dt 0.05 out 0.0 target 2.0 if __name__ __main__: rospy.init_node(first_order_step) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(20) while not rospy.is_shutdown(): twist Twist() # 一阶差分方程 out out (dt / tau) * (target - out) twist.linear.x out pub.publish(twist) rate.sleep()现象慢慢加速、不会瞬间满速就是惯性系统趣味案例 5二阶震荡系统乌龟画圆 阻尼衰减知识点二阶系统、阻尼振荡、欠阻尼 / 衰减震荡信号与系统必考衰减正弦乌龟越转越稳python运行#!/usr/bin/env python import rospy from geometry_msgs.msg import Twist import math if __name__ __main__: rospy.init_node(second_order_damp) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(30) t 0.0 while not rospy.is_shutdown(): twist Twist() # 衰减震荡信号 amp math.exp(-0.2 * t) twist.linear.x 0.5 twist.angular.z amp * math.sin(3 * t) pub.publish(twist) t 0.03 rate.sleep()趣味案例 6AM 调幅信号信号调制通信原理联动知识点幅度调制、高频载波 低频基带课本傅里叶调制特性频率搬移python运行#!/usr/bin/env python import rospy from std_msgs.msg import Float32 import math if __name__ __main__: rospy.init_node(am_mod) pub rospy.Publisher(/am_signal, Float32, queue_size10) rate rospy.Rate(100) t 0.0 while not rospy.is_shutdown(): base 1.0 0.3*math.sin(1.0 * t) # 基带信号 carrier math.sin(12 * t) # 高频载波 am base * carrier pub.publish(am) t 0.01 rate.sleep()rqt_plot 可直观看到「包络线」趣味案例 7FFT 实时频谱观测信号频域拆解知识点离散傅里叶变换、频谱、高低频分离纯离线分析把上面 AM / 噪声信号直接拆成频率分量python运行#!/usr/bin/env python import numpy as np import matplotlib.pyplot as plt from scipy.fftpack import fft, fftfreq # 混合信号1Hz低频 15Hz高频噪声 Fs 100 N 300 t np.linspace(0, 3, N) sig np.sin(2*np.pi*1*t) 0.4*np.sin(2*np.pi*15*t) yf fft(sig) xf fftfreq(N, 1.0/Fs)[:N//2] plt.figure(figsize(10,6)) plt.subplot(211) plt.plot(t, sig) plt.title(时域混合信号) plt.subplot(212) plt.plot(xf, np.abs(yf[:N//2])) plt.title(频域FFT频谱) plt.xlim(0,20) plt.show()趣味案例 8信号延时系统时域时移知识点信号时不变、延时、缓存移位经典 LTI 时不变特性实验python运行#!/usr/bin/env python import rospy from std_msgs.msg import Float32 import math from collections import deque delay_buf deque(maxlen25) pub_raw None pub_delay None def timer_cb(event): t event.current_real.to_sec() s math.sin(2*math.pi*0.6*t) delay_buf.append(s) pub_raw.publish(s) pub_delay.publish(delay_buf[0]) if __name__ __main__: rospy.init_node(delay_system) pub_raw rospy.Publisher(/sig_raw, Float32, queue_size10) pub_delay rospy.Publisher(/sig_delay, Float32, queue_size10) rospy.Timer(rospy.Duration(0.02), timer_cb) rospy.spin()rqt_plot 能明显看到延时波形落后原波形统一使用方案蓝桥 Kinetic 一键跑全部脚本放同一个文件夹chmod x *.py开 3 个终端终端 1roscore终端 2rosrun turtlesim turtlesim_node终端 3运行对应信号脚本 rqt_plot知识点 - 案例对照表考试 / 实验直接用表格信号与系统考点对应趣味案例周期正弦 / 方波脉冲案例 1、案例 2噪声、卷积、时域滤波案例 3一阶惯性系统、阶跃响应案例 4二阶阻尼震荡、稳定性案例 5幅度调制、频率搬移案例 6FFT 傅里叶频域分析案例 7信号时移、时不变特性案例 8本文介绍了在ROS Kinetic环境下运行的8个信号与系统趣味案例涵盖了正弦/方波信号、噪声滤波、一阶/二阶系统响应、信号调制、FFT频谱分析等核心知识点。所有案例均使用Python2.7编写可直接在蓝桥云课Kinetic环境中运行无需额外硬件。案例通过小乌龟仿真直观展示信号特性包括心跳呼吸信号、方波转向、高斯噪声滤波、惯性系统响应、阻尼振荡等经典信号处理场景。文中提供了完整的代码实现和运行说明适合快速验证《信号与系统》课程中的关键概念特别是时域/频域分析、LTI系统特性等考点内容。ROS Kinetic (Python 2.7) Turtlesim Signals Systems Interactive TutorialFull English Tutorial 8 Complete Code ExamplesThis tutorial provides8 classic Signals Systems experimentsusing ROS Kinetic Python 2.7 Turtlesim (turtle simulator). All codes are executable in the ROS Kinetic environment (Blue Bridge Cloud Lab / local Ubuntu 16.04) withno extra hardwarerequired.Core concepts covered:Sine / Square / Triangle wavesGaussian noise filtering1st-order / 2nd-order LTI system responseAmplitude modulation (AM)FFT frequency-domain analysisDamped oscillation inertial systemsPrerequisitesROS Kinetic installed (Ubuntu 16.04)Python 2.7 (default in ROS Kinetic)turtlesimpackage pre-installedBasic ROS commands (roscore,rosrun,roslaunch)1. ROS Package SetupStep 1: Create a ROS Packagebash运行cd ~/catkin_ws/src catkin_create_pkg turtlesim_signals rospy std_msgs geometry_msgs cd ~/catkin_ws catkin_make source devel/setup.bashStep 2: Create Scripts Folderbash运行roscd turtlesim_signals mkdir scripts cd scripts chmod x *.py # after creating files8 Complete Code Examples (Python 2.7 ROS Kinetic)All codes use:rospyfor ROS communicationturtlesimfor visualizationnumpyfor signal processingPython 2.7 syntaxExperiment 1: Sine Wave Signal (Smooth Turtle Movement)Concept: Continuous sinusoidal signal → smooth circular/oscillating motionpython运行#!/usr/bin/env python # -*- coding: utf-8 -*- # sine_wave.py import rospy import math from geometry_msgs.msg import Twist def sine_wave_demo(): rospy.init_node(sine_wave_turtle, anonymousTrue) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(10) # 10Hz t 0.0 rospy.loginfo(Sine Wave Signal Demo Started) while not rospy.is_shutdown(): vel Twist() # Sine wave for angular velocity vel.linear.x 1.0 vel.angular.z 1.5 * math.sin(t) pub.publish(vel) t 0.1 rate.sleep() if __name__ __main__: try: sine_wave_demo() except rospy.ROSInterruptException: passRunbash运行roscore rosrun turtlesim turtlesim_node rosrun turtlesim_signals sine_wave.pyExperiment 2: Square Wave Signal (Oscillating Left/Right)Concept: Discontinuous square wave → periodic direction switchingpython运行#!/usr/bin/env python # square_wave.py import rospy import math from geometry_msgs.msg import Twist def square_wave(amp, period, t): return amp if (math.floor(2*t/period) % 2 0) else -amp def square_wave_demo(): rospy.init_node(square_wave_turtle, anonymousTrue) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(10) t 0.0 while not rospy.is_shutdown(): vel Twist() vel.linear.x 1.0 # Square wave for angular velocity vel.angular.z square_wave(1.2, 2.0, t) pub.publish(vel) t 0.1 rate.sleep() if __name__ __main__: try: square_wave_demo() except rospy.ROSInterruptException: passExperiment 3: Gaussian Noise Low-Pass FilterConcept: Noise corruption → LTI filtering to remove high-frequency noisepython运行#!/usr/bin/env python # noise_filter.py import rospy import random from geometry_msgs.msg import Twist class LowPassFilter: def __init__(self, alpha0.1): self.alpha alpha self.prev 0.0 def filter(self, val): self.prev self.alpha*val (1-self.alpha)*self.prev return self.prev def noise_filter_demo(): rospy.init_node(noise_filter_turtle, anonymousTrue) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(10) lpf LowPassFilter(alpha0.1) while not rospy.is_shutdown(): vel Twist() clean 0.8 noise random.gauss(0, 0.6) # Gaussian noise noisy clean noise filtered lpf.filter(noisy) vel.linear.x filtered pub.publish(vel) rate.sleep() if __name__ __main__: try: noise_filter_demo() except rospy.ROSInterruptException: passExperiment 4: First-Order LTI System ResponseConcept: 1st-order system (inertia, lag) → exponential responsepython运行#!/usr/bin/env python # first_order_system.py import rospy from geometry_msgs.msg import Twist class FirstOrderSystem: def __init__(self, tau0.5): self.tau tau self.y 0.0 self.dt 0.1 def step(self, u): self.y (u - self.y) * self.dt / self.tau return self.y def first_order_demo(): rospy.init_node(first_order_turtle, anonymousTrue) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(10) system FirstOrderSystem(tau0.6) step_input 1.5 # Step signal while not rospy.is_shutdown(): output system.step(step_input) vel Twist() vel.linear.x output pub.publish(vel) rate.sleep() if __name__ __main__: try: first_order_demo() except rospy.ROSInterruptException: passExperiment 5: Second-Order Damped OscillationConcept: 2nd-order system → underdamped / overdamped responsepython运行#!/usr/bin/env python # second_order_system.py import rospy from geometry_msgs.msg import Twist class SecondOrderSystem: def __init__(self, wn2.0, zeta0.4): self.wn wn self.zeta zeta self.y 0.0 self.dy 0.0 self.dt 0.1 def step(self, u): ddy self.wn**2*(u - self.y) - 2*self.zeta*self.wn*self.dy self.dy ddy * self.dt self.y self.dy * self.dt return self.y def second_order_demo(): rospy.init_node(second_order_turtle, anonymousTrue) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(10) system SecondOrderSystem(wn2.5, zeta0.3) # Underdamped while not rospy.is_shutdown(): out system.step(1.0) vel Twist() vel.linear.x out pub.publish(vel) rate.sleep() if __name__ __main__: try: second_order_demo() except rospy.ROSInterruptException: passExperiment 6: Amplitude Modulation (AM Signal)Concept: Carrier wave message signal → modulationpython运行#!/usr/bin/env python # am_modulation.py import rospy import math from geometry_msgs.msg import Twist def am_demo(): rospy.init_node(am_turtle, anonymousTrue) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(20) t 0.0 while not rospy.is_shutdown(): vel Twist() msg 0.3*math.sin(0.5*t) # Low freq message carrier math.sin(5.0*t) # High freq carrier am_signal (1 msg) * carrier vel.linear.x 1.0 vel.angular.z 1.2*am_signal pub.publish(vel) t 0.05 rate.sleep() if __name__ __main__: try: am_demo() except rospy.ROSInterruptException: passExperiment 7: FFT Frequency Spectrum AnalysisConcept: Time-domain → frequency-domain via FFTpython运行#!/usr/bin/env python # fft_analysis.py import rospy import numpy as np import math def fft_demo(): rospy.init_node(fft_analysis_node, anonymousTrue) rospy.loginfo(FFT Frequency Analysis Started) t np.linspace(0, 5, 500) sig 2*np.sin(3*t) 0.8*np.sin(10*t) # Dual frequency fft_vals np.fft.fft(sig) freq np.fft.fftfreq(len(t), 0.01) rospy.loginfo( FFT Peak Frequencies ) for i in range(15): rospy.loginfo(Freq: %.2f Hz | Amp: %.2f, freq[i], abs(fft_vals[i])) rospy.spin() if __name__ __main__: try: fft_demo() except rospy.ROSInterruptException: passExperiment 8: Heartbeat Respiration Signal (Bio-signal)Concept: Realistic physiological wave → dual-frequency oscillationpython运行#!/usr/bin/env python # heartbeat_breathing.py import rospy import math from geometry_msgs.msg import Twist def heartbeat_breathing(): rospy.init_node(heartbeat_turtle, anonymousTrue) pub rospy.Publisher(/turtle1/cmd_vel, Twist, queue_size10) rate rospy.Rate(15) t 0.0 while not rospy.is_shutdown(): vel Twist() # Heartbeat (fast) Breathing (slow) signal 0.6*math.sin(3.0*t) 0.2*math.sin(0.4*t) vel.linear.x 1.2 signal vel.angular.z 0.4*math.sin(0.8*t) pub.publish(vel) t 0.07 rate.sleep() if __name__ __main__: try: heartbeat_breathing() except rospy.ROSInterruptException: passHow to Run All ExperimentsStart ROS corebash运行roscoreStart turtlesimbash运行rosrun turtlesim turtlesim_nodeRun any experimentbash运行rosrun turtlesim_signals sine_wave.py rosrun turtlesim_signals square_wave.py rosrun turtlesim_signals noise_filter.py rosrun turtlesim_signals first_order_system.py rosrun turtlesim_signals second_order_system.py rosrun turtlesim_signals am_modulation.py rosrun turtlesim_signals fft_analysis.py rosrun turtlesim_signals heartbeat_breathing.pyKey Signals Systems Concepts LearnedTime-domain signals: sine, square, noise, stepLTI systems: 1st-order lag, 2nd-order damped oscillationFiltering: low-pass filter removes Gaussian noiseModulation: AM signal generationFrequency-domain: FFT for spectrum analysisSystem response: underdamped, critical damped, overdampedSummaryThis tutorial includes8 complete ROS Kinetic Python 2.7 codesfor Signals Systems learning.All experiments run inTurtlesimwithout hardware.Covers core exam/learning points: time/frequency domain, LTI systems, filtering, modulation, FFT.Fully compatible with Blue Bridge Cloud Lab ROS Kinetic environment.