精华内容
下载资源
问答
  • 机器人路径规划之动态窗口

    千次阅读 2020-03-19 17:56:56
    动态窗口(Dynamic Window Approach)概述 DWA是一种基于速度的局部规划器,可计算达到目标所需的机器人的最佳无碰撞速度。 程序实现 DWA算法主要分三步: 计算动态窗口 计算最优[v,ω][v,\omega][v,ω] 更新...

    动态窗口法(Dynamic Window Approach)概述

    DWA是一种基于速度的局部规划器,可计算达到目标所需的机器人的最佳无碰撞速度。

    DWA

    程序实现

    DWA算法主要分三步:

    • 计算动态窗口
    • 计算最优[v,ω][v,\omega]
    • 更新机器人状态

    流程图如下:

    流程图

    以下代码参考:https://github.com/AtsushiSakai/PythonRobotics

    初始化机器人状态、目标位置、障碍物位置

    # 初始化机器人状态 [x(m), y(m), yaw(rad), v(m/s), omega(rad/s)]
    x = np.array([0.0, 0.0, math.pi / 8.0, 0.0, 0.0])
    # 目标位置 [x(m), y(m)]
    goal = np.array([gx, gy])
    # 障碍物位置 [x(m), y(m)]
    ob = np.array([[-1, -1], ...... , [13.0, 13.0]])
    

    获取动态窗口

    这个动态窗口就是机器人在当前状态下能达到的速度vv和转速ω\omega范围,受到自身机械特性以及当前状态的影响。

    def calc_dynamic_window(x, config):
        """
        calculation dynamic window based on current state x
        """
    
        # Dynamic window from robot specification
        Vs = [config.min_speed, config.max_speed,
              -config.max_yawrate, config.max_yawrate]
    
        # Dynamic window from motion model
        Vd = [x[3] - config.max_accel * config.dt,
              x[3] + config.max_accel * config.dt,
              x[4] - config.max_dyawrate * config.dt,
              x[4] + config.max_dyawrate * config.dt]
    
        #  [vmin, vmax, yaw_rate min, yaw_rate max]
        dw = [max(Vs[0], Vd[0]), min(Vs[1], Vd[1]),
              max(Vs[2], Vd[2]), min(Vs[3], Vd[3])]
    
        return dw
    

    计算最优[v,ω][v,\omega]

    对动态窗口采样,得到N×MN\times M[vij,ωij]i<N,j<M[v_{ij},\omega_{ij}]|i<N,j<M,并计算v=vij,ω=ωijv=v_{ij},\omega=\omega_{ij}时机器人的预测轨迹。接下来计算机器人v=vij,ω=ωijv=v_{ij},\omega=\omega_{ij}时的评价函数:
    G(v,ω)=a1heading(v,ω)+a2dist(v,ω)+a3velocity(v,ω) G(v,\omega)=a_1\cdot heading(v,\omega)+a_2\cdot dist(v,\omega)+a_3\cdot velocity(v,\omega)

    • heading(v,ω)heading(v,\omega)表示机器人运动方向与目标方向的偏差θ\theta(如下图)。
    target_heading
    • dist(v,ω)dist(v,\omega)表示与预测轨迹相交并且距离当前机器人位置最近的障碍物的距离,当没有障碍物处于预测轨迹上时,这个函数取一个很大的常数。
    • velocity(v,ω)velocity(v,\omega)表示机器人处于预测轨迹最后一点时的速度vv

    计算机器人处于v=vij,ω=ωijv=v_{ij},\omega=\omega_{ij}时的评价函数,得到一系列的代价,代价最小时的[vij,ωij][v_{ij},\omega_{ij}]即为最优[v,ω][v,\omega]

    def calc_control_and_trajectory(x, dw, config, goal, ob):
        """
        calculation final input with dynamic window
        """
    
        x_init = x[:]
        min_cost = float("inf")
        best_u = [0.0, 0.0]
        best_trajectory = np.array([x])
    
        # 计算动态窗口内所有的采样样本的代价函数
        for v in np.arange(dw[0], dw[1], config.v_reso):
            for y in np.arange(dw[2], dw[3], config.yawrate_reso):
    
                trajectory = predict_trajectory(x_init, v, y, config)
    
                # 计算代价函数
                to_goal_cost = config.to_goal_cost_gain * calc_to_goal_cost(trajectory, goal)
                speed_cost = config.speed_cost_gain * (config.max_speed - trajectory[-1, 3])
                ob_cost = config.obstacle_cost_gain * calc_obstacle_cost(trajectory, ob, config)
    
                final_cost = to_goal_cost + speed_cost + ob_cost
    
                # 寻找具有最小代价的样本以及它的轨迹
                if min_cost >= final_cost:
                    min_cost = final_cost
                    best_u = [v, y]
                    best_trajectory = trajectory
    
        return best_u, best_trajectory
    

    更新状态

    根据最优u=[v,ω]u=[v,\omega]更新机器人状态

    x = motion(x, u, config.dt)  
    

    完整代码参见这里

    展开全文
  • 动态窗的口(Dynamic Window Approach,DWA)与Matlab中gif动态图的制作 动态窗口方法是由Dieter Fox,Wolfram Burgard和Sebastian Thrun在1997年开发的用于移动机器人在线避障的一种策略。动态窗口根据机器人...

    动态窗的口法(Dynamic Window Approach,DWA)与Matlab中gif动态图的制作

    动态窗口方法是由Dieter Fox,Wolfram Burgard和Sebastian Thrun在1997年开发的用于移动机器人在线避障的一种策略。动态窗口法根据机器人模型自身的有限速度和加速度约束,将笛卡尔坐标(x,y)转换成一组机器人速度集合(v是机器人的直线速度,w为机器人的角速度)构成的速度矢量空间。在这个速度矢量空间中对移动机器人的运动速度进行控制搜索,就可以将移动机器人局部路径规划问题转换成约束条件下的最优解选择问题。
    DWA由两个主要部分组成,一是利用速度矢量空间为移动机器人生成有效的搜索空间,Fox等人将搜索空间仅限于安全的圆形区域或扇形区域,然后在短时间内达到并且没有碰撞。二是在搜索空间中选择最佳解决方案。设计评价函数对速度矢量空间中轨迹进行评价,选择出一条当前最优轨迹,使机器人与任何障碍物保持最大间隙。具体的算法步骤如下:
    1)离散采样移动机器人的运行状态(dx,dy,θ),即多组速度对(v,w);
    2)对获得的每一组采样速度进行模拟,以预测这些速度集在短时间内的运动轨迹;
    3)使用到障碍物的距离,到目标的距离,速度等标准来评估每个获得的轨迹,并从集合中删除与障碍物碰撞的轨迹;
    4)选择最佳轨迹并在机器人模型中配置合适的设定速度;
    5)执行选定的轨迹并重复,直到机器人到达目标点。

    function [] = DynamicWindowApproachSample()  
       
    close all;  
    clear all;  
       
    disp('Dynamic Window Approach sample program start!!')  
      
    x=[0 0 pi/2 0 0]';% 机器人的初期状态[x(m),y(m),yaw(Rad),v(m/s),w(rad/s)]  
    goal=[10,8];% 目标点位置 [x(m),y(m)]  
    % 障碍物位置列表 [x(m) y(m)]  
    obstacle=[0 2;1 5; 1 8;2 3; 2 6; 3 8; 4 7;4 2; 4 4; 5 4; 5 6; 5 9 ; 8 8 ;8 9 ;7 9 ;6 5 ;6 3; 6 8;7 4 ;9 8 ;9 10  ;9 6; 2 2;6 4;10 7];                
    obstacleR=0.2;% 冲突判定用的障碍物半径  
    global dt; dt=0.1;% 时间[s]  
      
    % 机器人运动学模型  
    % 最高速度m/s],最高旋转速度[rad/s],加速度[m/ss],旋转加速度[rad/ss],  
    % 速度分辨率[m/s],转速分辨率[rad/s]]  
    Kinematic=[1.0,toRadian(20.0),0.2,toRadian(50.0),0.01,toRadian(1)];  
      
    % 评价函数参数 [heading,dist,velocity,predictDT]  
    evalParam=[0.05,0.2,0.1,3.0];  
    area=[-1 11 -1 11];% 模拟区域范围 [xmin xmax ymin ymax]  
      
    % 模拟实验的结果  
    result.x=[];  
    tic;  
    % movcount=0;  
    % Main loop  
     Fig=figure;
     filename = 'test.gif';      % 输出路径+保存的文件名.gif
    for i=1:5000  
        % DWA参数输入  
        [u,traj]=DynamicWindowApproach(x,Kinematic,goal,evalParam,obstacle,obstacleR);  
        x=f(x,u);% 机器人移动到下一个时刻  
          
        % 模拟结果的保存  
        result.x=[result.x; x'];  
          
        % 是否到达目的地  
        if norm(x(1:2)-goal')<0.5  
            disp('Arrive Goal!!');break;  
        end  
          
        %====Animation====  
        hold off;  
        ArrowLength=0.5;%   
        % 机器人  
        quiver(x(1),x(2),ArrowLength*cos(x(3)),ArrowLength*sin(x(3)),'ok');hold on;  
        plot(result.x(:,1),result.x(:,2),'-b');hold on;  
        plot(goal(1),goal(2),'or');hold on;  
        for j=1:22
        plot(obstacle(j,1),obstacle(j,2),'*k');hold on;  
        end
        if i>20
         plot(obstacle(23,1),obstacle(23,2),'sk');hold on; 
        end
        if i > 200
           plot(obstacle(24,1),obstacle(24,2),'sk');hold on; 
        end
        if i>350
             plot(obstacle(25,1),obstacle(25,2),'sk');hold on; 
        end
        % 探索轨迹  
        if ~isempty(traj)  
            for it=1:length(traj(:,1))/5  
                ind=1+(it-1)*5;  
                plot(traj(ind,:),traj(ind+1,:),'-g');hold on;  
            end  
        end  
        axis(area);  
        grid on;  
        drawnow;  
        %movcount=movcount+1;  
        %mov(movcount) = getframe(gcf);%   
        
        frame = getframe(Fig); 
        im = frame2im(frame); 
        [imind,cm] = rgb2ind(im,256);
        if i == 1
            imwrite(imind,cm,filename,'gif','WriteMode','overwrite', 'Loopcount',inf);
            %Loopcount只是在i==1的时候才有用
       else
            imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.05);
            %DelayTime:帧与帧之间的时间间隔
       end
    end 
    toc  
    %movie2avi(mov,'movie.avi');  
       
      
    function [u,trajDB]=DynamicWindowApproach(x,model,goal,evalParam,ob,R)  
      
    % Dynamic Window [vmin,vmax,wmin,wmax]  
    Vr=CalcDynamicWindow(x,model);  
      
    % 评价函数的计算  
    [evalDB,trajDB]=Evaluation(x,Vr,goal,ob,R,model,evalParam);  
      
    if isempty(evalDB)  
        disp('no path to goal!!');  
        u=[0;0];return;  
    end  
      
    % 各评价函数正则化  
    evalDB=NormalizeEval(evalDB);  
      
    % 最终评价函数的计算  
    feval=[];  
    for id=1:length(evalDB(:,1))  
        feval=[feval;evalParam(1:3)*evalDB(id,3:5)'];  
    end  
    evalDB=[evalDB feval];  
      
    [maxv,ind]=max(feval);% 最优评价函数  
    u=evalDB(ind,1:2)';%   
      
    function [evalDB,trajDB]=Evaluation(x,Vr,goal,ob,R,model,evalParam)  
    %   
    evalDB=[];  
    trajDB=[];  
    for vt=Vr(1):model(5):Vr(2)  
        for ot=Vr(3):model(6):Vr(4)  
            % 轨迹推测; 得到 xt: 机器人向前运动后的预测位姿; traj: 当前时刻 到 预测时刻之间的轨迹  
            [xt,traj]=GenerateTrajectory(x,vt,ot,evalParam(4),model);  %evalParam(4),前向模拟时间;  
            % 各评价函数的计算  
            heading=CalcHeadingEval(xt,goal);  
            dist=CalcDistEval(xt,ob,R);  
            vel=abs(vt);  
            % 制动距离的计算  
            stopDist=CalcBreakingDist(vel,model);  
            if dist>stopDist %   
                evalDB=[evalDB;[vt ot heading dist vel]];  
                trajDB=[trajDB;traj];  
            end  
        end  
    end  
      
    function EvalDB=NormalizeEval(EvalDB)  
    % 评价函数正则化  
    if sum(EvalDB(:,3))~=0  
        EvalDB(:,3)=EvalDB(:,3)/sum(EvalDB(:,3));  
    end  
    if sum(EvalDB(:,4))~=0  
        EvalDB(:,4)=EvalDB(:,4)/sum(EvalDB(:,4));  
    end  
    if sum(EvalDB(:,5))~=0  
        EvalDB(:,5)=EvalDB(:,5)/sum(EvalDB(:,5));  
    end  
      
    function [x,traj]=GenerateTrajectory(x,vt,ot,evaldt,model)  
    % 轨迹生成函数  
    % evaldt:前向模拟时间; vt、ot当前速度和角速度;   
    global dt;  
    time=0;  
    u=[vt;ot];% 输入值  
    traj=x;% 机器人轨迹  
    while time<=evaldt  
        time=time+dt;% 时间更新  
        x=f(x,u);% 运动更新  
        traj=[traj x];  
    end  
      
    function stopDist=CalcBreakingDist(vel,model)  
    % 根据运动学模型计算制动距离,这个制动距离并没有考虑旋转速度,不精确吧!!!  
    global dt;  
    stopDist=0;  
    while vel>0  
        stopDist=stopDist+vel*dt;% 制动距离的计算  
        vel=vel-model(3)*dt;%   
    end  
      
    function dist=CalcDistEval(x,ob,R)  
    % 障碍物距离评价函数  
      
    dist=100;  
    for io=1:length(ob(:,1))  
        disttmp=norm(ob(io,:)-x(1:2)')-R;
        if dist>disttmp% 离障碍物最小的距离  
            dist=disttmp;  
        end  
    end  
      
    % 障碍物距离评价限定一个最大值,如果不设定,一旦一条轨迹没有障碍物,将太占比重  
    if dist>=2*R  
        dist=2*R;  
    end  
      
    function heading=CalcHeadingEval(x,goal)  
    % heading的评价函数计算  
      
    theta=toDegree(x(3));% 机器人朝向  
    goalTheta=toDegree(atan2(goal(2)-x(2),goal(1)-x(1)));% 目标点的方位  
      
    if goalTheta>theta  
        targetTheta=goalTheta-theta;% [deg]  
    else  
        targetTheta=theta-goalTheta;% [deg]  
    end  
      
    heading=180-targetTheta;  
      
    function Vr=CalcDynamicWindow(x,model)  
    %  
    global dt;  
    % 车子速度的最大最小范围  
    Vs=[0 model(1) -model(2) model(2)];  
      
    % 根据当前速度以及加速度限制计算的动态窗口  
    Vd=[x(4)-model(3)*dt x(4)+model(3)*dt x(5)-model(4)*dt x(5)+model(4)*dt];  
      
    % 最终的Dynamic Window  
    Vtmp=[Vs;Vd];  
    Vr=[max(Vtmp(:,1)) min(Vtmp(:,2)) max(Vtmp(:,3)) min(Vtmp(:,4))];  
      
    function x = f(x, u)  
    % Motion Model  
    % u = [vt; wt];当前时刻的速度、角速度  
    global dt;  
       
    F = [1 0 0 0 0  
         0 1 0 0 0  
         0 0 1 0 0  
         0 0 0 0 0  
         0 0 0 0 0];  
       
    B = [dt*cos(x(3)) 0  
        dt*sin(x(3)) 0  
        0 dt  
        1 0  
        0 1];  
      
    x= F*x+B*u;  
      
    function radian = toRadian(degree)  
    % degree to radian  
    radian = degree/180*pi;  
      
    function degree = toDegree(radian)  
    % radian to degree  
    degree = radian/pi*180; 
    

    DWA仿真

    MATLAB getframe用法

    F = getframe(H,Rect)
    1
    H:图像句柄
    Rect:一个四元素向量,Rect=[a b c d],其中a表示截取区域到图像左端的像素数,b表示截取区域到图像底端的像素数,c表示截取区域水平像素数,d表示截取区域垂直向像素数。
    F:是一个结构体,包含两个元素:cdata和colormap
    cdata:Rect中参数选择的区域的数据,一个三维数组,其中第三维的长度是3,即截取到的是区域中RGB的值。

    展开全文
  • 霍夫变换的基本原理与霍夫线变换原理类似,对直线检测而言,一条直线可由极坐标参数r和θ确定,对于来说,则需要三个参数来确定一个(为什么是三个,圆心坐标需要两上参数,还要加上一个半径)。标准霍夫...

    霍夫圆变换的基本原理与霍夫线变换原理类似,对直线检测而言,一条直线可由极坐标参数r和θ确定,对于圆来说,则需要三个参数来确定一个圆(为什么是三个,圆心坐标需要两上参数,还要加上一个半径)。标准霍夫圆变换还是将直角坐标转换到描述圆的三维度空间中,然后使用这三个维度进行累加度量(投票),根据投票的结果判断是否为圆。要理解这段话,请先看我的博文:利用霍夫变换做直线检测的原理及OpenCV代码实现

    图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!
    图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!
    图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!

    但是转换到三维度空间,很明显,计算量是几何级增大,所以我们不可能用这个来实现圆检测法,所以出现了霍夫梯度法来检测圆的算法。

    霍夫梯度法的思路:第一步根据每个点的模向量来找到圆心,这样三维的累加平面就转化为二维累加平面;第二步根据所有候选中心的边缘非零像素对其的支持程度来确定半径。

    如果想了解霍夫梯度法的算法原理及其优点和缺点,可以参考博文找圆算法((HoughCircles)总结与优化

    OpenCV中提供了函数HoughCircles来实现霍夫梯度法,其函数原型如下

    void HoughCircles( InputArray image, OutputArray circles,int method, double dp, double minDist,double param1 = 100, double param2 = 100,int minRadius = 0, int maxRadius = 0 );

    官方解释如下:

    image – 8-bit, single-channel, grayscale input image. 
    circles – Output vector of found circles. Each vector is encoded as a 3-element floating-point vector (x, y, radius) . 
    method – Detection method to use. Currently, the only implemented method is CV_HOUGH_GRADIENT , which is basically 21HT , described in [Yuen90]. 
    dp – Inverse ratio of the accumulator resolution to the image resolution. For example, if dp=1 , the accumulator has the same resolution as the input image. If dp=2 , the accumulator has half as big width and height. 
    minDist – Minimum distance between the centers of the detected circles. If the parameter is too small, multiple neighbor circles may be falsely detected in addition to a true one. If it is too large, some circles may be missed. 
    param1 – First method-specific parameter. In case of CV_HOUGH_GRADIENT , it is the higher threshold of the two passed to the Canny() edge detector (the lower one is twice smaller). 
    param2 – Second method-specific parameter. In case of CV_HOUGH_GRADIENT , it is the accumulator threshold for the circle centers at the detection stage. The smaller it is, the more false circles may be detected. Circles, corresponding to the larger accumulator values, will be returned first. 
    minRadius – Minimum circle radius. 
    maxRadius – Maximum circle radius. 

    我翻译如下

    image-源图像

    circles-检测到的圆的参数就存在这个动态数组中,数组的每个成员包含三个参数,也就是这是一个二维数组

    method-检测方法选择参数,目前只支持 CV_HOUGH_GRADIENT这种方法,即霍夫梯度法

    dp-累加器图像分辨率的反比。要理解这个,必须举例子,比如若dp==1,那么累加器的分辨率与原图像一样,如果dp==2,那么累加器的分辨率只有原图像的一半。可见,这个值越大,累加器的分辨率反而越低,所以这是个反比值。

    minDist-检测到圆的圆心之间的最小距离,显然,这个值越小,伪圆可能越多,而这个值越大,则有越多的圆被漏检。

    param1-函数HoughCircles是用到了Canny作边缘检测的,而Canny算法中的滞后阈值法要求设定高低两个阈值,这个参数就是设定这个高阈值的,而低阈值为这个高阈值的二分之一。

    param2 -圆心阈值参数,我前面已经说了(或者大家可以参考利用霍夫变换做直线检测的原理及OpenCV代码实现),圆心是通过投票得出的,那么多少票才算是圆心呢?这个值就是确定这个问题的。

    minRadius -检测到的圆的最小半径

    maxRadius-检测到的圆的最大半径

    接下来,上代码(代码中用到的图像的下载链接http://pan.baidu.com/s/1bo6hEft

    代码请参见博文https://blog.csdn.net/lehuoziyuan/article/details/84138304

    代码运行结果如下图所示

     

    展开全文
  • 在网上搜索关于非曲线的双圆弧拟合问题时,大多是建立在复杂的数学分析基础上,却未看到一篇讨论是采用绘图来解决问题。下面,我将结合实际讨论一下,在Mastercam中是如何通过绘图,由给出的一段非曲线,到...

    在网上搜索关于非圆曲线的双圆弧拟合问题时,大多是建立在复杂的数学分析基础上,却未看到一篇讨论是采用绘图法来解决问题。下面,我将结合实际讨论一下,在Mastercam中是如何通过绘图法,由给出的一段非圆曲线,到最终获得数控加工所需的一系列相切圆弧的方法。

    请参考下图阅读绘图步骤:

    用双圆弧法对非圆曲线进行拟合的图解方法

    1. 非圆曲线和绘制等分点

    非圆曲线是指平面上除直线或圆弧之外,可用方程式表达的平面轮廓曲线。在Mastercam中用“绘制等分点”命令,可在曲线上绘制出等分点。此处为简化仅绘制了3个点,每两个相邻点之间将创建两段圆弧,并可保证两段圆弧相切。

    2. 端点连线和绘制曲线切线

    (1)用“绘制任意线”命令,绘制相邻两点间的连线,即图中下面的两条线;

    (2)用“绘制切线通过点相切”命令,绘制曲线的切线,即图中上面的4条线。

    其中的绘制切线操作需要些技巧。选取命令后,光标移至曲线处(曲线高亮显示)时,单击;按提示移动光标到要捕捉的点时,再次单击;拖出直线到适当长度后,再次单击,即完成一条切线的绘制。重复上述操作,即可完成4条切线的绘制。

    3. 绘制切圆和绘制双圆弧

    (1)为方便绘图,隐藏已绘制的非圆曲线;

    (2)用“三点或两点画圆”命令,设置为“相切”后,绘制出图中的两个相切圆;

    (3)为便于区分曲线与圆弧,将“系统颜色”设置为红色;

    (4)用“创建圆弧相切”中的“动态切弧”命令,绘制出4条圆弧。

    其中的绘制动态切弧需要些技巧。其操作大致与上面的绘制切线命令有些相似,也是要单击鼠标3次。首先捕捉的是要与圆弧相切的直线,其次是捕捉直线的端点(移动光标时有一个动态的箭头显示),拖出圆弧后,捕捉到小圆的圆心后,单击,即可绘出一条圆弧。重复操作可完成4条圆弧的绘制。

    绘制出圆弧后,可以再次显示原非圆曲线,以便与绘制的圆弧进行比较,若曲线某段与圆弧间误差较大,可在该位置增加一个节点,重新绘制切弧。

    本例主要是说明绘图原理,实际绘图时等分点的数目不能太少,需根据曲线总长及圆弧段逼近曲线的误差要求确定。

    有关双圆弧法的详细讨论,可参考机械工业出版社2012年出版的《数控编程》第3版第76页。而有关Mastercam软件的操作,机械工业出版社2008年出版的《Mastercam X2应用教程》和2014年出版的《Mastercam应用技巧》均可参考。

     

    转载地址:http://blog.sina.com.cn/s/blog_1472476c50102vjvh.html

    展开全文
  • 1 最小二乘法拟合的算法 1.1 代数逼近算法 1.2 使用scipy.optimize.leastsq 1.2.1 基本用法 1.2.2 基于Jacobian函数的高级用法 1.3 使用scipy.odr 1.3.1 基本用法 1.3.2 基于Jacobian函数的高级用法 2 三种算法...
  • 拟人拟物求解不等Packing问题

    千次阅读 2011-11-18 16:46:19
    NP难度这门课还是比较有意思的,老师布置了一道作业,写一个用拟人拟物求解不等Packing问题的小程序。 问题描述:在一个已知的容器中希望能放下N个不同形状大小的物体,其中界限容器的封闭边境以及各个物体都是...
  • PosPro编写的一段Python例程,利用递归和pygame实现迷宫寻路的动态展示
  • *之后,在变换后的图像中使用动态阈值 *检测缺陷。 最后,显示结果。 应用实例1 项目介绍 要求:检测边缘的三个红色圈圈内的缺陷。 原图: 处理程序 read_image (Image, 'C:/Users/Administrator/Desktop/1.png') ...
  • 根据数据来源生成对应的Layer,发布在服务器上,作为一个不可见的...但是如果我们想要的是动态的GraphicLayer,可以动态地在图层上添加和删除Graphic,这种服务的方式显然不能满足我们的要求,但我们可以通过GraphicLa
  • 动态规划基础水题提纲

    千次阅读 多人点赞 2018-11-04 16:15:13
    提纲 汉诺塔 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一...动态规划: 1) 问题具有最优子结构性质。如果问题的最优解所包含的 子问题的...
  • 视觉SLAM笔记(30) 特征点

    万次阅读 2019-10-08 18:46:15
    特征点、特征点、ORB 特征(FAST 关键点、BRIEF 描述子)、特征匹配
  • Matlab计算轮廓内切

    千次阅读 热门讨论 2019-06-22 20:21:32
    近期帮一位医学朋友思考如下一个问题,如何计算一个封闭曲线与的相似性。在我的引导之下,最后他认为封闭曲线中的最大内切有研究的意义。然后百度相关问题,发现已经有比较成熟的做法,而且问题的标准概括叫做...
  • 2. 牛顿和拟牛顿(Newton's method &amp; Quasi-Newton Methods) 3. 共轭梯度(Conjugate Gradient) 4. 启发式优化方法  5. 解决约束优化问题——拉格朗日乘数 0.几个数学概念 1) 梯度(一阶...
  • Android动态加载布局

    千次阅读 2015-09-14 22:52:42
    最近项目中用到了动态加载布局,今天闲下来记录一下自己的学习经历吧。 ListView我们一直都在用,只不过当Adapter中的内容比较多的时候我们有时候没办法去设置一些组件,举个例子: 可以看到京东的故事里面的这样...
  • 动态规划DP

    千次阅读 2016-12-03 09:40:18
    一.算法思想 和贪婪算法一样,在动态规划中,可将一个...不同的是,在贪婪算法中,每采用一次贪婪准则便做出一个不可撤回的决策,而在动态规划中,还要考察每个最优决策序列中是否包含一个最优子序列。 动态规划方
  • 基于代数距离的椭圆拟合

    千次阅读 2017-02-08 22:25:50
    这种方法对于直线拟合、拟合,返回的就是到其的真实距离。而对于椭圆拟合,它返回的值是与距离有类似的属性,但不是一个真正的距离值。因此这个距离被称为 代数距离 。 椭圆可以用下面的隐式方程表达: a 1 x 2...
  • 回溯(backtrack)有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯。回溯的基本做法是 搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索。...
  • matlab实现梯度下降

    千次阅读 2019-05-14 19:21:06
    非线性规划动态规划、决策分析等等。实际上,这些模型在参加暑假数学建模培训的时候,多多少少接触过,所以还算比较熟悉的。 然后在这门课程里面还学习了其它的一些优化算法。比如说一维搜索里面的黄金分割、加步...
  • 这些方法中有大家很熟悉的、用得很多的整体法、隔离法、力的合成法、力的分解法、力的正交分解法、矢量图解法、……,也有用得很少的三力汇交原理法、等分法、串反并同法、数格法、动态圆法、……,并大量举例说明。...
  • 圆环回原点问题

    千次阅读 2018-11-21 14:39:15
    回到0点有多少种不同的走 举例: 如果n=1,则从0出发只能到1或者9,不可能回到0,共0种走 如果n=2,则从0出发有4条路径:0-&amp;gt;1-&amp;gt;2, 0-&amp;gt;1-&amp;gt;0, 0-&amp;gt;9-&...
  • 动态规划常见类型总结

    千次阅读 多人点赞 2019-03-26 23:55:28
    严格来说,递推不属于动态规划问题,因为动态规划不仅有递推过程,还要有决策(即取最优),但广义的动态规划是可以包含递推的,递推是一类简单的、特殊的动态规划,毕竟动态规划与递推密不可分。动态规划类型主要...
  • 机器人局部动态避障算法dwa解析

    千次阅读 多人点赞 2019-04-30 08:55:53
     dwa算法全称叫动态窗口(dynamic window approach),其算法过程主要分为仿真获取机器人的运动轨迹、对轨迹进行评价选择最优轨迹两个主要过程,动态窗口表达的是仿真的运动轨迹数量有限,主要是因为机器人在较短...
  • Matlab实现有限差分

    千次阅读 2020-12-03 10:52:23
    此外,还要研究差分格式的解的存在性和唯一性、解的求、解法的数值稳定性、差分格式的解与原定解问题的真解的误差估计、差分格式的解当网格大小趋于零时是否趋于真解(即收敛性),等等。 有限差分方法具有简单、...
  • 动态规划模板总结

    千次阅读 2018-08-06 17:06:47
    动态规划: 通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。 试用情况: 最优子结构性质。...
  • 石子合并问题--动态规划;贪心

    万次阅读 多人点赞 2015-10-17 20:18:13
    石子合并问题 石子合并问题是最经典的DP...动态规划思路: 阶段i:石子的每一次合并过程,先两两合并,再三三合并,…最后N堆合并 状态s:每一阶段中各个不同合并方法的石子合并总得分。 决策:把当前...
  • 光流运动目标检测

    万次阅读 2019-05-21 10:07:11
    接上篇,OpenCV视频目标跟踪及背景分割器,本篇介绍OpenCV—python目标跟踪==》光流 回顾: 目标跟踪是对摄像头视频中的移动目标进行定位的过程。实时目标跟踪是许多计算机视觉应用的重要任务,如监控、基于感知...
  • 本篇文章中,我们一起探讨了OpenCV中霍夫变换相关的知识点,以及了解了OpenCV中实现霍夫线变换的HoughLines、HoughLinesP函数的使用方法,实现霍夫变换的HoughCircles函数的使用方法。此博文一共有四个配套的简短...
  • 动态规划解决约瑟夫环问题

    千次阅读 2016-03-28 10:09:04
    动态规划重点是要确定状态和状态转移方程。状态就是确定问题的解的表达式,状态转移方程就是上一阶段问题的解推出当前阶段问题解的递推式。 针对约瑟夫环问题,n个元素的环可以定义为f(n,m),m表示每次移动的步数...
  • 手把手教你建立绘制圆形的MFC项目

    万次阅读 多人点赞 2018-10-01 15:01:12
    4)运行项目-》单击菜单【的绘制】-》【中点Bresenham算法】-》若是弹出对话框效果如下,说明你到目前为止操作正确。到此,关于界面设计全部完成,接下来是算法设计 5.算法设计 该教程重心在让人掌握MFC界面...
  • 单向链表尾插和头插分别实现队列和栈

    千次阅读 多人点赞 2021-01-16 15:37:15
    链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。   画一张易于理解的简图如下   ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,230
精华内容 13,292
关键字:

动态圆法