1.36kg融脑格斗机器人建造日志(0) ——缘起

挺早就有做融脑的想法了,只是捉急的行动力外加拖延癌让想法始终停留在txt阶段。加入同道也算是个契机了,一方面跟着学到不少,另一方面也相当于某种动力,制造出自己的第一台1.36车,到赛场上横扫千军,还有什么比这更加动人心魄呢

1. 想法

已经不记得最初是从哪里知道融脑这种机器人构型的,只是知晓了它的攻击方式之后一下子就被吸引住了,尽管自己是倾向于做非动能控制类车的,但是融脑实在太有意思了,她简洁,周身上下只有一个车壳和两侧行驶,全无花哨的前铲和贴地游戏;直白,旋转车身撞击这种最原始而纯粹的攻击手段,同时也是行进的方式;没有难以克服的反扭和陀螺仪效应;不会因为叉子被打翘而任人宰割;即使是最坚固的甲胄也难以抵御满功率运转的融脑全力一击。或许溢美之词有些夸大,但融脑开发的计划却在不经意间便深植心中,只等一个机会便可破土而出。

起初手头被一些琐事烦扰,220g的几辆车都亟待加工,而平时时间又有限,难以全身心投入进去。幸而得一偶然机会结识同道中人战队,进入了一个崭新的圈子。一点点了解到1.36机器人的设计制造,突然间觉得,自己做一台仿佛也不是那么遥不可及了,一如曾几何时入坑220一样,就这么一点一点食髓知味,不知不觉踏上了一条造车的不归之路……

提到融脑的想法之后便开始考虑实现的方案。难点无疑在于如何一边自转一边移动。一开始想的是简单的电机同向旋转+反向旋转控制信号叠加而已,利用陀螺仪检测车身实时角度,在车身朝向正确时提供一点同向的动力,其他时候提供反向旋转的动力。然而在了解器件的性能之后便意识到这样想的实在太简单,因为陀螺仪无论是测量加速度还是测量角速度,其量程都极其有限,况且在那种剧烈震动和冲击的环境中,陀螺仪的稳定性早已难以保证,使用陀螺仪完全无法满足要求。好在网上能找到不少开源方案。b站上的教学视频讲解了融脑的运行原理,同时提到了open melt的开源方案。既然前人已经造好轮子了,当然要去研究一下。

2. 开源方案

open melt上面的方案看过一遍之后顿时有种李逵使连环计的感觉,粗暴中透露着一丝惊为天人。融脑的核心在于实时获取车身角度,而最容易想到的陀螺仪又不可靠,于是方案使用了一个加速度计来取代;高量程加速度计测出向心加速度之后很容易就能计算出当前的车身转速,然后根据转速算出旋转周期来,以周期为单位,完成电机的换向。简单描述一下就是,确定车子需要运动的方向,选定一个车身参考方向(通常是车身中轴线),当车身参考方向和目标前方垂直的时候,此时轮轴和目标方向重合,两轮一前一后;前轮不转,后轮转,车身相当于以前轮为中心绕轴转动,直到转过180°,此时再次出现轮轴和目标前方重合的情况,但前后轮和上半周期相反,于是再次前轮不转后轮转,再次车身转过180°后,一个运动周期完成。这个方案确实比之前自己想的更加科学合理一点。当然理论如此,实际操作的时候肯定不会这么简单粗暴,比如电机停止到全速运动肯定不可能在车身旋转的那么短时间内完成,因此实际表现出来的应该是两侧电机在不断轮流加速减速,交替完成半周期运动,以此让车身延目标前方运动。目标前方的角度可由遥控器给出。一般用led灯来指示前方。
融脑工作原理视频教程

3. 算法验证

知道了基本的方案,就想照着试一下。拿了个被拆废的220车壳,4个n20电机直驱4轮,陀螺仪获取车身角度,主要验证融脑运动方式。

