python机器人编程——开发一个pymatlab工具箱(上)
目录
- 一、前言
- 二、实现过程
- 2.1 封装属性
- 2.2 数据流化显示
- 2.3 输入数据的适应性
- 三、核心代码说明
- 3.1 设置缓存
- 3.2 随机信号
- 3.3 根据设置绘图
- 五、总结
- 四、源码
- PS.扩展阅读
- ps1.六自由度机器人相关文章资源
- ps2.四轴机器相关文章资源
- ps3.移动小车相关文章资源
一、前言
我们知道matlab得工具箱用于分析数据非常强大,可以通过模块化得方式对数据进行处理,并可以有很多的工具模块,最后可以加入一个窗口,显示分析的结果。我们也知道,python的matplot绘图也非常强大,可以对各种维度的数据序列进行绘制,还有python有丰富的生态,有各行业的专业分析库,但是python需要编代码,对于工程人员使用起来有道门槛,难以实现像matlab的低代码分析应用。
本系列文章,试图打造一个python版的matlab,把机器人和控制、信号处理、图像处理相关的模块封装成流程图的块,并且打造跨进程通讯接口,从而实现便捷的应用。
本篇基本实现了对matplot的封装。效果如下:
二、实现过程
2.1 封装属性
matplot最常用的是曲线和散点、柱状图。我们把matplot封装到了一个叫MatplotPlotter的类里面,然后只要把数据整理成固定的形式,就可以调用这个类,然后显示出曲线,这个类把常用的属性给列出来了:
class MatplotPlotter:def __init__(self, fignum,max_length=50,maxframelen=1024,viewwinlen=20,plotlayout=111,title="title",xyzlabel=[['X','Y','Z']], plottitles=["plot","scatter","plot"],xyzlim_max=[],isrealtime=True,lineform=["plot","scatter","plot","bar"],lineform3D=["plot3D","scatter3D","plot3D"],colors=["blue","red","green","yellow","pink","brown","orange","purple","cyan","gray "],size=(5, 4),loc=(0,0)):self.cache = np.array([])self.max_length = max_lengthself.max_frame_length = maxframelenself.cache_length=0 self.size=sizeself.loc=locself.title=titleplt.style.use('dark_background')self.fig2D = Noneself.ax2D = Noneself.an2d=Noneself.fig3D = Noneself.ax3D = Noneself.an3d=Noneself.isshow=Falseself.viewwinlen=viewwinlenself.fignum=fignumself.plotlayout=plotlayoutself.xyzlabel=xyzlabelself.plottitles=plottitlesself.isrealtime=isrealtime#lineform:bar、plot、hist、pieself.lineform=lineformself.lineform3D=lineform3Dself.formstyle={"pie":"self.ax2D.pie","plot":"self.ax2D.plot","bar":"self.ax2D.bar","scatter":"self.ax2D.scatter","plot3D":"self.ax3D.plot","scatter3D":"self.ax3D.scatter"}self.colors=colorsself.steps=None
2.2 数据流化显示
如上2D和3D的散点图、柱状图、线图都封装进去了。然后是图的title,位置、大小的设置等。
还有个就是,matplot一般很难显示动态图,这里我们的图可以进行实时动态显示,后期可以实时读取数据,并显示在matplot中可查看实时趋势。
2.3 输入数据的适应性
这个模块,可以接受numpy的数据,通过读取numpy的shape类型,来控制曲线的数量,曲线的2D和3D显示,如下:
#只有y值,(1,N)或(N,)单曲线data0 = np.array([1],dtype=float) data00 = np.array([[[1]]],dtype=float) data1 = np.array([[1,2]],dtype=float) #有x、y值(2,N),单曲线data2 = np.array([[1], [2]],dtype=float)#有x,y,z,(3,N),单曲线 data3 = np.array([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7]],dtype=float)#有x,y,(2,N,N),N根曲线data4 = np.array([[[ 1.,1., 1.],],[[ 2.,2., 4.],]],dtype=float)#有x,y,z,(3,N,N),N跟曲线data5 = np.array([[[ 1.,1., 1.],],[[ 1.,1., 1.],],[[ 2.,2., 4.],]],dtype=float)
这样,只要把数据进行预处理,就可以马上进行可视化了。
三、核心代码说明
3.1 设置缓存
设置一个缓存,可以持续接收数据流,并显示出来,同时如果超过缓存允许的长度,就把最早的数据舍掉,加入最新的数据。这里涉及到对输入data的shape的判断,对支持的shape进行解析,要考虑经可能多的shape存在。这个需要经过多种shape的输入测试。
然后,如果输入只有一维,也就是只有Y值得情况,就应该补上x得值,这里x得值用step得自然数补充。
同时,如果缓存中存储了数据,再输入数据时,需要经过numpy得拼接等操作。
def add_data(self, data): if data.shape[0]>0 and data.shape[0]<=3: if len(data.shape)>3:return Falseelse:if len(data.shape)==1:#print("add data fail,len(data.shape) must at least >1")data=data.reshape(len(data),1)if len(data.shape)==2:if data.shape[0]==1:num=len(data[0])if self.steps is None:x= np.arange(num) else:x = self.steps+num data = np.concatenate((x.reshape(1,num), data), axis=0)self.steps=x#print("self.steps",self.steps)data = data.reshape(data.shape[0], data.shape[1],1)if len(data.shape)==3 and data.shape[0]==1:passelse:#print("add new data")if len(self.cache.shape) == len(data.shape):pass else:return Falsereturn Trueelse:#single curveprint("single curve")return Falseelse:print("data.shape[0] out of range must be (0,3]")return False
3.2 随机信号
为了测试趋势曲线图,可以设置一个随机信号产生得模块,形成信号源,实际应用可以采集传感器中得信号,来冲当信号源。
def draw(plot,data):# 定义均值和标准差mu = 5sigma = 0.6 print(plot.add_data(data))if data.shape[0]<=1:if len(data.shape)==1:passnum=len(data)error=np.random.normal(mu, sigma, num)data[0]=error[0]elif len(data.shape)==3:num=data.shape[1]error=np.random.normal(mu, sigma, num).reshape(num,1)#error2 = np.random.normal(mu, sigma, num)for i in range(1,data.shape[2]):error1 = np.random.normal(mu, sigma, num).reshape(num,1)#error2 = np.random.normal(mu, sigma, num)error=np.concatenate((error1.reshape(num,1), error), axis=1)data[0]=errorprint(data)else:num=len(data[0])error=np.random.normal(mu, sigma, num)data[0]=error elif data.shape[0]==2: data[0]=data[0]+(data.shape[1]) num=len(data[1])if len(data.shape)==3:#2D mutpleerror=np.random.normal(mu, sigma, num).reshape(num,1)#error2 = np.random.normal(mu, sigma, num)for i in range(1,data.shape[2]):error1 = np.random.normal(mu, sigma, num).reshape(num,1)#error2 = np.random.normal(mu, sigma, num)error=np.concatenate((error1.reshape(num,1), error), axis=1)data[1]=error#print("data4:",data4[0])elif len(data.shape)==2:#2Derror=np.random.normal(mu, sigma, num).reshape(num,1)data[1]=errorelif data.shape[0]==3:data[0]=data[0]+(data.shape[1]) data[1]=data[1]+(data.shape[1])num=len(data[2])if len(data.shape)==3:#3D multerror=np.random.normal(mu, sigma, num).reshape(num,1)#error2 = np.random.normal(mu, sigma, num)for i in range(1,data.shape[2]):error1 = np.random.normal(mu, sigma, num).reshape(num,1)#error2 = np.random.normal(mu, sigma, num)error=np.concatenate((error1.reshape(num,1), error), axis=1)data[2]=errorelif len(data.shape)==2:#3D singleerror=np.random.normal(mu, sigma, num)data[2]=errorplot.plot()
3.3 根据设置绘图
当存入缓存后,绘图得任务就是解析缓存中得数据,把数据根据颜色、标题、坐标最大最小、绘制得类型等绘制出来。
def plot(self):number_str = str(self.plotlayout) if len(number_str) == 3: hundreds = int(number_str[0])tens = int(number_str[1])units = int(number_str[2])if hundreds*tens != units:return Falseif len(self.cache.shape)==3:if self.plotlayout%10 != self.cache.shape[2] and self.plotlayout%10 != 1:return Falseif len(self.cache.shape)==2:#single lineself.cache=self.cache.reshape(self.cache.shape[0],self.cache.shape[1],1)if units==1: if self.cache.shape[0] == 2: # 1D data if self.fig2D == None: self.fig2D = plt.figure(self.fignum,figsize=self.size)self.fig2D.canvas.manager.window.move(self.loc[0],self.loc[1])if self.ax2D is None:#nrows, ncols, index self.ax2D = self.fig2D.add_subplot(111) self.ax2D.grid(linestyle='--', alpha=0.5)self.ax2D.set_xlabel("X")self.ax2D.set_ylabel("Y")self.ax2D.set_title(self.title) if self.an2d is not None:#self.an2d.pop().remove()#print(len(self.an2d))if isinstance(self.an2d, matplotlib.container.BarContainer):self.an2d.remove()else: self.an2d.pop().remove()maxx=float('-inf')minx=float('inf')for line in range(self.cache.shape[2]): x = self.cache[0,:,line]y = self.cache[1,:,line]if len(x)>self.viewwinlen:x=x[-self.viewwinlen:]y=y[-self.viewwinlen:]pass
五、总结
实现了这个模块后,就可以封装到工作流中,可以供以后数据分析监视使用。有了这个块,就可以绘制多个图,在屏幕得任意位置,便于数据分析,和实时监控,特别适合试验室监视。
当然,可以看出matplot这个画布如果用于实时显示,可以看见开销和实时性较大。用于研究和原型开发足够,但是用于实时得生产环境,还时考虑进行优化。
四、源码
已经上传到资源,下载链接
[------------本篇完--------------------------]
PS.扩展阅读
————————————————————————————————————————
对于python机器人编程感兴趣的小伙伴,可以进入如下链接阅读相关咨询
ps1.六自由度机器人相关文章资源
(1) 对六自由度机械臂的运动控制及python实现(附源码)
(2) N轴机械臂的MDH正向建模,及python算法
ps2.四轴机器相关文章资源
(1) 文章:python机器人编程——用python实现一个写字机器人
(2)python机器人实战——0到1创建一个自动是色块机器人项目-CSDN直播
(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(3)博文《我从0开始搭建了一个色块自动抓取机器人,并实现了大模型的接入和语音控制-(上基础篇)》的vrep基础环境
(4)实现了语音输入+大模型指令解析+机器视觉+机械臂流程打通
ps3.移动小车相关文章资源
(1)python做了一个极简的栅格地图行走机器人,到底能干啥?[第五弹]——解锁蒙特卡洛定位功能-CSDN博客
(2) 对应python资源:源码地址
(3)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(上篇)_agv编程-CSDN博客
(4)python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)_agv路线规划原则python-CSDN博客
对应python及仿真环境资源:源码链接
相关文章:

