- 博客(61)
- 资源 (6)
- 收藏
- 关注
原创 Odrive源码分析(七) 逆park变换
Odrive中FOC部分代码分散在各个对象中,并不是集中在某一块,所以试图在某一段代码就能得到FOC全貌是不现实的。代码主要在FieldOrientedController::get_alpha_beta_output函数中。本文主要讨论逆park变换在odrive中的代码实现。完成Park逆变换后,下一步就直接送入了SVPWM模块了。控制变量到三相电流输出的关键部分分为。
2025-04-15 22:23:38
295
原创 Odrive源码分析(六) 相关控制变量传递
综上分析:基本上外界(上位机)传送目标位置或速度或力矩到controller模块,controller模块计算成变量torque,然后由motor模块计到DQ空间,之后就可以用FOC的控制流程进行反park变换,最终通过SVPWM控制三相马鞍波形输出实现电机运转,电机运转时又通过ADC采集电流进行Clark变换和Park变换得到测量的DQ,通过controller模块的PID运算实现整个系统的闭环,整个系统还是非常严谨的。到了这里,基本的计算就结束了(odrv.control_loop_cb函数).
2025-04-13 21:13:52
320
原创 Odrive源码分析(四) 位置爬坡算法
首先当需要控制电机运动到某个位置时,会调用函数,该函数会调用上面的函数planTrapezoidal。然后会在control对象中调用eval函数不断的计算出下一时刻的目标位置和速度。Odrive中自带一个简单的梯形速度爬坡算法,本文分析下这部分代码。那么关键就是两个函数planTrapezoidal和eval。
2024-12-23 19:13:23
541
原创 Odrive源码分析(三) 数据结构
Odrive内部存在一些非常好的设计,为了通篇掌握Odrive的设计理念和算法,对项目中采用的设计模式,数据结构和算法必须了解,本文梳理下Odrive中涉及到的一些重要的数据结构。
2024-11-11 22:16:03
761
1
原创 ODrive 源码分析(二)程序架构
这里会触发软中断进入ControlLoop_IRQHandler中断函数,大部分的处理都在是这个函数中完成的,在这个函数中会完成ADC的采集,三路PWM输出更新,实时的相电流标定。Odrive的架构设计很好,把C++非常灵活的应用到了单片机的开发当中,这是用C语言很难做到的一点,因为Odrive能驱动两个电机,面向对象的设计很有必要。这里每次进行PWM输出打开和关闭MOS管时,都会进行电流采样(打开MOS管时采相压和电源电压,关闭MOS管时采集电流用于标定),最终这些数据都会用于FOC控制。
2024-11-07 11:13:27
976
1
原创 ODrive 源码分析(一)项目梳理
近期由于项目需要做一个FOC驱动控制一体的控制器,因此学习了下Odrive这个开源项目,Odrive是一个开源的性能很强悍的FOC控制器,以前也玩过BLDC相关的控制算法,但是对于FOC这类比较复杂的控制算法研究的还比较少,从零开始做一个FOC控制器工作量太大,效果还不一定好,因此我考虑基于Odrive,在巨人的肩膀上做一些功能的裁剪和添加实现我自己想要的功能。版本:gnu-mcu-eclipse-windows-build-tools-2.12-20190422-1053-win64.zip。
2024-11-06 14:29:58
986
原创 OpenTCS客户端开发之Web客户端(一)
这些问题很多是关于算法方面的,也有一部分是关于UI方面的,毕竟OpenTCS本质上是一个算法项目,但是如果希望把它进行商业化,那免不了需要UI,然而OpenTCS的UI是使用Swing做的,比较古老的框架,而且说实话,个人觉得java也不太适合做桌面客户端。3、关于建模,这部分可以说是最复杂的,这里推荐使用HTML5的Canvs进行图形的建模,也可以使用一些比较好的框架。从本文开发,我会陆续记录一些关于开发OpenTCS客户端的一些文字以便给需要帮助的人。这里抛开后端不说,推荐一种做法,使用。
2022-10-29 18:04:51
2886
9
原创 OpenTCS算法改进之Router动态规划
前面章节有提到,OpenTCS是不支持动态规划的。本节记录下OpenTCS路由算法的改进。注意:这里说的动态规划仅限于Router(实际上真正意义上的动态规划是要考虑交通死锁、运行效率等一系列问题的)。问题抛出:假设有如下场景,一个网格形地图(可以考虑仓储场景下),现场有三台车,目前状态如下:此时Vehicle-0002收到了一个订单,要求前往Point-0026(Location-005),此时按照OpenTCS的默认算法,会得到这样的一条路径,如下所示:上图可以看出Vehi.
2021-11-12 17:25:53
3807
16
原创 OpenTCS拓展之Python语言交互与拓展
最近有小伙伴给我留言,问OpenTCS除了使用内核的Extention功能进行静态拓展外,还有没有更灵活的方式进行拓展呢?我推荐他使用python进行拓展。python是一门动态的语言,号称胶水语言,非常容易和宿主语言进行结合,在JAVA中可以使用Jython进行集成,非常方便。jython是python语言的JAVA实现版(以下统称Python),官网:https://www.jython.org/使用Python对OpenTCS进行拓展是不是很酷?这里来讲一下主要流程。第...
2021-02-04 18:15:22
1028
原创 OpenTCS打造移动机器人交通管制系统(十)
最近实在有点忙,都有点忙昏头的感觉,没来得及更新TCS系列文章。本篇文章算是一个TCS系列博文的完结篇。(后续如果有一些新的东西有可能会继续更新,但可能会是以专题的形式发布。)这里顺便提一下,现在官网的TCS5版本也出来了,但是遗憾的是,本人没有发现有新的突破性的东西,其实挺失望的。本文其实没有什么新的东西可记录,但是后台有很多伙伴给我留言,想知道基于TCS的Web客户端怎么去实现,我想大概是TCS自带的客户端太丑了吧,哈哈,但其实PlantView个人觉得还是挺实用的。那么本文就来谈一下基于O
2020-07-14 19:43:42
2806
3
原创 OpenTCS打造移动机器人交通管制系统(九)
上一篇文章探讨了如何拓展Kernel。本文来讲下如何为OpenTCS增加WebAPI。由于OpenTCS有MES系统或别的第三方系统对接时通常都是使用WebAPI进行交互的。OpenTCS系统的WebAPI遵循RestAPI的设计,提供了一系列API接口,这些API接口通过Documente可以查看到。如何测试这些API?可以通过浏览器来测试(推荐使用Google浏览器),比如这里要获取全部的车辆信息,可以在浏览器中输入如下地址:http://localhost:55200/v1...
2020-06-23 11:18:56
2635
7
原创 OpenTCS打造移动机器人交通管制系统(八)
上一篇文章记录了下如何在OpenTCS框架下拓展数据库(点此查看上一篇),本篇来探讨下如何拓展Kernel。OpenTCS框架主要的作用是提供一个交通管制的框架,但是通常来说,一个完整的调度系统(这里指的是广义的调度系统),是不仅仅只有交通管制的,通常还会有业务层、逻辑层等相关模块一起和OpenTCS构成一个实际可用的系统。一般来说实际项目的架构至少应该是下面的样子:那么很显然,要想系统更紧凑,OpenTCS-Kernel需要拓展,其实OpenTCS在设计之初就预留了拓展的接口(...
2020-05-17 17:29:11
2525
6
原创 OpenTCS打造移动机器人交通管制系统(七)
在一个实际的项目中(非实验室),数据是至关重要的。本篇讲下OpenTCS的数据存储问题,OpenTCS的关键数据主要是Vehicle数据和TransportOrder的数据。然而这些数据OpenTCS没有做专门的持久化处理,也就是说只要Kernel一重启,之前发生的事就一无所知了。为了将数据持久化,本文提出一种基于redis数据库的存储方案来存储Transportorder数据(如果要...
2020-04-27 19:46:56
2943
5
原创 OpenTCS打造移动机器人交通管制系统(六)
上一篇谈到了OpenTCS的调度策略问题。并提出了关于自带算法的"死锁"的问题。1、错开订单的下发。2、改进调度资源分配算法,将双向路径考虑到资源分配的过程当中。 方法1显然是可以解决的前文提到的死锁问题的,但是有点别扭,也有点low,因此笔者尝试从算法层次着手改进。我们拓展上一篇文章提出的地图,将其拓展如下:(地图画的有点乱,懒得整理了,...
2020-04-16 20:16:10
3094
14
原创 OpenTCS打造移动机器人交通管制系统(五)
本文来谈一谈OpenTCS的调度问题。OpenTCS默认的算法是基于"前馈锁路"的方式进行交通管制的。所谓的“前馈锁路”,意思是当某辆车需要运动时,在运动之前会将MovementCommand转换成一种交通管制资源向系统中注册。只有当该资源被系统接受时,车辆才会运动,大致的逻辑如下所示:OpenTCS的这种默认交通管制策略其实比较简单,也容易理解,那么这种方式是否在实际项目中...
2020-04-11 18:16:53
4340
原创 OpenTCS打造移动机器人交通管制系统(四)
先分析下OpenTCS的一些策略方面的东西,这是OpenTCS的基础。首先需要先明确下OpenTCS内核中的三个概念:路由(Route) : 决定了车辆通过什么样的方式和算法来获得一段路径,未来车辆将沿着此路径运行。派遣(Dispacher): 决定了一个订单应该关联哪一辆小车,即为订单分配车辆和为车辆分配订单。调度(schedule):狭义上的调度,交通管制的核心,决定了何时分配...
2020-03-26 20:05:55
4788
13
原创 OpenTCS打造移动机器人交通管制系统(三)
本章主要介绍下如何开发一个新的VehicleAdapter模块(车辆驱动适配对象)。OpenTCS是一个开放的系统,从内核到模块组件全部是挂载式设计,这得益于Java语言的反射机制(JAVA从语言级就支持反射)。在介绍驱动开发之前有必要说明下IOC和DI。即所谓的依赖注入和控制反转,网络上有很多关于这两个技术的介绍,其实这是一种设计模式。(个人觉得IOC时DI的一种实现)。OpenTCS使...
2020-03-13 20:50:20
5070
原创 OpenTCS打造移动机器人交通管制系统(二)
OpenTCS从使用上来说主要分为三个模块(基于4.17版本的系统)。分为:openTCS-Kernel:交通管制的内核系统,主要算法均集中在此模块。openTCS-KernelControlCenter:内核配置的桌面图形化窗口系统,主要是对驱动进行设置。openTCS-PlantOverview:建模用的的图形化桌面程序。主要用于创建地图模型和做简单的监控。桌面软件均使用JAV...
2020-03-07 17:15:12
4841
9
原创 OpenTCS打造移动机器人交通管制系统(一)
OpenTCS是一个存在已经很久的开源的交通管制系统,之前一直没有认真研究,最近由于项目需要,着重研究了下此系统,发现内核设计的的确不错。本文记录本人在使用OpenTCS二次开发过程中的一些琐事,供有需要的工程师参考。首先要使用OpenTCS,首先要具备JAVA语言的开发能力,JAVA是一门非常优秀的语言,用户数量庞大.........首先我们从官网下载源码(目前的最新版本为v4.1...
2020-03-03 16:22:02
5000
3
原创 对角安装的双舵轮AGV运动学核心算法
我们在控制移动机器人时,比较核心和基础的问题是机构的运动学建模,一般常规可看到的AGV都是差速轮的机构,此种机构控制较为简单,运动学算法也很容易。但是此种结构的AGV不适合在重载的场合,抗打滑的性能也较为不理想。双舵轮的AGV能有效的弥补上述问题,这种双舵轮的AGV一般使用对角安装的方式安装,具有很高的灵活性,不仅承载能力强,而且可以全向移动,是一种非常不错的重载AGV机构方案,在...
2019-11-27 19:01:52
13311
8
转载 MatLab求解线性方程
MatLab求解线性方程 Matlab中solve函数主要是用来求解线性方程组的解析解或者精确解。对于得出的结果是符号变量,可以通过vpa()得出任意位数的数值解!solve函数的语法定义主要有以下四种:solve(eq)solve(eq, var)solve(eq1, eq2, …, eqn)g = solve(eq1, eq2, …, eqn, var1, var2
2013-06-18 15:34:27
2154
原创 opencv2.3结合MFC显示图像
2.3没有了Cvvimage类,要显示图像需要自己手动编写实现代码了。实际上就是运用了之前的代码,通过新加一些函数,手动构造CvvImage类实现图像的显示。现在贴出代码如下:#pragma once/* CvvImage class definition *//*来自xlh的技术博客 头文件*/#include"opencv.hpp"class CvvImage{
2013-06-05 10:33:35
1091
原创 flash下载网络图片
as3.0加载网络图片代码import flash.display.Loader;import flash.net.URLLoader;var loader:Loader = new Loader();loader.contentLoaderInfo.addEventListener(Event.COMPLETE,OnLoad);loader.load(new URLReque
2013-06-03 22:14:12
745
转载 opencv之求直线的角度
opencv之求直线的角度,这也是《learning opencv》中第六章的练习5 #include #include #include #include using namespace std;const CvSize size = cvSize(200,200);const int aperture[] = {3,5,9,11,13,17};int m
2013-05-23 11:19:22
8421
原创 VB与Flash交互
VB6+AS2测试环境VB调用FLASH中的函数Private Sub but1_Click(Index As Integer)MYFLASH.CallFunction ""End Sub//下面是AS2.0的function win():Void{ gotoAndPlay(2);//跳到第二帧 stop(); };flash.
2013-05-19 00:17:31
1105
原创 Opencv值傅里叶变换及逆变换
傅里叶变换,直接出Opencv代码。关于傅里叶变换可以参考下本文:http://www.docin.com/p-270840680.html#include #include #include #include #pragma comment(lib,"cv.lib")#pragma comment(lib,"highgui.lib")#pragma comment
2013-05-18 18:45:35
1418
原创 opencv之基于颜色空间的投影追踪
直接上代码。本例程是基于直方图反向投影的颜色追踪#include#include#include#pragma comment(lib,"cv.lib")#pragma comment(lib,"cxcore.lib")#pragma comment(lib,"cvaux.lib")#pragma comment(lib,"highgui.lib")
2013-05-04 23:34:24
981
原创 opencv之灰度图强角点检测
本文需要了解的库函数:void cvGoodFeaturesToTrack( const CvArr* image, CvArr* eig_image, CvArr* temp_image, CvPoint2D32f* corners, int* corner_count, doub
2013-05-02 16:25:26
1008
原创 opencv之高斯模型分离背景
两部曲:1、创建高斯模型2、更新高斯模型#pragma comment(lib,"cv.lib")#pragma comment(lib,"cvaux.lib")#pragma comment(lib,"highgui.lib")#pragma comment(lib,"cxcore.lib")#include#include#include#include #inc
2013-05-01 10:16:34
952
原创 opencv之分水岭实现图像分割
本文需要了解的库函数有:void cvWatershed( const CvArr* image, CvArr* markers );//分水岭算法分割图像void cvAddWeighted( const CvArr* src1, double alpha, const CvArr* src2, double beta,
2013-04-30 22:40:56
1430
原创 opencv之矩形物体检测
本文需要了解的库函数有:CvSeq* cvApproxPoly( const void* src_seq, int header_size, CvMemStorage* storage, int method, double parameter, int parameter2=0 ); //用指定的精度逼近多边形曲线double cvConto
2013-04-30 18:44:34
3960
原创 opencv之金字塔实现图像分割
本文需要了解的库函数有:void cvPyrSegmentation( IplImage* src, IplImage* dst, CvMemStorage* storage, CvSeq** comp, int level, double threshold1, double threshol
2013-04-30 13:05:19
937
原创 opencv之运动目标动作分割
本文所需要了解的库函数有:void cvAbsDiff( const CvArr* src1, const CvArr* src2, CvArr* dst );//计算两个数组差的绝对值void cvUpdateMotionHistory( const CvArr* silhouette, CvArr* mhi, doubl
2013-04-29 15:25:37
2031
原创 opencv之形态学操作
本文需要了解的库函数有://创建结构元素IplConvKernel* cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape, int* values=NULL );
2013-04-28 22:44:37
570
原创 opencv之2D点集最小外包矩形和圆形
本文需要了解的库函数如下:CvBox2D cvMinAreaRect2( const CvArr* points, CvMemStorage* storage=NULL );int cvMinEnclosingCircle( const CvArr* points, CvPoint2D32f* center, float* radius );void cvBoxPoints( Cv
2013-04-28 21:41:21
2916
原创 opencv之拉普拉斯边缘锐化
opencv之拉普拉斯边缘锐化void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size=3 ); //计算图像的laplace变换算子要求所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。为防止溢出,当输入图像是 8 位的,要求输出图像是 16 位的。可以用函数 cvConvertScale 或
2013-04-28 16:56:43
3534
原创 opencv之聚类算法
算法介绍:k-means 算法接受参数 k ,然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高,而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间
2013-04-28 13:52:18
4038
转载 opencv之卡尔曼滤波
卡尔曼滤波器结构体typedef struct CvKalman{ int MP; /* 测量向量维数 */ int DP; /* 状态向量维数 */ int CP; /* 控制向量维数 */ /* 向后兼容字段 */#if 1
2013-04-27 22:55:44
886
原创 opencv例程之哈夫直线变换
所用库函数CvSeq* cvHoughLines2( CvArr* image, void* line_storage, int method, double rho, double theta, int threshold, double param1=0, double param2=0 );
2013-04-26 20:36:52
1635
FLASH CS4中需要用到的toplevel.cs文件
2013-05-19
COM技术连接Access数据库
2013-04-09
COM接口访问Access数据库
2013-04-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人