硬核,这年头机器人都开始自学“倒车入库”了

简介: 硬核,这年头机器人都开始自学“倒车入库”了

目录

0 前言

本文基于差速轮式机器人模型做一个运动学应用,即控制机器人两轮的速度差改变其运动轨迹,使机器人完成一个倒车入库的动作。


image.png

仿真效果动图如下所示,看完本文相信你也可以做到!(文末有实际机器人运行效果图!)

1ff5e307609f44aaba912249a5bb0c81.png

1 什么是差速轮式机器人?

差速轮式机器人轮式机器人的一种,如下图所示。其特点是:两轮只有绕轴的旋转运动,而没有其他速度分量,因此这种机器人不能横向运动,想象家里的扫地机,路上开的汽车,他们都是差速结构,因此都不能“横着开”!什么样的机器人可以横着开?这个需要装配麦克纳姆轮,以后有机会再说。


image.png

2 差速轮式机器人的运动学方程

差速轮式机器人的运动学方程如下:

p ˙ = [ x ˙ y ˙ θ ˙ ] = [ cos ⁡ θ 0 sin ⁡ θ 0 0 1 ] [ v ω ] = S ( q ) u \boldsymbol{\dot{p}}=\left[

x˙y˙θ˙

x˙y˙θ˙

\right] =\left[

cosθsinθ0001

cos⁡θ0sin⁡θ001

\right] \left[

\right] =S\left( \boldsymbol{q} \right) \boldsymbol{u}

p

˙


=


 

x

˙

y

˙


θ

˙


 


=


 

cosθ

sinθ

0


 

0

0

1


 


[

v

ω


]=S(q)u


本文不推导晦涩的公式,这里写出来只是为了编程。

3 开始编程实现

3.1 机器人轨迹控制

首先,我们要确定两个位置,一个是车位位置ref,一个是车的当前位置p

% 车位
xRef = ref(1);
yRef = ref(2);
thetaRef = ref(3);
% 车
x = p(1);
y = p(2);
theta = p(3);

接着,我们要计算二者的误差

% 误差
xErr = cos(theta) * (xRef - x) + sin(theta) * (yRef - y);
yErr = -sin(theta) * (xRef - x) + cos(theta) * (yRef - y);
thetaErr = thetaRef - theta;

然后我们期望把误差降低

% 参数
Kpx = 3
Kpt = 3
% 轮子的线速度和角速度
v = Kpx * sqrt(xErr^2 + yErr^2);
w = Kpt * thetaErr;

接触过控制理论的同学一定能看出这就是个P反馈控制器。接着把这个增量反馈出去

dpdt = [v*cos(theta); v*sin(theta); w];

然后把这个函数封装成ode45的被调函数,让Matlab帮我们迭代计算即可。

3.2 画车位和车

车位很简单,就是三条直线

annotation('line', [0.53,0.53], [0.35,0.5], 'Color','k');
annotation('line', [0.63,0.63], [0.35,0.5], 'Color','k');
annotation('line', [0.53,0.63], [0.35,0.35], 'Color','k');

车可以按喜好画成各种样子,本文用箭头表示车的方向。

arrow = quiver(x, y, endPt(1) - x, endPt(2) - y, ...
       'MaxHeadSize',5.5,'AutoScaleFactor',1,'AutoScale','off', 'LineWidth', 1.5, 'color', color, ...
       'Marker', 'o', 'MarkerSize', 4, 'MarkerFaceColor',color);

效果如下


image.png

加点难度,把车位斜过来,也表现的很好!


image.png

3.3 制作动图

接着看看如何制作Matlab演示动画,下面是完整代码

figure(1)
stableProcess = VideoWriter('video/stableProcess.avi');
open(stableProcess);
movie = moviein(t);
% 画车位
annotation('line', [0.5,0.5], [0.2,0.3], 'Color','k');
annotation('line', [0.63,0.63], [0.2,0.3], 'Color','k');
annotation('line', [0.5,0.63], [0.2,0.2], 'Color','k');
% 画目标位置
plotPose(refPos);
grid on
hold on
% 画初始位置
handler = plotPose(initPos);
for i=1:length(t)
    delete(handler);
    handler = plotPose(actualPos(i,:));
    plot(actualPos(i,1), actualPos(i,2), 'Marker', '.', 'color', [0,0.5,0]);
    movie(:, i) = getframe;
    writeVideo(stableProcess, movie(:, i));
end
hold off
close(stableProcess);

4 真车实战

因为限制动图大小为5M内,下面的实例抽调了大部分帧。

image.png

🔥 更多精彩专栏

目录
相关文章
|
3月前
|
JavaScript 小程序 Java
基于Java的高校宣讲会管理系统设计与实现(亮点:选题新颖、功能实用、老师看见直接过!)
基于Java的高校宣讲会管理系统设计与实现(亮点:选题新颖、功能实用、老师看见直接过!)
22 0
|
3月前
|
JavaScript 小程序 Java
基于Java的大学生线上心理咨询系统(亮点:在线预约、在线咨询、留言回复)
基于Java的大学生线上心理咨询系统(亮点:在线预约、在线咨询、留言回复)
67 0
|
3天前
|
数据采集 NoSQL 搜索推荐
五一假期畅游指南:Python技术构建的热门景点分析系统解读
五一假期畅游指南:Python技术构建的热门景点分析系统解读
|
28天前
|
存储 文件存储 C语言
《C语言程序设计》课程设计 -- 火车票票务管理系统
《C语言程序设计》课程设计 -- 火车票票务管理系统
23 1
|
1月前
|
存储 SQL 关系型数据库
校园二手商品交易系统的设计与实现(论文+源码)_kaic
校园二手商品交易系统的设计与实现(论文+源码)_kaic
|
3月前
|
JavaScript 小程序 Java
基于Java的高校实习管理系统设计与实现(亮点:实习记录、实习打分、实习作业,功能新颖、老师没见过、当场唬住!)
基于Java的高校实习管理系统设计与实现(亮点:实习记录、实习打分、实习作业,功能新颖、老师没见过、当场唬住!)
54 0
|
4月前
|
编解码 算法 Linux
武汉光庭公司地图引擎开发工程师24秋招三场面试完整流程
武汉光庭公司地图引擎开发工程师24秋招三场面试完整流程
|
9月前
|
存储 人工智能 文字识别
高考志愿填报指南:使用AI阅读工具ChatDOC搭建专业、好用、免费的AI高考志愿填报系统
针对高考志愿填报,这篇文章能为你提供以下内容:高考志愿填报专业数据、高考志愿填报分析思路、专业 AI 工具分析示范。
317 0
|
9月前
|
小程序 安全 图形学
课程设计项目——基于3D建模技术的车位在线销售平台(序言)
课程设计项目——基于3D建模技术的车位在线销售平台(序言)
|
11月前
|
存储 负载均衡 前端开发
一文读懂「福气乐园 3D版」开发全流程
一文读懂「福气乐园 3D版」开发全流程
137 0