python机器人编程——开发一个pymatlab工具箱(上)
目录 一、前言二、实现过程2.1 封装属性2.2 数据流化显示2.3 输入数据的适应性 三、核心代码说明3.1 设置缓存3.2 随机信号3.3 根据设置绘图 五、总结四、源码PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源 一、前言 我们知道m…...

输入类控件
目录 1.Line Edit 代码示例: 录入个人信息 代码示例: 使用正则表达式验证输入框的数据 代码示例: 验证两次输入的密码一致 代码示例: 切换显示密码 2.Text Edit 代码示例: 获取多行输入框的内容 代码示例: 验证输入框的各种信号 3.Combo Box 代码示例: 使用下拉框模拟…...

C++20中的模块
大多数C项目使用多个翻译单元(translation units),因此它们需要在这些单元之间共享声明和定义(share declarations and definitions)。headers的使用在这方面非常突出。模块(module)是一种language feature,用于在翻译单元之间共享声明和定义。它们是某些…...
Selenium与流行框架集成:pytest与Allure报告
Selenium与流行框架集成:pytest与Allure报告 在现代软件开发中,自动化测试是确保产品质量和快速迭代的关键。Selenium作为业界领先的Web自动化测试工具,其灵活性和强大的功能受到广泛认可。为了进一步提升测试效率和报告质量,本文…...

