阿克曼车型运动解算——基于智能车竞赛C车模

作者:xnjust、ycznjust

前言:本人在十六届智能车竞赛现场失误果断白给,后来校赛的时候补上遗憾,“不小心”搞出“漂移算法”,大家在我B站那边看的还挺乐呵,有两个小伙伴后台问阿克曼车型该怎么写这个运动解算的东西,毕竟C车模还是屁股上面俩电机,不是机械式的差速器,不搞差速的话基本上是没法搞。现在毕业之后的社畜去处也定好了,就抽点时间填坑,各位不要再说我是鸽子了,鸽子也是要脸的。

综述:智能车竞赛的C车模还是一款不错的车模,两个后轮通过两个电机直接驱动,前桥通过舵机进行驱动,前桥的转向效果比较真实,内侧轮和外侧轮角度是由一定的差值的,因此不可以把C车模照着众多的CSDN帖子简化成“单车模型”,毕竟大家估计都是冲着通过舵机打角计算后轮差速来的,估计困惑大家的都是这个问题。CSDN上面很多帖子都是“单车模型”或者是“曲率控制”,要么就是不管差速,要么就是默认大家都是摄像头的车子,觉得大家都可以想办法拿到曲率,这不直接耍流氓,咱们这个帖子就是从电磁车出发,想办法通过舵机打角计算出后轮差速,个人水平有限,欢迎各位大佬指出问题,方便我改正问题:B站UID:26149458 B站艺名:找寻着你呐

问题一:如何获得阿克曼车型的后轮差速?

    大家在做智能车的过程中,肯定会先做电机闭环,然后闭环做好之后,肯定会用全局变量什么的指定车轮的固定速度,走直线的时候可以直接用这个速度指定左右两轮的速度,但问题是转弯的时候怎么办,大家肯定做过两轮车,转弯肯定要差速,阿克曼的肯定也是要用差速,但是这个差速该怎么差速?这个差速和舵机打角有什么关系?

    那么我们先来解决差速该怎么差速这个问题:

    首先放个图:

    图中的标识相信大家很容易就能看明白,通过以上符号,再运动初中数学,大家肯定可以很容易列出以下基本公式:

    通过图片大家可以看到,阿克曼车型在转弯的时候,其实是在做圆周运动,这个圆心呢就和别人帖子里写的这个曲率有关,那么我们现在思考一下,这个圆心和后轮在一个轴上面,要做圆周运动,那是不是就代表了,两个轮子的角速度其实应该是一致的,那么既然角速度一致,是否就可以根据初中物理的圆周运动知识知道一下公式:

    假设我们设置的速度是两轮中心的速度,那么有:

    那么很容易就可以得到两轮的速度:

    现在看这个式子,我们的差速是不是自然而然就可以拿到了,但是还有一个问题,就是这个R,这个R也就是关乎其他博主说的曲率,关于这个我们继续讨论。

问题二:R或者曲率怎么拿到?

    大部分博主都在说,用摄像头,多点法或者两点法拿到曲率,但是还有广大的同志是电磁车啊喂,电磁车就是通过电磁信号获得当前的偏差,然后用PID或者别的方法,算出一个舵机的打角,那么我们怎么通过打角来计算出后轮的差速呢?

    照旧,还是先贴一张图:

         此处需要注意一个问题,图中的L4标注错误,L4应该是红色的臂长

        该图是简单模拟C车上由舵机驱动的前桥,图中的M还有T还有L4,都是前桥中机械结构中的已知参数,大家可以自己测量一下,通过上下的对比图不难得出以下公式和结果:

该公式是错误版本,对应的是图中L4的错误标注

   根据L4的正确标注,正确公式应该参照如下公式

tan\beta =\frac{L_{3}}{\sqrt{(L_{4})^{2}-(L_{3})^{2}}}

同理可得左边的α角,那么如何得到R呢,我们回头看第一张图的公式:

    此时α和β都知道了,就可以带入上式,算出R,然后就可以算出后轮的实际速度了!

小结:不知道各位看官都看明白没有,如果看明白了,请给俺的B站点点关注走一走,因为我老是和实验室的大伙儿攀比粉丝数量

B站跳转链接:找寻着你呐的个人空间_哔哩哔哩_bilibili

  • 48
    点赞
  • 395
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
阿克曼转向模型是用于汽车转向控制的模型,它假设车轮转向时,车辆的前轮是一个整体,而后轮是分开转动的。在阿克曼转向模型中,前轮的转向角度和车速已知,需要求后轮的转向角度差以实现车辆的转弯。 根据阿克曼转向模型,可以推导出后轮转向角度差与前轮转向角度、车轴距(车轮轴之间的距离)和转弯半径之间的关系。具体公式如下: $$\delta_{R} = \tan^{-1}\left(\frac{L}{R+\frac{W}{\tan\delta_{F}}}\right) - \tan^{-1}\left(\frac{L}{R-\frac{W}{\tan\delta_{F}}}\right)$$ 其中,$\delta_{R}$表示后轮转向角度差,$\delta_{F}$表示前轮转向角度,$L$表示车轴距,$W$表示车轮轴距。 接下来,我们可以使用C语言实现以上公式: ```c #include <stdio.h> #include <math.h> #define DEG2RAD(x) ((x)*M_PI/180.0) // 将角度转换为弧度 int main() { double delta_F = DEG2RAD(30.0); // 前轮转向角度,单位为弧度 double L = 2.5; // 车轴距,单位为米 double W = 1.5; // 车轮轴距,单位为米 double R = 10.0; // 转弯半径,单位为米 double delta_R = atan(L / (R + W / tan(delta_F))) - atan(L / (R - W / tan(delta_F))); printf("后轮转向角度差为%.2f度\n", delta_R / M_PI * 180.0); return 0; } ``` 在上述代码中,我们使用了C语言的`atan()`函数来计算反正切值,`M_PI`是C语言提供的宏定义,表示圆周率$\pi$。运行程序,可以得到后轮转向角度差为$-17.20$度。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值