代码拉取完成,页面将自动刷新
该开源文件中包含两个文件夹
start_task : 新建任务
dbus_task : 遥控器数据处理任务
imu_task : 陀螺仪处理任务
led_task : 板载指示灯任务
ammo_cover_task : 弹仓盖任务
fire_task : 开火任务(包括摩擦轮和拨弹盘)
gimbal_task : 云台电机控制任务
state_task : 状态更新处理任务
steeringTop_task :上板底盘决策处理任务
get_distance_task : 自动进补给站任务
pid : pid计算算法
crc : CRC校验算法 (8位和16位)
filter : 滤波器算法 (低通和卡尔曼滤波)
imu :陀螺仪数据处理算法
my_math : 快速数学计算
can_calculate : 针对比赛的can发送算法
KeyProcess :按键处理算法
boardCtrl与gimbalCtrl使用的是同一套框架,不同的是board只需要一个控制底盘8个电机的任务,基于的算法是TDT_Alg 文件的SteeringWheel 的舵轮解算算法。
我们的舵轮结算的大前提是在4个3508电机只有一个转向,即电机只需加减速无需反向,车体整体方向由四个6020电机控制。
首先我们在上板接收到遥控器信息,将其分解为Vx Vy Vw三个向量,分别代表以云台方向为正方向的直行速度,平移速度和自旋速度。
之后是两个假设:
公式推导:
以右前轮为例:
最后化简约去后得到两条输出式:
代码为:
wheels.RF.speed = my_sqrt((my_pow(steeringPara.W_Cdistance) * my_pow(steeringSpeed.vw)) / 2 + my_pow(basePara.speedV) + (steeringPara.wheelbase * basePara.sinAlpha - steeringPara.wheeltrack * basePara.cosAlpha) * steeringSpeed.vw * basePara.speedV);
wheels.RF.angle = (PI / 2) - atan2((2 * basePara.speedV * basePara.cosAlpha - steeringPara.wheeltrack * steeringSpeed.vw), (2 * basePara.speedV * basePara.sinAlpha + steeringPara.wheelbase * steeringSpeed.vw));
其中要注意的是atan2函数的使用方法
1.该舵轮算法在车体急转向时没有做角度的圆滑过渡处理以至于,急转向时由于重心高车体会侧倾。目前有的优化思路是根据当前速度和需要转向的角度做角度的过渡曲线,牺牲一些对角度的相应速度来让操作手有更好的开车体验。
2.对于四个轮子的正方向确定没有传感器或机械装置进行校准以至于在车体旋转时可能会有较大内耗。
3.在舵轮由自旋运动切换平移运动时能量的损耗较大,会使动作不平滑,可以在动能转化之间加上优化函数,提高能量的利用率。
4.陀螺仪一方面是陀螺仪数据异常保护,另外应该尝试陀螺仪温控,可以有效减小零飘。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。