开源! ROS2阿克曼开发平台方案

0、前言

0.1、项目背景:

为了满足更多的同学可以快速低成本高兼容性的搭建自己的阿克曼ROS2开发平台,所以出现本开源项目。

温馨提示:本次开源的硬件和软件是完全兼容差速和阿克曼方案的,也就是说你如果要做差速,更改机械部分之后,只需要改极少的配置文件就可以做到兼容。

开源项目发布方:小白学移动机器人

开源项目的内容:机械模型、底层驱动板PCB、底层驱动程序、ROS2部分功能包(启动功能包,描述功能包)等等。

项目文件结构如下:

0.2、开源项目的总体方案:

0.3、开源项目的总体架构:

0.4、开源项目的底层控制方案:

1、机械模型呈现

详见:1.阿克曼小车机械模型文件

这里机械板材的设计做了高兼容性:

  1. 核心板安装兼容:树莓派、香橙派3LTS、jetson nano
  2. 雷达兼容:RPLIDAR A1M8、乐动LD14、乐动LD19

左视图如下:

俯视图如下:

2、硬件方案介绍

详见:2.阿克曼小车硬件方案介绍

2.1、底层驱动板

功能模块设计如下:

主控电路板PCB如下:

12V-5V 5A 电源板如下:

2.2、核心板(香橙派3LTS)

开发板功能如下图:详见:官网:http://www.orangepi.cn/

3、底层驱动程序工程文件

详见:4.底层驱动程序工程文件

程序很简单,需要的同学可以自己看一下。

如果仍存在问题,可以参考我的系列博客文章解答你的问题。

博客链接:https://blog.csdn.net/zhao_ke_xue/article/details/108138981

博客详细的讲解的每一个控制模块的内容,如下所示:

部分主流程代码如下:

#include "sys.h"

/*===================================================================
程序功能:ROS小车底层代码(全部) 差速底盘和阿克曼底盘通用
程序编写:公众号:小白学移动机器人
其他    :如果对代码有任何疑问,可以私信小编,一定会回复的。
=====================================================================
------------------关注公众号,获得更多有趣的分享---------------------
===================================================================*/
int main(void)
{ 
	//发送计数
	char sendCount=0;
	
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁用JTAG 启用 SWD
	
	MY_NVIC_PriorityGroupConfig(2);	//=====设置中断分组
	
	delay_init();	    	        //=====延时函数初始化
	LED_Init();                     //=====LED初始化    程序灯	
	BEEP_Init();                    //=====蜂鸣器初始化,异常报警
	
	usart1_init(115200);	        //=====串口1初始化  树莓派通信
	usart3_init(115200);            //=====串口3初始化  蓝牙,控制和调试

	IIC_Init();                     //=====IIC初始化    读取MPU6050数据
	MPU6050_initialize();           //=====MPU6050初始化	
	DMP_Init();                     //=====初始化DMP 

	Encoder_Init_TIM3();            //=====初始化右轮编码器接口
	Encoder_Init_TIM4();            //=====初始化左轮编码器接口
	
	MY_ADC_Init();                  //=====adc初始化    电池电量检测
	
	Motor_PWM_Init(7200-1, 1-1);    //=====初始化PWM 10KHZ(AT8870),用于驱动电机 
	Steer_PWM_Init(60000-1, 24-1);  //=====初始化PWM 50HZ,用于驱动舵机

	PID_Init();                     //=====PID初始化
	
	MBOT_EXTI_Init();               //=====MPU6050 5ms定时中断初始化

	while(1)
	{
		//给树莓派发送速度,角度,这里速度已经乘以1000,角度(0.0-359.0)乘以50
		if(sendCount==0)//发送  14.4ms  发送一次数据 70Hz 左右
		{
			//发送需要一定的延时
			usartSendData(USART1,(short)leftSpeedNow,(short)rightSpeedNow,(short)(yaw*50),sendCtrlFlag);  //1ms
			//蓝牙调试时用,不调试注释
			// pcShow();                                                           //2.2ms单个float数据
			sendCount++;
		}
		else
		{
			sendCount++;
			if(sendCount==25)
				sendCount=0;
		}
		//获取角度		
		getAngle(&yaw,&yaw_acc_error);                                                     
	} 
}

//中断服务函数
void USART1_IRQHandler()
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
 	 {
		 USART_ClearITPendingBit(USART1,USART_IT_RXNE);//首先清除中断标志位
		 usartReceiveOneData(USART1,&leftSpeedSet,&rightSpeedSet,&frontAngleSet,&receCtrlFlag);
	 }
}

中断主流程代码如下:

/**************************************************************************
函数功能:所有的控制代码都在这里面
          5ms定时中断由MPU6050的INT引脚触发		
**************************************************************************/
void EXTI9_5_IRQHandler(void) 
{                                                         
	EXTI_ClearITPendingBit(EXTI_Line8);                             //===清除LINE8线路挂起位		
	
	Led_Flash(200);                                                 //===LED闪烁,证明程序正常运行	
	
	yaw_acc_error += FIVE_MS_ERROR;								    //===yaw漂移误差累加
	
	Get_battery_volt_average(&Voltage,100);		                    //===电池电压测量,单位mv,100次取一次平均
	
	Get_Motor_Speed(&leftSpeedNow,&rightSpeedNow);                  //===获取左右轮子真实速度
	
	pid_Task_Letf.speedSet  = leftSpeedSet;	                        //===给速度设定值和实时值赋值
	pid_Task_Right.speedSet = rightSpeedSet;
	pid_Task_Letf.speedNow  = leftSpeedNow;
	pid_Task_Right.speedNow = rightSpeedNow;
	
	Pid_Ctrl(&motorLeft,&motorRight);                               //===执行PID控制函数
	Steer_Ctrl(frontAngleSet,&motorFrontSteer);                     //===执行舵机,差速小车无需修改完全兼容

	if(Turn_Off(Voltage) == 0)                                      //===如果电量异常低
	{	
		BEEP_Disable();                                             //===正常情况,蜂鸣器失能 
		Set_Pwm(motorLeft,motorRight,motorFrontSteer);              //===赋值给PWM寄存器 		
	} 	  
	else
	{
		BEEP_Flash(20);                                            	//===电量报警
	}
} 

4、机械模型转URDF模型文件

详见:5.机械模型转URDF模型文件介绍

rviz显示如下图:

5、阿克曼结构运动模型详解

详见:6.阿克曼结构运动模型详解

6、阿克曼ROS2相关功能包

详见:7.ROS2相应功能包

.
└── src
    ├── mbot_bringup        # 机器人启动功能包 和 底层单片机通信、发布里程计、tf、订阅控制话题
    ├── mbot_description    # 机器人描述功能包,机械模型转的urdf
    └── sllidar_ros2-humble # RPLIDAR A1M8 的ROS2驱动

程序很简单,需要的同学可以自己看一下。

7、系统配置以及功能包启动说明

详见:8.系统配置以及功能包启动

8、总结

如果你觉得本开源项目还不错,可以积极的分享到你的同学、朋友。

开源项目github地址获取:在小白学移动机器人,发送:ROS2阿克曼,即可获取。

如果你感觉,我的文章比较适合你,关注我,点个赞,给你不一样的惊喜。

ROS阿克曼小车代码开源是指ROS机器人操作系统)针对阿克曼小车(Ackermann car)的代码,以开源的方式提供给公众进行自由使用和修改。阿克曼小车是一种具有特殊驱动方式的机器人车辆,通过前轮转动实现转弯,能够很好地适应曲线道路。开源代码的提供将极大地促进阿克曼小车在各个领域的应用与研发。以下是我对ROS阿克曼小车代码开源的一些理解和解释。 首先,ROS阿克曼小车代码开源将为机器人开发者提供一个便捷的开发平台。由于阿克曼小车具有独特的运动机理,其控制算法和驱动代码相对较为复杂。开源代码的提供将大大降低了开发者的学习和开发成本,使得更多的人可以参与到阿克曼小车的开发工作中。此外,开源代码还可以激发创新思维,促进代码的优化和改进,提高阿克曼小车在各个应用场景下的性能。 其次,ROS阿克曼小车代码开源还有助于促进行业技术的共享和交流。在开源社区中,开发者可以分享自己的代码和经验,从而互相学习和进步。通过在ROS平台开发和测试阿克曼小车代码,开发者们可以共同解决遇到的问题和挑战,共同推动行业发展。此外,开放的代码还可以鼓励不同机构之间的合作,促进技术和资源的共享,形成合力,加速阿克曼小车技术的进步与应用。 最后,ROS阿克曼小车代码开源还有利于推动教育和培训领域的发展。开源代码的提供使得教育机构和培训机构可以基于ROS平台进行阿克曼小车相关课程的设计和开展。学生和培训人员可以通过参与实际的开发和项目实践,提升自己的技术水平和实践能力。此外,开源代码还为学术研究提供了一个良好的基础,研究者们可以在此基础上进行算法研究和实验验证,推动相关领域的学术进展。 总之,ROS阿克曼小车代码的开源将有助于推动阿克曼小车的应用与研发,在机器人领域发挥重要的促进作用。它为开发者提供了便捷的开发平台,并促进了行业技术的共享和交流,同时也推动了教育和培训领域的发展。通过众多开发者的共同努力,相信阿克曼小车的应用前景将更加广阔。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶-清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值