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

server/2024/12/22 15:00:25/

目录

前言

一、整体控制思路

二、代码实现

1.主函数

2.定时器回调函数

总结



前言

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

         系列文章请查看:视觉巡线小车——STM32+OpenMV系列文章


一、整体控制思路

        首先,减速电机需要以指定的速度运行,就需要用 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.2void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/*******电机控制周期,每10ms对电机控制一次*********/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为转向环的比例控制参数,可以根据小车行走的情况自行调整。


总结

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

 系列文章请查看:视觉巡线小车——STM32+OpenMV系列文章

不足之处望指正。


http://www.ppmy.cn/server/90182.html

相关文章

spring —— 全注解实现事务管理器

全注解实现事务管理,就是取消 spring-config.xml 文件,而将配置信息在配置类中实现。 配置类: package com.spring.book;import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org…

前端地位蹭蹭蹭Up!!!

作者:溪饱鱼 链接:juejin.cn/post/7283642910301192244 顺便吆喝一句,如果你本科学历,对技术大厂有向往,对前后端测试岗位有兴趣,不对大厂外包有100%的排斥,可以看看这里,薪酬待遇确…

Linux网络:传输层TCP协议(四)拥塞控制及延迟应答

目录 一、拥塞控制 二、延迟应答 一、拥塞控制 虽然 TCP 拥有滑动窗口这个大杀器机制来根据具体情况对发送的数据大小和速度进行实时控制, 能够高效并且可靠的发送大量的数据. 但是如果在双方建立好连接后的刚开始阶段就发送大量的数据。仍然可能引发一些问题. 因为同一个网…

CSS全部标签属性重置语法

简单介绍 每个浏览器默认的属性不同,像谷歌浏览器不设置的话,默认每个元素是有外边距margin的,有的浏览器列表还会带上序号,有的浏览器就没有。 所以为了让所有浏览器都一致,在写CSS开始前,我们都需要用C…

抖音矩阵管理系统解决方案:一站式服务

在当今社交媒体蓬勃发展的时代,抖音作为一款短视频平台,凭借其独特的魅力和庞大的用户群体,已成为众多企业、个人乃至网红达人展示自我、推广品牌的重要舞台。然而,随着抖音账号数量的不断增加,如何高效、专业地管理这…

(十三)Spring教程——依赖注入之工厂方法注入

1.工厂方法注入 工厂方法是在应用中被经常使用的设计模式,它也是控制反转和单例设计思想的主要实现方法。由于Spring IoC容器以框架的方式提供工厂方法的功能,并以透明的方式开放给开发者,所以很少需要手工编写基于工厂方法的类。正是因为工厂…

探索PyPDF2:Python中的PDF处理大师

探索PyPDF2:Python中的PDF处理大师 1. 背景介绍 在数字化时代,PDF文件因其跨平台的兼容性和内容的稳定性而广受欢迎。然而,处理PDF文件,如合并、分割、提取文本等,往往需要专门的工具。这就是PyPDF2库的用武之地。PyP…

巴黎奥运启幕 PLM系统助力中国制造闪耀全球

2024巴黎奥运会将于法国当地时间7月26日在塞纳河畔正式开幕。即将亮相巴黎奥运会赛场的除了中国运动员之外,还有一批批中国制造企业为奥运会设计并制造的体育设备也将惊艳亮相,成为赛场上另一道亮丽的风景线。 在新时代的浪潮中,中国制造业坚…