目录
前言
通过以上三篇文章已将基本条件实现,本文将结合以上内容,进行综合控制,实现小车的视觉巡线功能。
一、整体控制思路
首先,减速电机需要以指定的速度运行,就需要用 PID 控制算法对减速电机的速度 进行控制,即速度环。其次,根据机器人中心线与黑线的偏差,再通过 PID 控制算法控 制调整左右减速电机的速度,进而控制机器人的转向,即转向环。因此,速度环为内环 控制,转向环为外环控制,而外环控制一般只需要用比例P控制即可。如下图:
二、代码实现
1.主函数
由于电机是按照一定的频率进行控制,所以主函数不进行电机的控制,而PID参数调试已完成,该上位机已不再使用,故主函数不做其他处理。
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_TIM3_Init();
MX_TIM4_Init();
MX_USART2_UART_Init();
MX_USART3_UART_Init();
/* USER CODE BEGIN 2 */
__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);
protocol_init();//PID上位机调试助手协议初始化。
HAL_UART_Receive_IT(&huart2,&OpenMV_Buf,1);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim4, TIM_CHANNEL_ALL);
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,0);
__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,0);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// printf("hello\n");
// receiving_process();
}
/* USER CODE END 3 */
}
2.定时器回调函数
该部分为整体控制的核心,速度采集、PID运算、电机控制等都在这里进行。
#define OpenMV_Kp 1.2
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/*******电机控制周期,每十秒对电机控制一次*********/
if(htim->Instance == TIM2 )
{
motorA.speed = get_speed_motorA();
motorB.speed = get_speed_motorB();
motorA.S += motorA.speed;
motorB.S += motorB.speed;
// int Speed = motorA.speed;
// set_computer_value(SEND_FACT_CMD, CURVES_CH1,&Speed , 1); // 给通道 1 发送实际值。
motorA.Target_Speed = base_speed - rho_org * OpenMV_Kp;
motorB.Target_Speed = base_speed + rho_org * OpenMV_Kp;
motorA.out = pid_control(motorA.speed,motorA.Target_Speed,200,18,15);
motorB.out = pid_control(motorB.speed,motorB.Target_Speed,200,18,15);
Load(motorA.out, motorB.out);
}
}
这里只使用了 像素点偏差进行控制,未用角度偏差。其中OpenMV_Kp为转向环的比例控制参数,可以根据小车行走的情况自行调整。
总结
至此,视觉巡线小车的基本内容已全部完成。当然这只是一个基本的雏形,其中视觉处理部分可以根据自己情况进一步优化,同时控制思路也可以适当调整。小车功能很单一,只是简单地进行视觉巡线,其他更多功能可以自行丰富。
不足之处望指正。