2021-04-20

3.3 使用PID算法对车轮进行速度调节(一般采用的方法,但会抖动)

很多工程控制都会用到PID,PID的思路很简单,假设我们开车,想把车维持在60km/s的速度上,那么车速如果只有十几而且不加速,那么了我们就要往死里踩油门,当车子嗖一下子窜出去了,我们就得松油门;如果车速是58,59的样子,那么我们就轻轻,或者几乎不踩油门。如果速度是65,那么我们就松开油门,如果速度是120,那么我们就得猛踩刹车。

这就是PID算法中的P因子。我们控制车速,参考的就是当前的速度和目标速度,如果这两个速度差的很大,那么我们就多给点儿油速度小,我们就少给点儿油。我们踩油门的程度就大致符合:

油门=(目标车速-当前车速)X一个固定的力道(Propotion)

这就是PID控制中的P(Percentage)。使用这种方式控制轮子的方式可以称作P算法,现在我们把它实现一下:

在这里插入图片描述
在这个程序里,与P值的代码就三句(红框),第一句:计算当前速度与目标速度的差值;第二句:差值乘上一个比例因子;第三句,返回这个结果。这个程序有三个输入,分别为当前速度,目标速度以及最大油门。返回值就是基于当前速度和目标速度计算出的油门数值。

但是在生活中我遇到过这样一个问题:我有一辆小摩托,在我启动小摩托后,为了达到我想要的速度,我肯定是给足了油门,但是此时我的小摩托嗖一下就窜出去了(有一个很大的加速度),骑鬼火的社会人比较喜欢这种加速感,但生活不是鬼火,毕竟车头一翘阎王爷笑。当我发现我的小鬼火要翘头,我得赶快把油门松开。

此时我速度还没达到目标速度,油门还得捏着(P比例因子告诉我要捏住油门),但是因为我不能加速太快了,所以我还得松点儿油门。此时在P因子外,又有一种因子影响了油门,它就是:

微分比例因子(Derivative)

P因子和D因子在一起就构成了PD算法:

油门=P*(目标速度-当前速度)+D*(当前速度-上一时刻的速度)

参考了D值,刚刚的算法我们可以改为:

在这里插入图片描述
PID算法中,我们已经掌握了P因子和D因子,当然,这这样可能会导致另一个问题:我上一秒的速度是0,因为加速太快导致第二秒的速度一下子升高到了59km/h,按照常理,按照P因子作用,我此时应该不踩油门了(因为目标速度-当前速度≈0),但是由于D因子的存在(D因子发现我加速太快了),我会猛踩刹车。最后结果就是我速度到59了,踩刹车,速度下降,加速,又踩刹车;这样也会达到目标速度,但是这种加速是非常不稳定的。

所以,我们综合了微分,积分与比例因子,构建了完整的PID函数:

在这里插入图片描述
3.3-2使用改良的积分累加法对机器人进行控制
刚才的算法问题在于PID很难调,一般情况下轮子都面临着很强的抖动。所以我们换个思路来思考控制速度的问题(当然不是说PID不行,这个只是提供了一种更稳定的控制方法,具体采用哪种大家自行思考)

之前我们思考的逻辑,或者说数学模型是关于速度和油门之间的关系,速度矩阵是自变量,踩油门的力道是一个因变量。现在我们自变量不变,还是速度矩阵,而因变量我们变为踩油门力道的变化值,用一个公式来表示:

在这里插入图片描述
在这里插入图片描述

在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
可以使用以下代码将该XML实例转换为application/x-www-form-urlencoded格式的模型: ``` using System.Net.Http; using System.Text; using System.Xml; // 将XML实例转换为application/x-www-form-urlencoded模型 var xmlString = @"<OTA_InventoryCheckRQ EchoToken='487ef6b0-3526-45e3-81e7-0eac31754c10' Password='abc888888' PrimaryLangID='en-us' TimeStamp='2021-04-20 10:30:59' UserName='guowang' Version='1.000'> <POS> <Source> <RequestorID ID='elongID' Type='2'/> </Source> </POS> <HotelReservations> <HotelReservation> <RoomStay> <RoomTypes> <RoomType RoomTypeCode='5412309'/> </RoomTypes> <RatePlans> <RatePlan RatePlanCode='4674478'/> </RatePlans> <GuestCounts> <GuestCount AgeQualifyingCode='10' Count='2'/> <GuestCount AgeQualifyingCode='8' Count='0'/> </GuestCounts> <BasicPropertyInfo HotelCode='2525137'/> </RoomStay> <ResGlobalInfo> <RoomCount>10</RoomCount> <MemberLevel>V1</MemberLevel> <TimeSpan End='2021-04-30' Start='2021-04-29'/> </ResGlobalInfo> </HotelReservation> </HotelReservations> </OTA_InventoryCheckRQ>"; var xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlString); var formContent = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("Message", xmlDoc.OuterXml) }); var encodedString = formContent.ReadAsStringAsync().Result; Console.WriteLine(encodedString); ``` 输出结果为: ``` Message=%3COTA_InventoryCheckRQ%20EchoToken%3D%22487ef6b0-3526-45e3-81e7-0eac31754c10%22%20Password%3D%22abc888888%22%20PrimaryLangID%3D%22en-us%22%20TimeStamp%3D%222021-04-20%2010%3A30%3A59%22%20UserName%3D%22guowang%22%20Version%3D%221.000%22%3E%3CPOS%3E%3CSource%3E%3CRequestorID%20ID%3D%22elongID%22%20Type%3D%222%22%2F%3E%3C%2FSource%3E%3C%2FPOS%3E%3CHotelReservations%3E%3CHotelReservation%3E%3CRoomStay%3E%3CRoomTypes%3E%3CRoomType%20RoomTypeCode%3D%225412309%22%2F%3E%3C%2FRoomTypes%3E%3CRatePlans%3E%3CRatePlan%20RatePlanCode%3D%224674478%22%2F%3E%3C%2FRatePlans%3E%3CGuestCounts%3E%3CGuestCount%20AgeQualifyingCode%3D%2210%22%20Count%3D%222%22%2F%3E%3CGuestCount%20AgeQualifyingCode%3D%228%22%20Count%3D%220%22%2F%3E%3C%2FGuestCounts%3E%3CBasicPropertyInfo%20HotelCode%3D%222525137%22%2F%3E%3C%2FRoomStay%3E%3CResGlobalInfo%3E%3CRoomCount%3E10%3C%2FRoomCount%3E%3CMemberLevel%3EV1%3C%2FMemberLevel%3E%3CTimeSpan%20End%3D%222021-04-30%22%20Start%3D%222021-04-29%22%2F%3E%3C%2FResGlobalInfo%3E%3C%2FHotelReservation%3E%3C%2FHotelReservations%3E%3C%2FOTA_InventoryCheckRQ%3E ``` 其中,key为"Message",value为对该XML实例进行URL编码后的字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值