【数学建模】机器人避障问题

已知:

  1. 正方形5的左下顶点坐标 ( 80 , 60 ) (80,60) (80,60),边长 150 150 150
  2. 机器人与障碍物的距离至少超过 10 10 10个单位
  3. 规定机器人的行走路径由直线段和圆弧组成,其中圆弧是机器人转弯路径。
  4. 机器人不能折线转弯,转弯路径由与直线路径相切的一段圆弧组成,也可以由两个或多个相切的圆弧路径组成,但每个圆弧的半径最小为 10 10 10个单位。
  5. 机器人直线行走的最大速度为 v 0 v_0 v0= 5单位/秒
  6. 机器人转弯时,最大转弯速度为 v = v ( p ) = v 0 / ( 1 + e 10 − 0.1 p 2 ) v = v(p) = v_0 /( {1+ e^{10-0.1p^2}}) v=v(p)=v0/(1+e100.1p2)
    其中 p p p是转弯半径。如果超过该速度,机器人将发生侧翻,无法完成行走。
  7. A点坐标 ( 300 , 300 ) (300,300) (300,300)

需要研究的问题

问题:机器人从 O ( 0 , 0 ) O(0,0) O(0,0)出发,到达A的最短时间及其路径

问题1:画出机器人只在正方形左上角拐弯,拐弯半径为10的图

第一问其实是为整个问题服务的 , 也算是先进行一个预测,写一个样例先

MATLAB
基本数据定义:

x = 80;
y = 210;
r = 10;
theta = 0:pi/20:2*pi; %角度[0,2*pi] 
hold on;

画一个正方形:

%定义x,y轴范围
xlim([0,300]);
ylim([0,300]);
%四条线形成一个正方形
line([80,80],[60,210]);
line([80,230],[210,210]);
line([80,230],[60,60]);
line([230,230],[60,210]);

在正方形左上角为圆心画圆

plot(x+r*cos(theta),y+r*sin(theta),'-');

接着求切点
建立切点模型:
设切点为 ( x 1 , x 2 ) (x_1,x_2) (x1,x2) , 正方形左上角为圆心 ( x , y ) , x = 80 ; y = 210 ; (x,y) , x = 80;y = 210; (x,y),x=80;y=210; 圆半径 r = 10 r = 10 r=10 ;切线上除切点另外一点 ( x 2 , y 2 ) (x_2,y_2) (x2,y2) ;
即圆外一点 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)引两条切线方程
因为切线和切点到圆心的直线垂直
则有 ( x − x 2 ) 2 + ( y − y 2 ) 2 = r 2 + ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 (x-x_2)^2+(y-y_2)^2 = r^2 + (x_1-x_2)^2 + (y_1-y_2)^2 (xx2)2+(yy2)2=r2+(x1x2)2+(y1y2)2
并且切点在圆上有: ( x 1 − x ) 2 + ( y 1 − y ) 2 = r 2 (x_1-x)^2 + (y_1-y)^2 = r^2 x1x2+(y1y)2=r2

由切点模型和圆外一点 O ( 0 , 0 ) O(0,0) O(0,0)建立方程求解

%这里在命令行窗口求解即可
solve('(px-80)^2+(py-210)^2=100','px^2+py^2+100=210^2+80^2');

排除不符合要求的点

px =  8064/101 - (252*14^(1/2))/101;%(252*14^(1/2))/101 + 8064/101
%8064/101 - (252*14^(1/2))/101py = (96*14^(1/2))/101 + 21168/101;%21168/101 - (96*14^(1/2))/101
%(96*14^(1/2))/101 + 21168/101

由切点模型和圆外一点 A ( 300 , 300 ) A(300,300) A(300,300)建立方程求解

%这里在命令行窗口求解即可
solve('(px-80)^2+(py-210)^2=100','(px-300)^2+(py-300)^2+100=220^2+90^2')

排除不符合要求的点