void Robot_Move_Melty_Brain(float dirValueIn,float mpuYawData,int16_t pwmOut[3])
{
	//车身顺时针转,yaw值0~180,突变到-180,再加到0再到180
	//车身角度和前进方向夹锐角的时候,左轮加速,钝角的话右轮加速
	int pwm = 0;
	if(fabs(dirValueIn - mpuYawData)<=90)//两向量夹锐角且不分布于y负半轴2侧,无需处理
	{
		pwmOut[2] = 1;
		pwmOut[0] = 1000;
		pwmOut[1] = 1000 - 10*(90 - fabs(dirValueIn - mpuYawData));
//		pwmOut[1] = -pwmOut[1];
//		AnoTc_SendUserTest(dirValueIn,mpuYawData,0);	
	}
	else if(fabs(dirValueIn - mpuYawData) < 270)//两向量夹钝角且不分布于y负半轴2侧,此时输入或者输出反向,倒车
	{
		
		if((mpuYawData < -90)||(mpuYawData > 90))//优先反向位于三四象限的矢量,否则反向完之后可能会变成下一个else的条件
		{
			pwmOut[2] = -1;
			if(mpuYawData>=0)
			{
				
				mpuYawData = mpuYawData - 180;
			}
			else
			{
				mpuYawData = mpuYawData + 180;
			}				
		}
		else
		{
			pwmOut[2] = -1;
			dirValueIn = (dirValueIn>=0)?(dirValueIn - 180):(dirValueIn + 180);
		}
		
		pwmOut[0] = 1000 - 10*(90 - fabs(dirValueIn - mpuYawData));
		pwmOut[1] = 1000;
//		pwmOut[1] = -pwmOut[1];
//		AnoTc_SendUserTest(dirValueIn,mpuYawData,100);
	}
	else //两向量夹锐角且分布于y轴负半轴两侧,两向量皆反向操作
	{
		pwmOut[2] = 1;
		dirValueIn = (dirValueIn>=0)?(dirValueIn - 180):(dirValueIn + 180);
		mpuYawData = (mpuYawData>=0)?(mpuYawData - 180):(mpuYawData + 180);

		pwmOut[0] = 1000;
		pwmOut[1] = 1000 - 10*(90 - fabs(dirValueIn - mpuYawData));
//		pwmOut[1] = -pwmOut[1];
//		AnoTc_SendUserTest(dirValueIn,mpuYawData,200);
//		printf("A%f\r\nB%d\r\nC%d\r\n",curError,pwm,200);

//		dirValueIn = (dirValueIn<=0)?(dirValueIn + 180):(dirValueIn - 180);
//		mpuYawData = (mpuYawData<=0)?(mpuYawData + 180):(mpuYawData - 180);			
	}
}

这里融合了之前无头模式的运动解算方法,分成3类讨论。其实就是按照方案写的。
这一套算法试下来,直线运动效果还可以。于是乎基础的算法框架就这么有了,剩下的就是调试加速度计来获取车身角度了。听上去很简单。不是么。

4. 古早的图纸

和某只汉堡头脑风暴过后采用了古早的一版图纸作为加工测试方案。当时懵懂无知的自己完全不知道这个图纸藏了多少坑。反正就是各种结构和设计不合理,也难怪,融脑本身结构简单,不需要什么复杂的装配,拿来练手很合适了,不过如果真的按照这个图纸加工的话,还是有不小的问题的。无奈只好在此基础上重新设计了一版图纸,保留了原来电机传动打印件轮的设计,对称构型,电控系统的选型都按原来的设计。上下钛板去掉了,直接用tpu外壳。因此整车的外表就显得朴实无华,甚至有些简陋。不过融脑本身也不以精妙的结构见长,控制算法才是核心。

5. 摇光之名

给自己的第一台1.36车起个什么名字耗费了不少心神。要能形神兼备,又具有内涵的美感,最好还能出一个系列;最后在星辰系列和神话神器系列中选择了星辰——摇光。

摇光,北斗斗柄最末端的一颗星星。经年累月为世人只因前进的方向。长夜漫漫,高悬夜空中闪耀,一如车身上的led灯,熠熠生辉中标注了纵横方圆。摇光对应破军星君,破军主杀伐,是军队中的敢死队、先锋队,冲锋陷阵,以取得胜利为目的,但自身之危险性亦大,损兵折将,在所不免。融脑不正是这样的一匹不羁的烈马吗,在方寸之地横冲直撞,即使以自身遍体鳞伤为代价,也要舍身一击,马革裹尸而还,张扬恣肆,潇洒绝伦!哪怕在同道战队长于以柔克刚的控制,亦不可不为摇光之浪漫而动容!(扯远了

总之,摇光的名字就这么定下来了。整个星辰系列毫无疑问是大有可为的,宇宙四海皆可脑洞。希望以小小的一颗摇光星作为起点,登上苍穹之下的殿堂!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libfastcommon-1.36是一个开源的快速共享存储库,它提供了一些高性能的C/C++函数库,用于实现分布式文件系统或分布式共享存储系统。这个库的设计旨在提供高效的共享存储方案,使开发人员能够轻松地构建可扩展的存储系统。 libfastcommon-1.36具有以下主要特点: 1. 高性能:该库使用了一些高效的算法和数据结构,提供了快速和可靠的数据传输、存储和管理功能。这使得它在处理大量数据时能够保持出色的性能。 2. 可扩展性:该库支持分布式存储架构,可以轻松地扩展到多个节点和服务器。它提供了一套灵活的API和接口,使系统开发人员能够根据自己的需求定制和扩展存储方案。 3. 可靠性:libfastcommon-1.36的设计目标之一是提供高度可靠的数据存储和管理解决方案。它采用了一些错误检测和纠正机制,以确保数据的完整性和一致性。 4. 易于使用:该库提供了简单且易于使用的API,使开发人员能够快速地开始使用和集成该库。它还提供了详细的文档和示例代码,以帮助开发人员更好地理解和使用该库。 总而言之,libfastcommon-1.36是一个功能强大、高性能、可扩展和可靠的开源共享存储库。它为开发人员提供了一个简单且灵活的解决方案,用于构建分布式存储系统或分布式文件系统。无论是小型还是大型项目,使用该库都能够获得高效和可靠的存储解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值