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

目录

前言

一、整体控制思路

二、代码实现

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)
{
/*******电机控制周期,每十秒对电机控制一次*********/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.mzph.cn/web/49016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【轨物方案】电表红外抄表物联网装置

对于光伏运维工程师来说,电表抄表是一件并不陌生的工作,不过很多并网电表的RS485通讯接口一般都被占用了,并且电表的外壳也被铅封起来。在这种情况下电站通常采用人工抄表的方式采集电量数据,这种方式费时费力,对电站运…

京东科技集团将在香港发行与港元1:1挂钩的加密货币稳定币

据京东科技集团旗下公司京东币链科技(香港)官网信息,京东稳定币是一种基于公链并与港元(HKD) 1:1挂钩的稳定币,将在公共区块链上发行,其储备由高度流动且可信的资产组成,这些资产安全存放于持牌金融机构的独立账户中,通…

【OpenCV C++20 学习笔记】扫描图片数据

扫描图片数据 应用情景图像数据扫描的难点颜色空间缩减(color space reduction)查询表 扫描算法计算查询表统计运算时长连续内存3种扫描方法C风格的扫描方法迭代器方法坐标方法LUT方法 算法效率对比结论 应用情景 图像数据扫描的难点 在上一篇文章《基…

OAK-FFC 分体式相机使用入门介绍

概述 OAK FFC 主控板和多种可选配镜头模组非常适合灵活的搭建您的3D人工智能产品原型。由于镜头是分体式的,因此你可以根据需要测量的距离,自定义深度相机安装基线,并根据你的项目要求(分辨率、快门类型、FPS、光学元件&#xff…

FPGA教程|零基础到实战的全方位指导

在数字化时代,FPGA(现场可编程门阵列)作为一种灵活的硬件编程平台,正逐渐成为电子工程师和计算机科学家必备的技能之一。无论你是电子专业的学生,还是职场中的工程师,掌握FPGA开发技术,都将为你…

前端与HTML

前端与HTML 什么是前端? 解决GUI人机交互问题跨终端(PC/移动浏览器)(客户端小程序)(VR/AR等)Web技术栈 前端工程师:利用web技术栈解决多端图形界面用户交互的工程师 前端技术栈 …

CDGA|数据治理:安全如何贯穿数据供给、流通、使用全过程

随着信息技术的飞速发展,数据已经成为企业运营、社会管理和经济发展的核心要素。然而,数据在带来巨大价值的同时,也伴随着诸多安全风险。因此,数据治理的重要性日益凸显,它不仅仅是对数据的简单管理,更是确…

rv1126物体检测 rkmedia、opencv……

整体码流流向: 因此代码也分为这几部分: VI:采集视频 配置视频采集信息 模型推理线程:获取VI码流、载入模型、进行模型推理、保存推理结果 画框线程:获取VI码流、获取推理结果、显示推理结果、输出码流到VENC VENC…

如何使用C#快速创建定时任务

原文链接:https://www.cnblogs.com/zhaotianff/p/17511040.html 使用Windows的计划任务功能可以创建定时任务。 使用schtasks.exe可以对计划任务进行管理,而不需要编写额外代码 这里掌握schtasks /CREATE 的几个核心参数就可以快速创建计划任务 /SC …

论文总结:A Survey on Evaluation of Large Language Models-鲁棒性相关内容

A Survey on Evaluation of Large Language Models 只取了鲁棒性相关的内容 LLMs:《A Survey on Evaluation of Large Language Models大型语言模型评估综述》理解智能本质(具备推理能力)、AI评估的重要性(识别当前算法的局限性设 3.2.1 Robustness鲁棒性&#xf…

Gitlab以及分支管理

一、概述 Git 是一个分布式版本控制系统,用于跟踪文件的变化,尤其是源代码的变化。它由 Linus Torvalds 于 2005 年开发,旨在帮助管理大型软件项目的开发过程。 二、Git 的功能特性 Git 是关注于文件数据整体的变化,直接会将文件…

HTTP模块(二)

HTTP 设置 HTTP 响应报文 HTTP报文常见属性: const http require(http);const server http.createServer((request, response) > {// 设置请求状态码 2xx 4xx 5xxresponse.statusCode 200;// 设置请求描述 了解即可response.statusMessage hello// 指定响…

谷粒商城实战笔记-59-商品服务-API-品牌管理-使用逆向工程的前后端代码

文章目录 一, 使用逆向工程生成的代码二,生成品牌管理菜单三,几个小问题 在本次的技术实践中,我们利用逆向工程的方法成功地为后台管理系统增加了品牌管理功能。这种开发方式不仅能快速地构建起功能模块,还能在一定程度…

uni-app声生命周期

应用的生命周期函数在App.vue页面 onLaunch:当uni-app初始化完成时触发(全局触发一次) onShow:当uni-app启动,或从后台进入前台时显示 onHide:当uni-app从前台进入后台 onError:当uni-app报错时触发,异常信息为err 页面的生命周期 onLoad…

Linux-安装VMware-01

一、认识linux Linux 是一个开源的类 Unix 操作系统,由林纳斯托瓦兹(Linus Torvalds)于1991年首次发布。Linux 是许多计算机硬件的底层操作系统,特别是服务器、嵌入式系统和个人电脑。它支持多种架构,包括 x86、x64、A…

算法学习笔记(8.8)-多重背包

目录 Question: 思路解析: 代码示例 多重背包的优化问题: 1.二进制优化 代码示例: 2.单调队列优化(滑动窗口) 代码示例 Question: 4. 多重背包问题 I - AcWing题库https://www.acwing.com/problem/content/description/4/ 多重背包简单来说其…

eqmx上读取数据处理以后添加到数据库中

目录 定义一些静态变量 定时器事件的处理器 订阅数据的执行器 处理json格式数据和将处理好的数据添加到数据库中 要求和最终效果 总结一下 定义一些静态变量 // 在这里都定义成全局的 一般都定义成静态的private static MqttClient mqttClient; // mqtt客户端 private s…

springboo 整合 redis

springBoot 整合 redis starter启动依赖。—包含自动装配类—完成相应的装配功能。 引入依赖 <!--引入了redis整合springboot 的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis&…

基于opencv[python]的人脸检测

1 图片爬虫 这里的代码转载自&#xff1a;http://t.csdnimg.cn/T4R4F # 获取图片数据 import os.path import fake_useragent import requests from lxml import etree# UA伪装 head {"User-Agent": fake_useragent.UserAgent().random}pic_name 0 def request_pic…

谷粒商城实战笔记-65-商品服务-API-品牌管理-表单校验自定义校验器

文章目录 1&#xff0c;el-form品牌logo图片自定义显示2&#xff0c;重新导入和注册element-ui组件3&#xff0c;修改brand-add-or-update.vue控件的表单校验规则firstLetter 校验规则sort 校验规则 1&#xff0c;el-form品牌logo图片自定义显示 为了在品牌列表中自定义显示品…