需要注意的是每一次 calculate更新传入的是目标位置和当前位置,返回的是一个加速度
import matplotlib.pyplot as plt
class PID():
def __init__(self, dt, max, min, Kp, Kd, Ki):
self.dt = dt # 采样周期
self.max = max # 最大调整值
self.min = min # 最小调整值
self.Kp = Kp # 比例系数
self.Kd = Kd # 积分系数
self.Ki = Ki # 微分系数
self.integral = 0 # 积分和
self.previous_error = 0 # delta_t 产生偏差
self.error = 0 #当前位置距离目标位置的偏差
def calculate(self, setpoint, measured_value):
'''
:param setpoint: 目标位置
:param measured_value: 当前位置
:return: 返回需要调整的速度
'''
self.error = setpoint - measured_value # 计算得到偏差
P_out = self.Kp * self.error # 计算出比例值
self.integral = self.integral + self.error * self.dt # 计算得到积分累加和
I_out = self.Ki * self.integral # 计算出积分值
derivative = (self.error - self.previous_error) / self.dt
D_out = self.Kd * derivative # 计算出微分值
self.previous_error = self.error # 保存上一次偏差
output = (P_out + I_out + D_out)
if output > self.max:
output = self.max
if output < self.min:
output = self.min
return output
list_x = list()
list_y = list()
testPID = PID(dt=0.1, max=100, min=-100,
Kp=0.1, Kd=0.01, Ki=0.01);
val = 20 # 初始化位置
speed = 0 # 初始化速度
for point in range(0, 200):
inc = testPID.calculate(0, val)
speed += inc * 1# 速度 + 返回的速度
val += speed * 1 # 调整位置, 1是一个代码时间片,速度*time==调整的位置
list_x.append(point)
list_y.append(speed)
plt.scatter(list_x, list_y, alpha=0.6, edgecolors='white')
plt.plot(list_x,list_y)
plt.legend()
plt.show()
面积比映射成距离函数
def caculatorAreaRadioDistance(view_size: tuple, target_size:tuple, set_point_scale = 0.3, power = 20):
'''
# 计算面积比, 并返回面积比于距离的映射公式
:param view_size: 视图 (w,h)
:param target_size: 目标框大小 (w,h)
:param set_point_scale: 目标面积比
:param power: 倍数
:return: 面积比至目标比映射出的距离
'''
area1, area = target_size[0] * target_size[1] , view_size[0] * view_size[1]
radio = area1/area
print(radio)
# radio = radio if radio < 0.5 else 0.5 # 面积比不会超过0.5
radio = radio if radio < 1 else 1 # 面积比不会超过1
# dis = set_point_scale - radio # 离 log1 的距离
# log_dis = math.log(1 + dis)
# distance = log_dis * power # 面积比和距离的映射公式
raido_err = set_point_scale - radio #目标比例 - 当前比例
# distance = (1/raido_err) * power #比例距离映射
distance = math.tanh(raido_err * math.pi) * power
# distance = distance if distance < 100 else 100
return distance
目标检测框与视图比例映射成距离的方式,可以根据距离映射公式,实现目标检测的小车追踪
import math
import matplotlib.pyplot as plt
import time
class PID():
def __init__(self, dt, max, min, Kp, Ki, Kd):
self.dt = dt
self.max = max # 最大调整值
self.min = min # 最小调整值
self.Kp = Kp # 比例系数()
self.Kd = Kd # 微分系数(当参数为正时起到阻尼的效果,当参数为负则是助力的效果)
self.Ki = Ki # 积分系数(误差的积分,能够最终确保距离)
self.integral = 0 # 积分和
self.previous_error = 0 # 上一次偏差
self.error = 0
def calculate(self, setpoint, measured_value):
self.error = setpoint - measured_value # 计算得到偏差
P_out = self.Kp * self.error # 计算出比例值
self.integral = self.integral + self.error * self.dt # 计算得到累计误差
I_out = self.Ki * self.integral # 计算出积分值
derivative = (self.error - self.previous_error) / self.dt
D_out = self.Kd * derivative # 计算出微分值
self.previous_error = self.error # 保存上一次偏差
output = (P_out + I_out + D_out)
if output > self.max:
output = self.max
if output < self.min:
output = self.min
return output
def caculatorAreaRadioDistance(view_size: tuple, target_size:tuple, set_point_scale = 0.3, power = 20):
'''
# 计算面积比, 并返回面积比于距离的映射公式
:param view_size: 视图 (w,h)
:param target_size: 目标框大小 (w,h)
:param set_point_scale: 目标面积比
:param power: 倍数
:return: 面积比至目标比映射出的距离
'''
area1, area = target_size[0] * target_size[1] , view_size[0] * view_size[1]
radio = area1/area
print(radio)
# radio = radio if radio < 0.5 else 0.5 # 面积比不会超过0.5
radio = radio if radio < 1 else 1 # 面积比不会超过1
# dis = set_point_scale - radio # 离 log1 的距离
# log_dis = math.log(1 + dis)
# distance = log_dis * power # 面积比和距离的映射公式
raido_err = set_point_scale - radio #目标比例 - 当前比例
# distance = (1/raido_err) * power #比例距离映射
distance = math.tanh(raido_err * math.pi) * power
# distance = distance if distance < 100 else 100
return distance
# if __name__ == '__main__':
# w, h = 10,10
# w1, h1 = 0.1, 0.1
# # w1, h1 = 0.01, 0.
# distance = caculatorAreaRadioDistance((w,h), (w1, h1),set_point_scale=0.3, power=200)
# print(distance)
# exit()
# 当面积比达到 0.5的时候小车停止前进
list_x = list()
list_y = list()
testPID = PID(dt=0.1, max=100, min=-100,
Kp=0.2, Kd=0.01, Ki=0.01);
val = 20 #初始化位置
speed = 0 # 初始化速度
for point in range(0, 200):
inc = testPID.calculate(0, val)
speed += inc * 1 #速度 + 返回的速度
val += speed * 1 #调整位置, 1是一个代码时间片,速度*time==调整的位置
list_x.append(point)
list_y.append(speed)
plt.scatter(list_x, list_y, alpha=0.6, edgecolors='white')
plt.plot(list_x,list_y)
plt.legend()
plt.show()
import time
import matplotlib.pyplot as plt
class PID():
def __init__(self, dt, max, min, Kp, Kd, Ki):
# self.dt = dt # 采样周期
self.max = max # 最大调整值
self.min = min # 最小调整值
self.Kp = Kp # 比例系数
self.Kd = Kd # 积分系数
self.Ki = Ki # 微分系数
self.integral = 0 # 积分和
self.previous_error = 0 # delta_t 产生偏差
self.error = 0 #当前位置距离目标位置的偏差
def calculate(self, setpoint, measured_value, delta_time):
'''
:param setpoint: 目标位置
:param measured_value: 当前位置
:param 传入一次函数真实时间
:return: 返回需要调整的速度
'''
self.error = setpoint - measured_value # 计算得到偏差
P_out = self.Kp * self.error # 计算出比例值
self.integral = self.integral + self.error * delta_time # 计算得到积分累加和
I_out = self.Ki * self.integral # 计算出积分值
derivative = (self.error - self.previous_error) / delta_time
D_out = self.Kd * derivative # 计算出微分值
self.previous_error = self.error # 保存上一次偏差
output = (P_out + I_out + D_out)
if output > self.max:
output = self.max
if output < self.min:
output = self.min
return output
plt.ion()
list_x = list()
list_y = list()
testPID = PID(dt=0.1, max=100, min=-100,
Kp=0.2, Kd=0.5, Ki=0.01);
val = 20 # 初始化位置
speed = 0 # 初始化速度
lasttime = time.time()
plt.pause(0.05)
for point in range(0, 200):
curtime = time.time()
deltatime = curtime - lasttime # 求得间距的系统真实时间
lasttime = time.time()
inc = testPID.calculate(0, val, deltatime) # 返回一个加速度
speed += inc * deltatime # 速度 + 加速度*time
val += speed * deltatime # 调整位置, 1是一个代码时间片,速度*time==调整的位置
list_x.append(point)
list_y.append(speed)
plt.pause(0.05)
plt.scatter(list_x, list_y, alpha=0.6, edgecolors='white')
plt.plot(list_x,list_y)
代码运行可以看到动态调整的速度,开始的震荡是因为初始化的原因。
文章目录一、数据链路层功能1.以太网MAC地址二、以太网帧格式三、交换机工作原理1.交换机的转发原理2.交换机以太网接口的工作模式3.配置前的连接四、交换机的命令行配置一、数据链路层功能1.以太网MAC地址1.用来识别一个以太网上的某个单独的设备或一组设备2.MAC地址由48位二进制数组成,通常分为六段,用十六进制表示二、以太网帧格式 这里我们需要关注的是目的地址、源地址和类型。目的和源地址讲的是MAC地址;类型指的是数据类型,分为两种:0800H(IP协议)和0806H(ARP..
1byte = 8bit 一个字节占8个二进制位windows操作系统,32位机中,char:1个字节short:2个字节int:4个字节long:4个字节以下是windows操作系统,32位机下的代码测试结果(32位机中,指针占4个字节,如变量e):windows操作系统,64位机中,char:1个字节..._short几个字节
行为识别也叫动作识别。学术研究通常是在公开的数据集上进行的,下面介绍一下常用的数据集。本文转自 https://blog.csdn.net/u012507022/article/details/52876179工欲善其事,必先利其器http://www.cs.utexas.edu/~chaoyeh/web_action_data/dataset_list.html,此链接内容更全,可惜整理完后发现..._行为数据集的作用是什么
经常使用无线路由器的同学会发现有时候家里的路由器长时间运行后上网速度会越来越慢,尤其是使用BT等软件下载东东会发现路由器非常慢,有时候发现小米盒子上的无线信号满格,但网络却不通?而上述问题出现后一般重启路由器就可以解决?这到底是为啥原因呢?张先生是TPLink无线路由器的前研发负责人,他下面的回答会让大家清楚这些现象背后的原因。 我们具体的疑问如下:Q1. 为啥长时间使用低端路由后,路由器
《TCP/UDP的套接字Socket通信工作流程》《基于TCP/UDP的socket编程流程》_tcp、udp完全链接
问题描述在 Jenkins 中,我们需要周期性构建,即定时执行作业,比如每隔 15 分钟执行构建。通过 Build Triggers / Build periodically 实现(针对每个作业的单独设置)该笔记将记录:Build periodically 的配置方法(实际是对帮助手册的翻译,“帮助手册”是指在 Build periodically 后的“问号按钮”)学习笔记(文档翻译)该字段(Build periodically)的语法与 Cron 类似,但是有轻微的不同。明确地说,._jenkins 每十分钟build一次
智能温控器一、实验目的二、实验内容三、实验步骤四、C代码如下五、实验结果六、实验体会一、实验目的由于智能温度控制器的核心就是单片机,单片机的选择将直接关系到控制系统的工作是否有效和协调。本设计采用MCS-51系列的8051单片机,因为8051单片机应用广泛,性能稳定,抗干扰能力强,性价比高。二、实验内容以MCS-51系列单片机为核心,采用常用电子器件设计,- -个电源开关,两个控制温度设定按键(增大/减小),四位数码管分别显示设定温度和实际温度,量程为0“99度,打开_单片机水处理
数据库批量更新是一件麻烦的事情下面我们来学习一下 快捷高效的 批量更新方法/** * 组合批量更新sql 方法 * @param string $updata 需要更新的数据 * @param string $table 表名 * @param string $colnum 要更新的字段名 * @param string $whereColnum 条件字段 * @author jackbon<[email protected]_怎样用代码实现数据库不断更新
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。例如:runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。runoo*b,可以匹配 runob、runoob、runooo..._js正则表达式校验是否包含斜杠
题意:有n个点,给一个矩阵表示每个点到别的点的距离,需要将每个点都连起来的距离最小。题解:prime 最小生成树。#include <stdio.h>#include <string.h>#include <iostream>#include <iostream>#include <algorithm>#include..._黑白ggggg
2019独角兽企业重金招聘Python工程师标准>>> ...
yaml规则docker-compose.yaml 核心Reference documentation | Docker Documentation# 3层version: '' #版本services: #服务 服务1:web # 服务配置 images build network .... 服务2:redis ... 服务3:redis #其他配置 网络/卷、全局规则volumes:networks:configs:此web项目依赖于re_docker swarm yaml