px2 =9084/113 - (36*141^(1/2))/113;
%(36*141^(1/2))/113 + 9084/113
%9084/113 - (36*141^(1/2))/113py2 =(88*141^(1/2))/113 + 23748/113;
%23748/113 - (88*141^(1/2))/113
%(88*141^(1/2))/113 + 23748/113

将切线画出来

line([0,px],[0,py]);
line([px2,300],[py2,300]);

在这里插入图片描述

问题2:机器人只在正方形左上角拐弯,拐弯半径为10,求路径长度和时间

由问题一的图可知,路径分三段
先求最简单的两段直线长度

pdist([[0,0];[px,py]],'euclidean')
pdist([[300,300];[px2,py2]],'euclidean')
%直线总距离
L2 = pdist([[0,0];[px,py]],'euclidean') + pdist([[300,300];[px2,py2]],'euclidean');

机器人走直线时间

ans1 = L2/v0

再求弧线长度和机器人走弧度时间以及总时间
已知圆上弧长公式为: l = ∣ θ ∣ r , ( θ 为圆心角,弧度 ) l=|\theta|r , (\theta为圆心角,弧度) l=θr,(θ为圆心角,弧度)

建立圆上两点弧长模型:
设圆上两点分别为 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2)
则弦长为 d = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d= \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} d=(x1x2)2+(y1y2)2

设圆心角为 θ \theta θ,则圆周角为 θ / 2 \theta/2 θ/2
连接两点,连接其中一点和圆心并且延长 交圆上一点 ( x 3 , y 3 ) (x_3,y_3) (x3,y3) ,连接 ( x 3 , y 3 ) (x_3,y_3) (x3,y3)和另外一点,构成直角三角形
可得 s i n ( θ / 2 ) = d / ( 2 r ) sin(\theta/2) = d / (2r) sin(θ/2)=d/(2r)
所以 θ = 2 ∗ arcsin ⁡ ( d / ( 2 r ) ) \theta = 2*\arcsin{(d/(2r))} θ=2arcsin(d/(2r))
弧长 l = θ ∗ r l = \theta * r l=θr

%求弧度
%圆心角
d=sqrt((px-px2)^2+(py-py2)^2);
therta=2*asin(d/20);
%弧长
L=10*therta;

总时间


%求弧度
%圆心角
d=sqrt((px-px2)^2+(py-py2)^2);
therta=2*asin(d/20);
%弧长
L=10*therta;
%直线总距离
L2 = pdist([[0,0];[px,py]],'euclidean') + pdist([[300,300];[px2,py2]],'euclidean');v0 = 5;
vp = v0/(1+(exp(1)^(10-0.1*10*10)));ans1 = L2/v0 + L/vp;

求得为 96.017639004032700

问题3:求出最短时间及其路径

由前两问我们得出了圆上两点弧长模型建立切点模型
这一问就是结合上面模型,求一个求最小值的最优模型

设直线总长度为 s 1 s_1 s1,弧线总长度为 s 2 s_2 s2
min ⁡ a n s = s 1 / v 0 + s 2 / v \min{ans = s_1/v0 + s_2/v} minans=s1/v0+s2/v

最优的话拐弯半径和圆心肯定会变化
设转弯圆心为 ( x , y ) (x,y) (x,y),半径为 r r r
分别以 ( 0 , 0 ) 和 ( 300 , 300 ) (0,0)和(300,300) (0,0)(300,300)为圆外一点的切点分别为 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2)
由建立切点模型我们可得以下方程
{ x 2 + y 2 = r 2 + x 1 2 + y 1 2 ( x 1 − x ) 2 + ( y 1 − y ) 2 = r 2 ( x − 300 ) 2 + ( y − 300 ) 2 = r 2 + ( x 1 − 300 ) 2 + ( y 1 − 300 ) 2 ( x 2 − x ) 2 + ( y 2 − y ) 2 = r 2 \begin{cases} x^2+y^2 = r^2 + x_1^2 + y_1^2 \\ (x_1-x)^2 + (y_1-y)^2 = r^2 \\ (x-300)^2+(y-300)^2 = r^2 + (x_1-300)^2 + (y_1-300)^2\\ (x_2-x)^2 + (y_2-y)^2 = r^2 \end{cases} x2+y2=r2+x12+y12x1x2+(y1y)2=r2(x300)2+(y300)2=r2+(x1300)2+(y1300)2x2x2+(y2y)2=r2

由圆上两点弧长模型和上述切点 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_2,y_2) (x1,y1),(x2,y2)可得方程
s 2 = 2 ∗ ( arcsin ⁡ ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 / ( 2 r ) ) ∗ r s_2 = 2 * (\arcsin{\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}/(2r)})*r s2=2(arcsin(x1x2)2+(y1y2)2 /(2r))r

