视觉巡线小车——STM32+OpenMV(四)

目录

前言

一、整体控制思路

二、代码实现

1.主函数

2.定时器回调函数

总结



前言

        通过以上三篇文章已将基本条件实现,本文将结合以上内容,进行综合控制,实现小车的视觉巡线功能。


一、整体控制思路

        首先,减速电机需要以指定的速度运行,就需要用 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为转向环的比例控制参数,可以根据小车行走的情况自行调整。


总结

至此,视觉巡线小车的基本内容已全部完成。当然这只是一个基本的雏形,其中视觉处理部分可以根据自己情况进一步优化,同时控制思路也可以适当调整。小车功能很单一,只是简单地进行视觉巡线,其他更多功能可以自行丰富。

不足之处望指正。

相关推荐

  1. STM32——智能小车

    2024-07-21 16:46:04       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 16:46:04       142 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 16:46:04       156 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 16:46:04       129 阅读
  4. Python语言-面向对象

    2024-07-21 16:46:04       141 阅读

热门阅读

  1. WHAT - 贪心场景和算法实现

    2024-07-21 16:46:04       31 阅读
  2. 多级联动jquery-cxselect-js的使用

    2024-07-21 16:46:04       30 阅读
  3. 使用"山水博客"的排序功能制作"专题文章"

    2024-07-21 16:46:04       24 阅读
  4. C# Word转换HTML(附在线转换工具)

    2024-07-21 16:46:04       31 阅读
  5. memset函数使用原理及用例

    2024-07-21 16:46:04       24 阅读
  6. web前端 React 框架面试200题(一)

    2024-07-21 16:46:04       24 阅读
  7. Kali Linux渗透测试

    2024-07-21 16:46:04       28 阅读
  8. 【LeetCode 0338】【位运算/递归式】求比特位

    2024-07-21 16:46:04       22 阅读
  9. 使用scikit-learn进行机器学习:基础教程

    2024-07-21 16:46:04       30 阅读
  10. 机器学习 -逻辑回归的似然函数

    2024-07-21 16:46:04       22 阅读
  11. oracle 11G long类型如何转换 CLOB

    2024-07-21 16:46:04       23 阅读