日撸Java三百行(day17:链队列)
目录 一、队列基础知识 1.队列的概念 2.队列的实现 二、代码实现 1.链队列创建 2.链队列遍历 3.入队 4.出队 5.数据测试 6.完整的程序代码 总结 一、队列基础知识 1.队列的概念 今天我们继续学习另一个常见的数据结构——队列。和栈一样,队列也是一种操…...

Android摄像头采集选Camera1还是Camera2?
Camera1还是Camera2? 好多开发者纠结,Android平台采集摄像头,到底是用Camera1还是Camera2?实际上,Camera1和Camera2分别对应相机API1和相机API2。Android 5.0开始,已经弃用了Camera API1,新平台…...

零基础5分钟上手亚马逊云科技AWS核心云开发/云架构 - 创建高可用数据库集群
简介: 欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,让大家零基础5分钟通过这篇文章就能完全学会亚马逊云科技一个经典的服务开发架构方案。 我将每天介绍一个基于亚马逊云科…...
力扣315.计算右侧小于当前元素的个数
力扣315.计算右侧小于当前元素的个数 离散化 树状数组 const int N 100010;int tr[N],n;class Solution {public:vector<int> countSmaller(vector<int>& nums) {n nums.size();vector<int> tmp(nums);vector<int> res(n);memset(tr,0,sizeo…...
websocket,css动画和css-position、display、区别
一、websocket codereturn {// 用于存储 WebSocket 返回的状态数据statusList: [],},mounted() {this.setupWebSocket();this.startBlinking();},methods: {setupWebSocket() {// 创建 WebSocket 连接const socket = new WebSocket(ws://xxx.xxx:xxx/xxx);// WebSocket 连接成功…...

前端获取视频文件宽高信息和视频时长
安装 yarn add video-metadata-thumbnails | npm install video-metadata-thumbnails引入依赖包 import { getMetadata } from video-metadata-thumbnails使用 if (file.name.includes(mp4)) {if (file) {try {console.log(file)// 获取视频的元数据const metadata await …...
【区块链+医疗健康】基于区块链的药品类监管应用管理系统 | FISCO BCOS应用案例
退热类药品的购药信息及政企互动信息等各项数据的安全性、保密性、真实性,不仅影响着监管部门的科学监管、 有效监管,也影响着企业的经营安全、诚信口碑,是区域药品安全监管工作进展的直观体现。 江苏数予科技有限公司构建基于区块链的药品类…...

MySQL4多表查询 内连接
多表查询 数据准备 CREATE DATABASE db4; USE db4; -- 创建部门表 create table if not exists dept(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp(eid varchar(20) primary key , -- 员工编号…...
Java -数组
1.一维数组 1.1数组定义 public class Main {public static void main(String[] args) throws Exception {int[] a new int[10];float[] f new float[10];double[] d new double[10];char[] c new char[10];} } 1.2 初始化 public class Main {public static void main(S…...
.prettierrc.js 有什么用
.prettierrc.js 是 Prettier 代码格式化工具的配置文件。 1. 作用 Prettier 是一个用于统一代码风格的工具,它可以使代码更具可读性和一致性。.prettierrc.js 文件用于自定义 Prettier 的格式化规则。 通过配置 .prettierrc.js,团队中的开发者可以遵循…...
haproxy七层代理
一.haproxy的基本部署 1.RS上装nginx [rootwebserver1 ~]# dnf install nginx -y 2.再RS上写入测试信息 [rootwebserver1 ~]# echo webserver1 - 172.25.254.10 > /usr/share/nginx/html/index.html [rootwebserver1 ~]# systemctl enable --now nginx [rootwebserver…...

<数据集>柑橘缺陷识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:1290张 标注数量(xml文件个数):1290 标注数量(txt文件个数):1290 标注类别数:4 标注类别名称:[Orange-Green-Black-Spot, Orange-Black-Spot, Orange-Canker, Orange…...

Go开发后端和Vue3开发前端的前后端分离框架中自己手戳一个OA流程审批、工作流引擎给新时代一个漂亮便捷的工作流引擎
前言 在软件项目开发中,我们都会接触到流程审批的需要业务,我们以往用的最多就是如下图这种流程编辑引擎插件: 以上截图中的流程工具是不是大家常见的呀!感觉很丑拿不出手呀!在当前行业内卷及竞争激烈情况下ÿ…...
深入理解 toDto 与 toEntity:结合 Eladmin 框架的最佳实践
在现代软件开发中,尤其是后端开发中,数据传输对象(DTO)和实体对象的转换是一个常见且重要的操作。理解和正确实现这种转换不仅能提高代码的可维护性,还能提升应用的性能和安全性。本文将深入探讨 toDto 和 toEntity 方…...

基于区块链的供应链应用开发
区块链的供应链溯源应用开发 一 、环境准备 (1)更新镜像源 apt update(2)安装(openssl、jdk、git) apt -y install openssl default-jdk git(3)配置JAVA_HOME环境变量 echo “export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/” >> /etc/profilesource /etc…...
获取GORM执行时的sql字符串
示例: import "log" func GetDetail(tx *gorm.DB,id int)(data any,err error){var query tx.Session(&gorm.Session{DryRun: true})err query.Where("id ?", id).First(&res).Errorif err!nil{zap.L().Error("get detail er…...

Linux系统使用Docker安装RStudio服务并实现任意浏览器远程访问
文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE,并通过 Web 浏览器进行访问…...

【原创】springboot+mysql法律咨询网设计与实现
个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…...
Vue 应用实例的关键方法与配置案例二
目录 createApp createSSRApp app.mount app.unmount app.component app.directive Vue3.X自定义全局指令 Vue2.X自定义全局指令 app.use app.mixin 非 VIP 用户能够免费下载博文资源 createApp 详见上一章节:Vue 应用实例的关键方法与配置案例一-CSDN博客 createSS…...

Java面试题--JVM大厂篇之破解 JVM 性能瓶颈:实战优化策略大全
目录 引言: 正文: 1. 常见的JVM性能问题 频繁的GC导致应用暂停 内存泄漏导致的内存不足 线程争用导致的CPU利用率过高 类加载问题导致的启动时间过长 2. 优化策略大全 2.1 代码层面的优化 2.1.1 避免不必要的对象创建 2.1.2 优化数据结构的选择 2.1.3 使用并发工具…...
Apache Curator 创建节点时,如果节点存储就会抛出异常吗?
在Apache Curator中,创建节点时,如果该节点已经存在,并且你的代码没有正确处理这种情况,那么会抛出NodeExistsException异常。这是ZooKeeper客户端库(包括Curator)的常见行为,因为它需要确保Zoo…...

【食物链】
题目 代码 #include<bits/stdc.h> using namespace std; const int N 5e410; int n, k; int p[N], d[N]; int find(int x) {if(p[x] ! x){int root find(p[x]);d[x] d[p[x]];p[x] root;}return p[x]; } int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)…...
【RN】实现markdown文本简单解析
需求 支持文本插入,比如 xxx {product_name} xxx ,如果提供了product_name变量的值为feedback,则可以渲染出 xxx feedback xxx。支持链接解析,比如 [baidu](https://www.baidu.com/),可以直接渲染成超链接的形式。支持…...
webpack plugin
webpack plugin webpack完成的复杂炫酷的功能依赖于插件机制,webpack的插件机制依赖于核心的库, tapable tapable是一个类似于nodejs的eventEmitter的库, 主要是控制钩子函数的发布喝定于,当时,tapable提供您的hook机…...
【busybox记录】【shell指令】date
目录 内容来源: 【GUN】【date】指令介绍 【busybox】【date】指令介绍 【linux】【date】指令介绍 使用示例: 打印前天的日期: 打印三个月零一天后的日期: 打印当年圣诞节的年数: 打印当前的全月名称和月的日期: 要打印一个没有前导零的日期&…...

同态加密和SEAL库的介绍(八)性能
本篇会对比三种加密方案,同时每种方案配置三种参数。即九种情况下的各个操作的性能差异,为大家选择合适的方案和合适的参数提供参考。表格中所有时长的单位均为微妙,即 。 当然数据量比较大,为了方便大家查找,…...