由圆心之间可得直线距离方程
s 1 = x 2 + y 2 − r 2 / v + ( x − 300 ) 2 + ( y − 300 ) 2 − r 2 / v s_1 = \sqrt{x^2+y^2-r^2}/v + \sqrt{(x-300)^2+(y-300)^2-r^2}/v s1=x2+y2r2 /v+(x300)2+(y300)2r2 /v
或者有上述切点可得直线距离方程为
s 1 = x 1 2 + y 1 2 / v + ( x 2 − 300 ) 2 + ( y 2 − 300 ) 2 / v s_1 = \sqrt{x_1^2+y_1^2}/v + \sqrt{(x_2-300)^2+(y_2-300)^2}/v s1=x12+y12 /v+(x2300)2+(y2300)2 /v

由于在左上角的时候是极限情况,圆心连接正方形左上角并延长出去距离必须大于等于10可得
r − ( x − 80 ) 2 + ( y − 210 ) 2 ≥ 10 r - \sqrt{(x-80)^2 + (y-210)^2}\ge10 r(x80)2+(y210)2 10

LINGO求解

data:
v0 = 5;
e = 2.71828;
enddata
s = 2*r * @asin(@sqrt((x1-x2)^2 + (y1-y2)^2)/(2*r));
v = v0 / (1+e^(10-0.1*r^2)); 
min  = @sqrt(x^2 + y^2 - r^2)/5 + @sqrt((x-300)^2 + (y-300)^2 - r^2 )/5 + s/v;
x1^2 + y1^2 + r^2 = x^2 + y^2;
(x2 - 300)^2 + (y2-300)^2 + r^2 = (x-300)^2 + (y-300)^2;
(x1-x)^2 + (y1-y)^2 = r^2;
(x2-x)^2 + (y2-y)^2 =  r^2;
r-@sqrt((x-80)^2+(y-210)^2)>=10;
x1<80;
y2>210;
x>=80 ; x<=230;
y>=60; y<=210;

得出

  Objective value:                              94.22825Objective bound:                              94.22825Variable           Value        Reduced CostV0        5.000000            0.000000E        2.718280            0.000000S        11.78994            0.000000R        12.98856            0.000000X1        69.80452            0.000000X2        77.74917            0.000000Y1        211.9779            0.000000Y2        220.1387            0.000000V        4.994814            0.000000X        82.14139            0.000000Y        207.9153            0.000000

将数据带入前两问已经写好的MATLAB中可得图像

x = 82.14139;
y = 207.9153;
r = 12.98856;
theta = 0:pi/20:2*pi; %角度[0,2*pi] 
plot(x+r*cos(theta),y+r*sin(theta),'-');
hold on;
xlim([0,300]);
ylim([0,300]);
line([80,80],[60,210]);
line([80,230],[210,210]);
line([80,230],[60,60]);
line([230,230],[60,210]);px =  69.80452;
py = 211.9779;
px2 =77.74917;
py2 =220.1387;line([0,px],[0,py]);
line([px2,300],[py2,300]);%求距离
pdist([[0,0];[px,py]],'euclidean')
pdist([[300,300];[px2,py2]],'euclidean')%求弧度
%圆心角
d=sqrt((px-px2)^2+(py-py2)^2);
therta=2*asin(d/(2*r));
%弧长
L=r*therta;
%直线总距离
L2 = pdist([[0,0];[px,py]],'euclidean') + pdist([[300,300];[px2,py2]],'euclidean');v0 = 5;
vp = v0/(1+(exp(1)^(10-0.1*r*r)));ans1 = L2/v0 + L/vp;

