智能车电磁组——环岛处理

在电磁智能车中,圆环要想稳定入环,预圆环判断及处理是非常重要以及不可缺少的。

在预圆环的判断过程中,我使用的是M、L、M_2这三路电感,当进入靠近预圆环的位置时,M、L、M_2这三路电感都会增大,而且当到达预圆环的位置时,M电感与M_2电感会有一个差值,通过判断M、L、M-M_2大于阈值来判断预圆环的标志位。
当预圆环的标志位置1之后,接下来就到了入环,我是通过判断预圆环然后开始通过编码器去计路程,当路程达到一个定值之后就通过舵机固定打角,执行入环程序。

注:在编码器计路程的过程中,为了防止高速情况下因为电感值的变化过大导致舵机小幅度的摆动进而导致车身姿态不稳,可以在这过程中让差比和的误差手动置零,让舵机保持在中值状态。
当执行入环程序之后,在圆环里不能一直保持固定打角,所以我在入环之后,开启陀螺仪的积分标志位,当陀螺仪的积分数值大于一个定值,则代表入环程序结束,执行环内寻迹。

这里环内寻迹我切换到第二排的三个电感寻迹,因为第一排的三个电感已经在赛道之外了,无法计算出正确的差比和值。
!!!!环内寻迹别忘了写丢线!!!!!!
预出环也是必不可少的一部分,因为如果正常寻迹接近到出环那里,与出环方向相反的那个电感的电感值会变得很大,经过差比和计算,舵机会打向和出环方向相反的方向。这也进而会导致车声冲出赛道。我的处理方案是陀螺仪的积分数值大于一个定值,就执行舵机固定打角。
预出环判定到后就执行出环程序,给舵机固定打角,当陀螺仪的积分值达到整整一圈之后,舵机回正,差比和手动置零。这时候如果让它正常寻迹的话,车子可能会因为还没远离圆环,导致左边或右边的电感值偏大,导致舵机往左大或者往右打,进而影响车身姿态。所以在出环执行完后,让车子自行一段距离,直到远离圆环,最后把圆环标志位、陀螺仪积分执行标志位和陀螺仪积分数值置零。等待下一次圆环。

!!!!!圆环的整个过程中,陀螺仪积分都在执行,直到圆环整个过程结束!!!!!
预圆环判断
if(M>650&&M-M_2>100&&L>500&&Statu == 1){
L_RING_FLAG1=1;
Statu=2; //圆环状态
BeeOn; //蜂鸣器
ring_running_flag = 1; //圆环内标志
Record_Dis = 1;//开启计算距离
}
入环
if((L_RING_FLAG1 || L_RING_DELAY_FLAG1)){
L_RING_FLAG1=0;
L_RING_DELAY_FLAG1=1;
if(Distance>75){//入环,路程大于一个值
L_RING_DELAY_FLAG1=0;
L_RING_FLAG2=1;
Record_Angle=1; //开启陀螺仪积分
Statu = 3;
}
}
结束入环
如果陀螺仪积分值大于一个阈值,则代表车身已在环内,代表入环结束,反之,则代表车身还没有在圆环内,继续执行入环。
if(L_RING_FLAG2 || L_RING_DELAY_FLAG2){
L_RING_FLAG2=0;
L_RING_DELAY_FLAG2=1;
if(Angle>150){//陀螺仪积分到一定数值,代表车身已经在圆环内
L_RING_DELAY_FLAG2=0;
L_RING_FLAG3=1;
Statu = 4;
Record_Dis = 0;//距离清零,方便下次计数
Distance = 0;
//BeeOff;
}
else{
pwm_duty(PWMB_CH1_P74,1490); //舵机固定打角
}
}
圆环内寻迹,则使用第二排的三个电感进行差比和运算。
if(ring_running_flag==1)
{
cha_2 = my_sqrt(a_L_2)-my_sqrt(a_R_2);
he_2 = my_sqrt(a_L_2)+my_sqrt(a_M_2)+my_sqrt(a_R_2);
bi_2 = cha_2/he_2;
poserror = (int16)(bi_2*100);
}
预出环判定
if(L_RING_FLAG3 || L_RING_DELAY_FLAG3){
L_RING_FLAG3=0;
L_RING_DELAY_FLAG3=1;
if(Angle>735){//判定出还口,angle到达850代表跑了接近一圈
L_RING_DELAY_FLAG3=0;
L_RING_FLAG4=1;
Statu = 5;
}
else
{
cal_poserror(L,M,R,L_2,M_2,R_2);
}
}
执行出环,舵机固定打角
if(L_RING_FLAG4 || L_RING_DELAY_FLAG4){
L_RING_FLAG4=0;
L_RING_DELAY_FLAG4=1;
if(Angle>1050){//快要结束圆环
L_RING_DELAY_FLAG4=0;
L_RING_FLAG5=1;
Statu = 6;
}
else{
pwm_duty(PWMB_CH1_P74,1500); //舵机固定打角
}
}
出环后,差比和置零,车子直行,如果中间电感小于一个值,代表远离圆环,这时候圆环过程全部结束,正常寻迹和圆环标志位清零。
if(L_RING_FLAG5 || L_RING_DELAY_FLAG5){
L_RING_FLAG5=0;
L_RING_DELAY_FLAG5=1;
if(M>580&&M<880){//
L_RING_DELAY_FLAG5=0;
Angle=0;
Record_Angle=0;
Statu=1;
h=0;
BeeOff;
ring_running_flag=0;
}
else{
cal_poserror(L,M,R,L_2,M_2,R_2);
}
}
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)
当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/
前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型
2022年底,OpenAI的预训练模型ChatGPT给人工智能领域的爱好者和研究人员留下了深刻的印象和启发,他展现的惊人能力将人工智能的研究和应用热度推向高潮,网上也充斥着和ChatGPT的各种聊天,他可以作诗、写小说、写代码、讨论疫情问题等。下面就是一些他的神回复:人命关天的坑: 写歌,留给词作者的机会不多了。。。 回答人类怎么样面对人工智能: 什么是ChatGPT?借用网上的一段介绍,ChatGPT是由人工智能研究实验室OpenAI在2022年11月30日发布的全新聊天机器人模型,一款人工智能技术驱动的自然语言处理工具。它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动
我有一个应用程序专门使用Facebook作为身份验证提供程序,并正确设置了生产模式的回调。为了让它工作,您需要为您的Facebook应用程序提供一个站点URL和一个用于回调的站点域,在我的例子中是http://appname.heroku.com和appname。heroku.com分别。问题是我的Controller设置为只允许经过身份验证的session,所以我无法在开发模式下查看我的应用程序,因为Facebook应用程序的域显然没有设置为本地主机。如何在不更改Facebook设置的情况下解决这个问题? 最佳答案 创建另一个域l
在python中,我们可以使用多处理模块。如果Perl和Ruby中有类似的库,你会教它吗?如果您能附上一个简短的示例,我将不胜感激。 最佳答案 ruby:WorkingwithmultipleprocessesinRubyConcurrencyisaMythinRubyPerl:HarnessingthepowerofmulticoreWhyPerlIsaGreatLanguageforConcurrentProgramming此外,Perl的线程是native操作系统线程,因此您可以使用它们来利用多核。