DWA算法,仿真转为C用于无人机避障
DWA算法,仿真转为C用于无人机避障
链接:
机器人局部避障的动态窗口法(dynamic window approach)
链接:
机器人局部避障的动态窗口法DWA (dynamic window approach)仿真源码详细注释版
链接: 常见路径规划算法代码-Matlab (纯代码篇)
MATLAB代码
function [] = DynamicWindowApproachSample()close all;
clear all;disp('Dynamic Window Approach sample program start!!')%% 机器人的初期状态[x(m),y(m),yaw(Rad),v(m/s),w(rad/s)]
x = [0 0 pi/2 0 0]';
% 下标宏定义 状态[x(m),y(m),yaw(Rad),v(m/s),w(rad/s)]
POSE_X = 1; %坐标 X
POSE_Y = 2; %坐标 Y
YAW_ANGLE = 3; %机器人航向角
V_SPD = 4; %机器人速度
W_ANGLE_SPD = 5; %机器人角速度 goal = [5,5]; % 目标点位置 [x(m),y(m)]% 障碍物位置列表 [x(m) y(m)]obstacle=[0 2;4 24 5];% obstacle=[0 2;
% 2 4;
% 2 5;
% 4 2;
% % 4 4;
% 5 4;
% % 5 5;
% 7.5 6;
% 5 9
% 8 8
% 7.8 8.5
% 6.5 9];obstacleR = 1;% 冲突判定用的障碍物半径
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)];
%定义Kinematic的下标含义
MD_MAX_V = 1;% 最高速度m/s]
MD_MAX_W = 2;% 最高旋转速度[rad/s]
MD_ACC = 3;% 加速度[m/ss]
MD_VW = 4;% 旋转加速度[rad/ss]
MD_V_RESOLUTION = 5;% 速度分辨率[m/s]
MD_W_RESOLUTION = 6;% 转速分辨率[rad/s]]% 评价函数参数 [heading,dist,velocity,predictDT]
% 航向得分的比重、距离得分的比重、速度得分的比重、向前模拟轨迹的时间
evalParam = [0.2, 0.1 ,0.1, 3];area = [-1 11 -1 11];% 模拟区域范围 [xmin xmax ymin ymax]% 模拟实验的结果
result.x=[]; %累积存储走过的轨迹点的状态值
tic; % 估算程序运行时间开始% movcount=0;
%% Main loop 循环运行 5000次 指导达到目的地 或者 5000次运行结束
for i = 1:5000 % DWA参数输入 返回控制量 u = [v(m/s),w(rad/s)] 和 轨迹[u,traj] = DynamicWindowApproach(x,Kinematic,goal,evalParam,obstacle,obstacleR);x = f(x,u);% 机器人移动到下一个时刻的状态量 根据当前速度和角速度推导 下一刻的位置和角度% 历史轨迹的保存result.x = [result.x; x']; %最新结果 以列的形式 添加到result.x% 是否到达目的地if norm(x(POSE_X:POSE_Y)-goal')<0.5 % norm函数来求得坐标上的两个点之间的距离disp('Arrive Goal!!');break;end%====Animation====hold off; % 关闭图形保持功能。 新图出现时,取消原图的显示。ArrowLength = 0.5; % 箭头长度% 机器人% quiver(x,y,u,v) 在 x 和 y 中每个对应元素对组所指定的坐标处将向量绘制为箭头quiver(x(POSE_X), x(POSE_Y), ArrowLength*cos(x(YAW_ANGLE)), ArrowLength*sin(x(YAW_ANGLE)), 'ok'); % 绘制机器人当前位置的航向箭头hold on; %启动图形保持功能,当前坐标轴和图形都将保持,从此绘制的图形都将添加在这个图形的基础上,并自动调整坐标轴的范围plot(result.x(:,POSE_X),result.x(:,POSE_Y),'-b');hold on; % 绘制走过的所有位置 所有历史数据的 X、Y坐标plot(goal(1),goal(2),'*r');hold on; % 绘制目标位置%plot(obstacle(:,1),obstacle(:,2),'*k');hold on; % 绘制所有障碍物位置DrawObstacle_plot(obstacle,obstacleR);% 探索轨迹 画出待评价的轨迹if ~isempty(traj) %轨迹非空for it=1:length(traj(:,1))/5 %计算所有轨迹数 traj 每5行数据 表示一条轨迹点ind = 1+(it-1)*5; %第 it 条轨迹对应在traj中的下标 plot(traj(ind,:),traj(ind+1,:),'-g');hold on; %根据一条轨迹的点串画出轨迹 traj(ind,:) 表示第ind条轨迹的所有x坐标值 traj(ind+1,:)表示第ind条轨迹的所有y坐标值endendaxis(area); %根据area设置当前图形的坐标范围,分别为x轴的最小、最大值,y轴的最小最大值grid on;drawnow; %刷新屏幕. 当代码执行时间长,需要反复执行plot时,Matlab程序不会马上把图像画到figure上,这时,要想实时看到图像的每一步变化情况,需要使用这个语句。%movcount = movcount+1;%mov(movcount) = getframe(gcf);% 记录动画帧
end
toc %输出程序运行时间 形式:时间已过 ** 秒。
%movie2avi(mov,'movie.avi'); %录制过程动画 保存为 movie.avi 文件%% 绘制所有障碍物位置 画⚪
% 输入参数:obstacle 所有障碍物的坐标 obstacleR 障碍物的半径
function [] = DrawObstacle_plot(obstacle,obstacleR)
r = obstacleR;
theta = 0:pi/20:2*pi;
for id=1:length(obstacle(:,1))x = r * cos(theta) + obstacle(id,1); y = r *sin(theta) + obstacle(id,2);plot(x,y,'-m');hold on;
end
% plot(obstacle(:,1),obstacle(:,2),'*m');hold on; % 绘制所有障碍物位置%% DWA算法实现
% model 机器人运动学模型 最高速度m/s],最高旋转速度[rad/s],加速度[m/ss],旋转加速度[rad/ss], 速度分辨率[m/s],转速分辨率[rad/s]]
% 输入参数:当前状态、模型参数、目标点、评价函数的参数、障碍物位置、障碍物半径
% 返回参数:控制量 u = [v(m/s),w(rad/s)] 和 轨迹集合 N * 31 (N:可用的轨迹数)
% 选取最优参数的物理意义:在局部导航过程中,使得机器人避开障碍物,朝着目标以较快的速度行驶。
function [u,trajDB] = DynamicWindowApproach(x,model,goal,evalParam,ob,R)
% Dynamic Window [vmin,vmax,wmin,wmax] 最小速度 最大速度 最小角速度 最大角速度速度
Vr = CalcDynamicWindow(x,model); % 根据当前状态 和 运动模型 计算当前的参数允许范围% 评价函数的计算 evalDB N*5 每行一组可用参数 分别为 速度、角速度、航向得分、距离得分、速度得分
% trajDB 每5行一条轨迹 每条轨迹都有状态x点串组成
[evalDB,trajDB]= Evaluation(x,Vr,goal,ob,R,model,evalParam); %evalParam 评价函数参数 [heading,dist,velocity,predictDT]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);% 选取评分最高的参数 对应分数返回给 maxv 对应下标返回给 ind
u = evalDB(ind,1:2)';% 返回最优参数的速度、角速度 %% 评价函数 内部负责产生可用轨迹
% 输入参数 :当前状态、参数允许范围(窗口)、目标点、障碍物位置、障碍物半径、评价函数的参数
% 返回参数:
% evalDB N*5 每行一组可用参数 分别为 速度、角速度、航向得分、距离得分、速度得分
% trajDB 每5行一条轨迹 每条轨迹包含 前向预测时间/dt + 1 = 31 个轨迹点(见生成轨迹函数)
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]; % 每5行 一条轨迹 endend
end%% 归一化处理
% 每一条轨迹的单项得分除以本项所有分数和
function EvalDB=NormalizeEval(EvalDB)
% 评价函数正则化
if sum(EvalDB(:,3))~= 0EvalDB(:,3) = EvalDB(:,3)/sum(EvalDB(:,3)); %矩阵的数除 单列矩阵的每元素分别除以本列所有数据的和
end
if sum(EvalDB(:,4))~= 0EvalDB(:,4) = EvalDB(:,4)/sum(EvalDB(:,4));
end
if sum(EvalDB(:,5))~= 0EvalDB(:,5) = EvalDB(:,5)/sum(EvalDB(:,5));
end%% 单条轨迹生成、轨迹推演函数
% 输入参数: 当前状态、vt当前速度、ot角速度、evaldt 前向模拟时间、机器人模型参数(没用到)
% 返回参数;
% x : 机器人模拟时间内向前运动 预测的终点位姿(状态);
% traj: 当前时刻 到 预测时刻之间 过程中的位姿记录(状态记录) 当前模拟的轨迹
% 轨迹点的个数为 evaldt / dt + 1 = 3.0 / 0.1 + 1 = 31
%
function [x,traj] = GenerateTrajectory(x,vt,ot,evaldt,model)
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;
MD_ACC = 3;%
stopDist=0;
while vel>0 %给定加速度的条件下 速度减到0所走的距离stopDist = stopDist + vel*dt;% 制动距离的计算 vel = vel - model(MD_ACC)*dt;%
end%% 障碍物距离评价函数 (机器人在当前轨迹上与最近的障碍物之间的距离,如果没有障碍物则设定一个常数)
% 输入参数:位姿、所有障碍物位置、障碍物半径
% 输出参数:当前预测的轨迹终点的位姿距离所有障碍物中最近的障碍物的距离 如果大于设定的最大值则等于最大值
% 距离障碍物距离越近分数越低
function dist = CalcDistEval(x,ob,R)
dist=100;
for io = 1:length(ob(:,1)) disttmp = norm(ob(io,:)-x(1:2)')-R; %到第io个障碍物的距离if dist > disttmp % 大于最小值 则选择最小值dist = disttmp;end
end% 障碍物距离评价限定一个最大值,如果不设定,一旦一条轨迹没有障碍物,将太占比重
if dist >= 2*R %最大分数限制dist = 2*R;
end%% heading的评价函数计算
% 输入参数:当前位置、目标位置
% 输出参数:航向参数得分 当前车的航向和相对于目标点的航向 偏离程度越小 分数越高 最大180分
function heading = CalcHeadingEval(x,goal)
theta = toDegree(x(3));% 机器人朝向
goalTheta = toDegree(atan2(goal(2)-x(2),goal(1)-x(1)));% 目标点相对于机器人本身的方位
if goalTheta > thetatargetTheta = goalTheta-theta;% [deg]
elsetargetTheta = theta-goalTheta;% [deg]
end% heading = 180 - targetTheta; heading = 90-targetTheta; %% 计算动态窗口
% 返回 最小速度 最大速度 最小角速度 最大角速度速度
function Vr = CalcDynamicWindow(x,model)V_SPD = 4;%机器人速度
W_ANGLE_SPD = 5;%机器人角速度 MD_MAX_V = 1;%
MD_MAX_W = 2;%
MD_ACC = 3;%
MD_VW = 4;% global dt;
% 车子速度的最大最小范围 依次为:最小速度 最大速度 最小角速度 最大角速度速度
Vs=[0 model(MD_MAX_V) -model(MD_MAX_W) model(MD_MAX_W)];% 根据当前速度以及加速度限制计算的动态窗口 依次为:最小速度 最大速度 最小角速度 最大角速度速度
Vd = [x(V_SPD)-model(MD_ACC)*dt x(V_SPD)+model(MD_ACC)*dt x(W_ANGLE_SPD)-model(MD_VW)*dt x(W_ANGLE_SPD)+model(MD_VW)*dt];% 最终的Dynamic Window
Vtmp = [Vs;Vd]; %2 X 4 每一列依次为:最小速度 最大速度 最小角速度 最大角速度速度
Vr = [max(Vtmp(:,1)) min(Vtmp(:,2)) max(Vtmp(:,3)) min(Vtmp(:,4))];%% Motion Model 根据当前状态推算下一个控制周期(dt)的状态
% u = [vt; wt];当前时刻的速度、角速度 x = 状态[x(m),y(m),yaw(Rad),v(m/s),w(rad/s)]
function x = f(x, u)
global dt;
F = [1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 0 00 0 0 0 0];B = [dt*cos(x(3)) 0dt*sin(x(3)) 00 dt1 00 1];x= F*x+B*u; %% degree to radian
function radian = toRadian(degree)
radian = degree/180*pi;%% radian to degree
function degree = toDegree(radian)
degree = radian/pi*180;%% END
C++代码
#include <math.h>
#include <iostream>
#include <vector>
//vector sun
#include <numeric>
using namespace std;#define pi 3.1415926
double dt = 0.1;class State
{
public://构造函数,即相关变量初始化,设置了五个无人车变量,初始化全部为0State(){x = 0;y = 0;yaw = 0;v = 0;w = 0;}double x;double y;double yaw;double v;double w;
};
class GTreturn
{
public:std::vector<State> traj;State state;
};
class UU
{
public:UU(){vt = 0;ot = 0;}double vt;double ot;
};class KModel
{
public:KModel(){MD_MAX_V = 1;//最大速度MD_MAX_W = 0.349;//最大角速度MD_ACC = 0.2;//加速度MD_VW = 0.8727;//角加速度MD_V_RESOLUTION = 0.01;//速度分辨率MD_W_RESOLUTION = 0.01745;//角速度分辨率}double MD_MAX_V;//最大速度double MD_MAX_W;//最大角速度double MD_ACC;//加速度double MD_VW;//角加速度double MD_V_RESOLUTION;//速度分辨率double MD_W_RESOLUTION;//角速度分辨率
};class VR
{public:VR(){min_v = 0;max_v = 0;min_w = 0;max_w = 0;}double min_v;double max_v;double min_w;double max_w;};class OB
{
public:OB(){x = 0;y = 0;}double x;double y;
};class EvalDB_cell
{
public:EvalDB_cell(){vt = 0;ot = 0;heading = 0;dist = 0;vel = 0;}double vt;double ot;double heading;double dist;double vel;
};class SumDB
{
public:std::vector<EvalDB_cell> EvalDB;std::vector<State> trajDB;};class DWAreturn
{
public:std::vector<State> trajDB;UU u;};double toDegree(double radian);
double toRadian(double degree);
State f(State state, UU u);
VR CalcDynamicWindow(State state, KModel model);
double CalcHeadingEval(State state, double goal[2]);
double CalcDistEval(State state, std::vector<OB> &obs, double R);
double CalcBreakingDist(double vel, KModel model);
GTreturn GenerateTrajectory(State state, UU u, double evaldt, KModel model);
void NormalizeEval(std::vector<EvalDB_cell> &EvalDB);
SumDB Evaluation(State state, VR vr, double goal[2], std::vector<OB> &obs, double R, KModel model, double evalParam[4]);
DWAreturn DynamicWindowApproach(State state, KModel model, double goal[2], double evalParam[4], std::vector<OB> &obs, double R);
double max(double a, double b);
double min(double a, double b);int main()
{cout << "Dynamic Window Approach sample program start!!" << endl;double evalParam[4] = { 0.05,0.01,0.9,3.0 };State state;state.yaw = pi /4;double goal[2] = { 5,5 };std::vector<OB> obs(2);obs[0].x = 0;obs[0].y = 2;obs[1].x = 2;obs[1].y = 0;double obstacleR = 0.5;KModel model;std::vector<State> result;UU u1;for (int iii = 0;iii < 5000;iii++){DWAreturn dwareturn = DynamicWindowApproach(state, model, goal, evalParam, obs, obstacleR);u1 = dwareturn.u;state = f(state, u1);result.push_back(state);if (sqrt(pow(state.x - goal[0], 2) + pow(state.y - goal[1], 2)) < 0.1){cout << "Arrive Goal" << endl;break;}cout << "第"<<iii<<"s到达的位置为" << "x = " << state.x << " y = " << state.y << endl;}
}//DWAreturn DynamicWindowApproach(State state, KModel model, double goal[2], double evalParam[4], std::vector<OB> &obs, double R)
{DWAreturn dwareturn;VR vr = CalcDynamicWindow(state, model);SumDB DB = Evaluation(state, vr, goal, obs, R, model, evalParam);if (DB.EvalDB.empty()){cout << "no path to goal!" << endl;dwareturn.u.vt = 0;dwareturn.u.ot= 0;return dwareturn;}NormalizeEval(DB.EvalDB);double result1;std::vector<double> feval;for (int id = 0; id < DB.EvalDB.size(); id++){result1 = evalParam[0] * DB.EvalDB[id].heading + evalParam[1] * DB.EvalDB[id].dist + evalParam[2] * DB.EvalDB[id].vel;feval.push_back(result1);}int k = 0;for (int ii = 1;ii < feval.size();ii++){if (feval[ii]>feval[ii-1]){k = ii;}}dwareturn.u.vt = DB.EvalDB[k].vt;dwareturn.u.ot = DB.EvalDB[k].ot;dwareturn.trajDB = DB.trajDB;return dwareturn;}SumDB Evaluation(State state, VR vr, double goal[2], std::vector<OB> &obs, double R, KModel model, double evalParam[4])
{SumDB DB;GTreturn GT;double heading, dist, vel, stopDist;EvalDB_cell evaldb;UU u;for (double vt = vr.min_v;vt < vr.max_v;vt = vt + model.MD_V_RESOLUTION){for (double ot = vr.min_w;ot < vr.max_w;ot = ot + model.MD_W_RESOLUTION){u.vt = vt;u.ot = ot;GT = GenerateTrajectory(state, u, evalParam[3], model);heading = CalcHeadingEval(GT.state, goal);dist = CalcDistEval(GT.state, obs, R);vel = abs(vt);stopDist = CalcBreakingDist(vel, model);if (dist > stopDist){evaldb.vt = vt;evaldb.ot = ot;evaldb.heading = heading;evaldb.dist = dist;evaldb.vel = vel;DB.EvalDB.push_back(evaldb);/* DB.trajDB.push_back(traj);*/}}}return DB;}void NormalizeEval(std::vector<EvalDB_cell> &EvalDB)
{int n = EvalDB.size();double sum1 = 0, sum2 = 0, sum3 = 0;int i;for (i = 0;i < n;i++) { sum1 = sum1 + EvalDB[i].heading; }for (i = 0;i < n;i++) { EvalDB[i].heading = EvalDB[i].heading / sum1; }for (i = 0;i < n;i++) { sum2 = sum2 + EvalDB[i].dist; }for (i = 0;i < n;i++) { EvalDB[i].dist = EvalDB[i].dist / sum2; }for (i = 0;i < n;i++) { sum3 = sum3 + EvalDB[i].vel; }for (i = 0;i < n;i++) { EvalDB[i].vel = EvalDB[i].vel / sum3; }}GTreturn GenerateTrajectory(State state, UU u, double evaldt, KModel model)
{GTreturn GT;double time = 0;GT.traj.push_back(state);while (time <= evaldt){time = time + dt;state = f(state, u);GT.traj.push_back(state);}GT.state = state;return GT;}double CalcBreakingDist(double vel, KModel model)
{double stopDist = 0;while (vel > 0){stopDist = stopDist + vel * dt;vel = vel - model.MD_ACC * dt;}return stopDist;}double CalcDistEval(State state, std::vector<OB>& obs, double R)
{//Define an upper distance limitdouble dist = 100;for (int io = 0;io < obs.size();io++){double disttmp = sqrt(pow(obs[io].x - state.x, 2) + pow(obs[io].y - state.y, 2)) - R;if (dist > disttmp){dist = disttmp;}}if (dist >= 2 * R){dist = 2 * R;}return dist;
}
double CalcHeadingEval(State state, double goal[2])
{double theta = toDegree(state.yaw);double goalTheta = toDegree(atan2(goal[1] - state.y, goal[0] - state.x));double targetTheta;if (goalTheta > theta){targetTheta = goalTheta - theta;}else{targetTheta = theta - goalTheta;}double heading = 90 - targetTheta;return heading;}VR CalcDynamicWindow(State state, KModel model)
{VR vr;vr.min_v = max(0, state.v - model.MD_ACC * dt);vr.max_v = min(model.MD_MAX_V, state.v + model.MD_ACC * dt);vr.min_w = max(-model.MD_MAX_W, state.w - model.MD_VW * dt);vr.max_w = min(model.MD_MAX_W, state.w + model.MD_VW * dt);return vr;}State f(State state, UU u)
{State state2;state2.x = state.x + u.vt * dt * cos(state.yaw);state2.y = state.y + u.vt * dt * sin(state.yaw);state2.yaw = state.yaw + dt * u.ot;state2.v = u.vt;state2.w = u.ot;return state2;
}double toRadian(double degree)
{double radian = degree / 180 * pi;return radian;}double toDegree(double radian)
{double degree = radian / pi * 180;return degree;}
double max(double a, double b)
{if (a < b) { a = b; };return a;}
double min(double a, double b)
{if (a > b) { a=b; };return a;}
相关文章:
DWA算法,仿真转为C用于无人机避障
DWA算法,仿真转为C用于无人机避障 链接: 机器人局部避障的动态窗口法(dynamic window approach) 链接: 机器人局部避障的动态窗口法DWA (dynamic window approach)仿真源码详细注释版 链接: 常见路径规划算法代码-Matlab (纯代码篇) …...
现阶段的主流数据库分别是哪几种?
关系型数据库 1. MySQL数据库 MySQL是最受欢迎的开源SQL数据库管理系统,它由 MySQL AB开发、发布和支持。MySQL AB是一家基于MySQL开发人员的商业公司,它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司。MySQL是MySQL AB的注册商…...

“原生感”暴涨311%,这届年轻人不再爱浓妆?丨小红书数据分析
近年来,越来越多美妆博主在社交媒体平台安利“原生感妆容”,即我们所熟知的“伪素颜妆”、“裸妆”、“白开水妆”,显然,追求“原生感”成为当代妆容主流。通过小红书数据分析工具,查看#原生感妆容 话题,近…...

基于深度学习的植物识别算法 - cnn opencv python 计算机竞赛
文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的植物识别算法 ** …...

k8s调度约束
List-Watch Kubernetes 是通过 List-Watch的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。 List-Watch机制 工作机制:用户通过 kubectl请求给 APIServer 来建立一个 Pod。APIServer会将Pod相关元信息存入 etcd 中…...

面经(面试经验)第一步,从自我介绍开始说起
看到一位同学讲自己的面试步骤和过程,我心有所感,故此想整理下面试的准备工作。以便大家能顺利应对面试,通过面试... 求职应聘找工作,面试是必然的关卡,如今竞争激烈呀,想要得到自己喜欢的工作,…...

S/4 HANA 中的 Email Template
1 如何创建Email Template? 没有特定的事务用于创建电子邮件模板,我们可以将其创建为 SE80 事务中的存储库对象,如下所示: 1,选择包(或本地对象)并右键单击。 2,选择“创建”->“更多”->“电子邮件模板” 尽管如此,对于已有的Email Template,可以使用程序…...
\r\n和\n的区别 回车/换行 在不同系统下的区别
文章目录 1 \r\n和\n的区别2 什么是 回车/换行3 \r\n和\n 故事 1 \r\n和\n的区别 \r\n和\n是两个常见的控制字符符号,它们在计算机领域中有着不同的作用和用途。 \r\n在Windows系统中被广泛使用,而\n在Unix和Linux系统中更为常见。 在Windows操作系统中…...

机械应用笔记
1. 螺纹转换头:又名金属塞头,例如M20-M16;适合于大小螺纹转换用; 2. 螺纹分英制和公制,攻丝同样也有英制和公制之分; 3. DB9头制作,M6.5的线,用M6.5的钻头扩线孔,在根…...

机房精密空调发生内部设备通信故障不一会压缩机就停止工作,怎么处理?
环境: 山特AT-DA810U 精密空调 问题描述: 机房精密空调发生内部设备通信故障不一会压缩机就停止工作,怎么处理? 回风处不显示温湿度 解决方案: 1.进入诊断模式工程师密码333333 看到压缩机关闭了,强制输出测试一下压缩机正常 2.尝试更换温湿度传感器模块网口,重启…...

手机端运维管理系统——图扑 HT for Web
随着信息技术的快速发展,网络技术的应用涉及到人们生活的方方面面。其中,手机运维管理系统可提供数字化、智能化的方式,帮助企业和组织管理监控企业的 IT 环境,提高运维效率、降低维护成本、增强安全性、提升服务质量,…...

中期科技:智慧公厕打造智能化城市设施,提升公共厕所管理与服务体验
智慧公厕是利用先进的技术和创新的解决方案来改进公厕的设施和管理。借助物联网、互联网、5G/4G通信、人工智能、大数据、云计算等新兴技术的集成,智慧公厕具备了一系列令人惊叹的应用功能。从监测公厕内部人体活动状态、人体存在状态,到空气质量情况、环…...

innovus: set_ccopt_property的基本用法
我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 clock route clock route的net type分为三种,分别是root、trunk和leaf,其中root是指fanout超过routing_top_fanout_count约束的net,leaf是指…...

打造美团外卖新体验,HarmonyOS SDK持续赋能开发者共赢鸿蒙生态
从今年8月起,所有升级到HarmonyOS 4的手机用户在美团外卖下单后,可通过屏幕上的一个“小窗口”,随时追踪到“出餐、取餐、送达”等订单状态。这个能让用户实时获悉订单进度的神奇“小窗口”,就是实况窗功能。 实况窗:简…...

Realtek 5G pcie网卡 RTL8126-CG简介
总shu:PCIE 5G网卡方案“RTL8126-CG”采用QFN56封装,面积8 x 8毫米,非常小巧,提供一个RJ-45网口、两个USB 3.x接口。它走的是PCIe 3.0 x1系统通道,搭配超五类网线,可以在长达100米的距离上提供满血的5Gbps网…...

新版Idea显示Git提交人信息
新版Idea的类和方法上会展示开发者信息 不想展示的话可以做以下配置:...
外贸网站建设攻略:如何建设一个高效的外贸网站
外贸网站是外贸企业展示自己的产品和服务,吸引和沟通国外客户,实现网络营销的重要工具。一个高效的外贸网站不仅要有美观的界面,还要有强大的功能和优化。那么,九凌网络分享如何建设一个高效的外贸网站呢? 第一步&…...

【机器学习合集】模型设计之网络宽度和深度设计 ->(个人学习记录笔记)
文章目录 网络宽度和深度设计1. 什么是网络深度1.1 为什么需要更深的模型浅层学习的缺陷深度网络更好拟合特征学习更加简单 2. 基于深度的模型设计2.1 AlexNet2.2 AlexNet工程技巧2.3 VGGNet 3. 什么是网络宽度3.1 为什么需要足够的宽度 4. 基于宽度模型的设计4.1 经典模型的宽…...

使用Objective-C和ASIHTTPRequest库进行Douban电影分析
概述 Douban是一个提供图书、音乐、电影等文化内容的社交网站,它的电影频道包含了大量的电影信息和用户评价。本文将介绍如何使用Objective-C语言和ASIHTTPRequest库进行Douban电影分析,包括如何获取电影数据、如何解析JSON格式的数据、如何使用代理IP技…...

2.数据结构-链表
概述 目标 链表的存储结构和特点链表的几种分类及各自的存储结构链表和数组的差异刷题(反转链表) 概念及存储结构 先来看一下动态数组 ArrayList 存在哪些弊端 插入,删除时间复杂度高需要一块连续的存储空间,对内存要求比较高,比如要申请…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...