在这里插入图片描述
MATLAB数据算出来 , 验证成功

94.228254381074020

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在rosbag中获取第一帧数据

文章目录 1. 找出感兴趣的话题名2. 在一个终端中启动rosbag play3. 在另一个终端中使用rostopic echo4. 继续播放bag文件&#xff1a; 1. 找出感兴趣的话题名 首先&#xff0c;你需要知道你感兴趣的话题名称。可以通过rosbag info your_bagfile.bag来查看bag文件中包含的话题。…

代码随想录-算法训练营day02【数组02:滑动窗口、螺旋矩阵】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG?uc71ed002e4554fee8c262b2a4a4935d8977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II &#xff0c;总结 建议大家先独立做题&#xff0c;…

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具

基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具 文章目录 基于 MATLAB 和 App Designer 的 UI 交互框架开发的一款电力系统潮流计算工具一、软件介绍二、软件功能1、数据输入 2、潮流作业设置3、 潮流结果报表及可视化三、 软件设计思路1 、牛顿拉…

【Vue3语法单文件——自用】

1. Vue3基础语法 <script setup> import { ref,computed } from vue// 定义响应式的变量 const count ref(0) const author ref({name: John Doe,books: [Vue 2 - Advanced Guide,Vue 3 - Basic Guide,Vue 4 - The Mystery] }) //定义props const props defineProps(…

为什么forEach中的await不起作用

在JavaScript的forEach方法中使用await是无效的&#xff0c;因为forEach方法不支持异步操作的等待。 forEach是一个数组的遍历方法&#xff0c;它会对数组中的每个元素依次执行提供的回调函数。而在JavaScript中&#xff0c;await关键字只能在异步函数(async函数)中使用&#…

[RK3399 Linux] 移植Linux 5.2.8内核详解

背景是在RK3399上面移植Rockchip官方提供的u-boot 2017.09 一、linux内核 1.1 源码下载 内核源码下载地址为:《https://www.kernel.org/》: 也可以到内核镜像网址下载https://mirrors.edge.kernel.org/pub/linux/kernel/,这里下载速度更快。 如果下载速度太慢,无法下载,…

代码随想录刷题day51|股票买卖(含冷冻期)股票买卖(含手续费)

文章目录 day51学习内容一、股票买卖--含冷冻期1.1、动态规划五部曲1.1.1、 确定dp数组&#xff08;dp table&#xff09;以及下标的含义1.1.2、确定递推公式1.1.3、 dp数组如何初始化1.1.4、确定遍历顺序1.1.5、输出结果 1.2、代码 二、股票买卖--含手续费2.1、动态规划五部曲…

批量clone某个github用户的所有项目

要批量克隆某个 GitHub 用户的所有仓库&#xff0c;你可以使用 GitHub API 来列出该用户的所有仓库&#xff0c;并使用命令行工具来进行克隆。以下是一种可能的方法&#xff1a; 获取 GitHub API 访问令牌&#xff1a;首先&#xff0c;你需要在 GitHub 上生成一个访问令牌&…

蓝牙app设计(方案二) E4A (时钟 优缺点)

例程改的! 主界面 虽然上面有搜索功能,但是本人建议先自行配对在使用,这样更好用,把要使用的设备收藏一下更好找哦(这样就是橙色的了,只需要点对应蓝牙左边) 代码修改部分 原版是不停向下滚动显示,这样个人觉得不太好看,所以加了个时钟,到对应时钟周期清空(达到刷…

BGP小实验

光只是知道理论还不行&#xff0c;还是要多动手练练&#xff0c;就练一个bgp实验吧&#xff0c;梳理一下做题思路 实验要求&#xff1a; 大体要求就是&#xff1a;R1的环回可以ping通R2-R5的环回&#xff0c;R5同理 思路&#xff1a; 基础配置&#xff1a; 第一步先把地址环…

二叉树练习day.7

530.二叉搜索树的最小绝对差 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&…

【记录】Prompt模板|作为甲方怎么清晰专业地描述自己的需求(又名“乙方,给你的甲方扔个GPT解放自己吧”)

这篇Prompt摘抄并修改自朋友送给我的书的第49页5.2.3让ChatGPT构建提示&#xff0c;质量挺不错&#xff0c;支持一下她的博客&#xff1a;【好书推荐2】AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型。 书长这样&#xff1a; 不啰嗦了&#xff0c;正文如…

多张图如何制作一图一码?图片批量转二维码的制作方法

二维码现在经常被用来作为图片的载体&#xff0c;将图片生成二维码之后通过扫描二维码的方式来查看图片信息&#xff0c;那么如果遇到需要将几十张图片分别单独制作二维码的需求时&#xff0c;有什么方法能够一次性批量建码呢&#xff0c;相信有很多的小伙伴对这个问题的解决方…

关于conda安装pytorch gpu总是会自动变成cpu版本

这篇文章讲了三种方法&#xff0c;由于我使用的服务器无法连接外网&#xff0c;所以这些方法我没成功安装的pytorch不是GPU版本而是CPU版本_pytorch安装包里只是cpu-CSDN博客 然后我瞎试发现使用 conda install dataclasses 居然能够连带着把gpu版本的pytorch下载下来&…

arm64位系统中编译ffmpeg

大致过程仍然和x86平台一致&#xff1a; ./configure xxxxmakemake install 所需要变化的是需要在 ./configure xxxx 后面多加几个编译选项 cd ffmpeg ./configure (x64下的依赖配置&#xff1a;......)--prefixbin --archaarch64 --target-oslinux --enable-cross-compile …

水仙花数python

水仙花数&#xff08;Narcissistic number&#xff09;是指一个n位正整数&#xff0c;其各位数字的n次幂之和等于该数本身。例如&#xff0c;153是一个3位的水仙花数&#xff0c;因为&#xff1a;1^3 5^3 3^3 153。在Python中&#xff0c;你可以编写一个简单的脚本来找到所有…

Linux:systemd和systemctl基本使用示例

目录 systemd管理Flask应用示例systemctl常用操作 文档 https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.htmlSystemd 入门教程&#xff1a;命令篇Systemd 入门教程&#xff1a;实战篇 systemd管理Flask应用示例 创建虚拟环境&#xff0c;做好环境隔…

探秘冒泡排序:原理、实现与优化策略

冒泡排序&#xff0c;以其直观易懂的名称和简单朴素的操作&#xff0c;成为了许多初学者接触排序算法的首选。本文将详细解析冒泡排序的原理、实现步骤&#xff0c;并探讨其优化策略及应用场景&#xff0c;帮助读者全面理解这一经典排序算法的魅力所在。 一、冒泡排序原理 冒…

设计模式学习笔记 - 设计模式与范式 -行为型:13.访问者模式(下):为什么支持双分派的语言不需要访问者模式

概述 上篇文章&#xff0c;我们学习了访问者模式的原理和实现&#xff0c;并还原了访问者模式诞生的过程。总体来说&#xff0c;这个模式的代码实现比较难&#xff0c;所以应用场景不多。从应用开发的角度来说&#xff0c;它的确不是我们学习的重点。 本章&#xff0c;我们把…

高并发高性能接口中,异步打印并采集业务日志的实现方案

一、背景 高并发接口中&#xff0c;为了提高接口的高性能&#xff0c;在需要保存审计及操作记录的时候&#xff0c;往往有以下常见方案&#xff1a; 保存到redis数据库异步保存到mysql/mongodb/es等数据库logger打印业务日志&#xff0c;采集与展示则交由elk模块 对于第一种…