【内含实物图】一款可独立行走且支持远程对话的微型巡逻摄像头——嵌入式方案

本文主要是介绍【内含实物图】一款可独立行走且支持远程对话的微型巡逻摄像头——嵌入式方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上篇给大家分享了微型巡逻摄像头的整体硬件方案及各单元的工作原理。本篇将重点分享微型巡逻摄像头自平衡功能和移动控制功能的实现。
cam

MCU固件开发

本demo直接使用涂鸦智能SC012-WD2摄像头,因此摄像头和APP相关固件程序,并不需要开发者进行开发。开发者只需要开发底盘小车平衡运动这方面即可。

1.姿态读取

在控制平衡之前,开发者需要先获取当前平衡姿态,即先读取MPU6050数据,参考如下

void Get_Angle(uint8_t way)
{ float Accel_Y,Accel_Z,Gyro_X,Gyro_Z;Temperature=Read_Temperature();      //===读取MPU6050内置温度传感器数据,近似表示主板温度。if(way==1)                           //===DMP的读取在数据采集中断读取,严格遵循时序要求{	Read_DMP();                      //===读取加速度、角速度、倾角Angle_Balance=-Roll;             //===更新平衡倾角Gyro_Balance=-gyro[0];            //===更新平衡角速度Gyro_Turn=gyro[2];               //===更新转向角速度Acceleration_Z=accel[2];         //===更新Z轴加速度计}			else{Gyro_X=(I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_XOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_XOUT_L);    //读取Y轴陀螺仪Gyro_Z=(I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_ZOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_ZOUT_L);    //读取Z轴陀螺仪Accel_Y=(I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_YOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_YOUT_L); //读取X轴加速度计Accel_Z=(I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_ZOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_ZOUT_L); //读取Z轴加速度计if(Gyro_X>32768)  Gyro_X-=65536;                       //数据类型转换  也可通过short强制类型转换if(Gyro_Z>32768)  Gyro_Z-=65536;                       //数据类型转换if(Accel_Y>32768) Accel_Y-=65536;                      //数据类型转换if(Accel_Z>32768) Accel_Z-=65536;                      //数据类型转换Gyro_Balance=Gyro_X+Gyro_X_OFFSET;                                  //更新平衡角速度Accel_Angle=atan2(Accel_Y,Accel_Z)*180/PI;                 //计算倾角	Gyro_X=Gyro_X/16.4;                                    //陀螺仪量程转换	if(way==2)		  	Kalman_Filter(Accel_Angle,Gyro_X);//卡尔曼滤波	else if(way==3)   Yijielvbo(Accel_Angle,Gyro_X);    //互补滤波Angle_Balance=angle;                                     //更新平衡倾角Gyro_Turn=Gyro_Z+Gyro_Z_OFFSET;                                      //更新转向角速度Acceleration_Z=Accel_Z;                                //===更新Z轴加速度计	}
}
2.姿态平衡控制

获取姿态之后,开发者就可以着手控制小车保持平衡了。

在直立控制里面加入速度负反馈无法达到速度闭环的目的,而且还会破坏直立控制系统,因此在保证直立控制的优先级条件下,开发者们要把速度控制放在直立控制的前面,也就是速度控制调节的结果仅仅是改变直立控制的目标值。根据经验可知,小车的运行速度和小车的倾角是相关的。比如要提高小车向前行驶的速度,就需要增加小车向前倾斜的角度,倾斜角度加大之后,车轮在直立控制的作用下需要向前运动保持小车平衡,速度增大;如果要降低小车向前行驶的速度,就需要减小小车向前倾斜的角度,倾斜角度减小之后,车轮在直立控制的作用下向后运动保持小车平衡,速度减小。

开发者们把速度和直立两个控制器串联起来工作,其中速度控制的输出作为直立控制的输入,而直立控制的输出作为系统的输出,这其实就是一个串级控制系统。其中直立控制使用PD控制。因为编码器可能存在的噪声,为防止噪声被放大并消除系统的静差,这里速度控制使用PI控制。

3. 直立PD控制
int balance(float Angle,float Gyro)
{  float Bias;int balancePID;Bias=Angle-Angle_OFFSET;                       //===求出平衡的角度中值 和机械相关balancePID=Balance_Kp*Bias+Gyro*Balance_Kd;   //===计算平衡控制的电机PWM  PD控制   kp是P系数 kd是D系数 return balancePID;
}
4.速度PI控制
int velocity(int encoder_left,int encoder_right)
{  static float Velocity,Encoder_Least,Encoder,Movement;static float Encoder_Integral,Target_Velocity;//=============遥控前进后退部分=======================// Target_Velocity=40;                 if(Direction.Current==GO_STRAIGHT)    	Movement=-Target_Velocity/Flag_speed;	        //===前进标志位置1 else if(Direction.Current==GO_BACK)	Movement=Target_Velocity/Flag_speed;         //===后退标志位置1else  Movement=0;	//=============速度PI控制器=======================//	Encoder_Least =(encoder_left+encoder_right)-0;                   Encoder *= 0.8;		                                                //===一阶低通滤波器       Encoder += Encoder_Least*0.2;	                                    //===一阶低通滤波器    Encoder_Integral +=Encoder;                                       //===积分出位移 积分时间:10msEncoder_Integral=Encoder_Integral-Movement;                       //===接收遥控器数据,控制前进后退if(Encoder_Integral>8000)  	Encoder_Integral=8000;             //===积分限幅if(Encoder_Integral<-8000)	Encoder_Integral=-8000;              //===积分限幅	Velocity=Encoder*Velocity_Kp+Encoder_Integral*Velocity_Ki;        //===速度控制	if(Turn_Off(Angle_Balance,BAT_VOL)==1||Direction.Current==TURN_OFF)   Encoder_Integral=0;      return Velocity;
}
5.转向控制

除了保持平衡之外,小车也涉及到左右转动,因此还需要加入转向的控制,可参考如下

int turn(int encoder_left,int encoder_right,float gyro)//转向控制
{static float Turn_Target,Turn,Encoder_temp,Turn_Convert=0.9,Turn_Count; float Turn_Amplitude=30/Flag_speed,Kp=32,Kd=0; 	//=============遥控左右旋转部分=======================//if(Direction.Current==TURN_LEFT||Direction.Current==TURN_RIGHT)                      {if(++Turn_Count==1)Encoder_temp=myabs(encoder_left+encoder_right);Turn_Convert=50/Encoder_temp;if(Turn_Convert<0.6)Turn_Convert=0.6;if(Turn_Convert>3)Turn_Convert=3;}	else{Turn_Convert=0.9;Turn_Count=0;Encoder_temp=0;}			if(Direction.Current==TURN_LEFT){Turn_Target+=Turn_Convert;}else if(Direction.Current==TURN_RIGHT){Turn_Target-=Turn_Convert; }else Turn_Target=0;if(Turn_Target>Turn_Amplitude)  Turn_Target=Turn_Amplitude;    //===转向速度限幅if(Turn_Target<-Turn_Amplitude) Turn_Target=-Turn_Amplitude;if(Direction.Current==GO_STRAIGHT||Direction.Current==GO_BACK||Direction.Current==KEEP_STOP)  Kd=-1 ;        else Kd=0;   //=============转向PD控制器=======================//Turn=-Turn_Target*Kp-gyro*Kd;                 //===结合Z轴陀螺仪进行PD控制return Turn;
}
6.电机PWM控制

通过上述一系列控制计算后,开发者就得到了使小车平衡的PWM值,将该PWM值幅值给对应寄存器,就可以查看小车运动状态。

void Set_Pwm(int moto1,int moto2)
{     if(moto2>0)		{AIN2_RESET;AIN1_SET;}else 	        {AIN2_SET;AIN1_RESET;}		TIM16_PWM_Set(myabs(moto2));if(moto1>0)	{BIN1_RESET;BIN2_SET;}else        {BIN1_SET;BIN2_RESET;}TIM17_PWM_Set(myabs(moto1));
}

结语

以上就是带有可视通话功能且可以行走微型巡逻摄像头的实现方案。感兴趣的同学可以尝试动手操作,这种巡逻摄像头体积小巧可爱,可以放在家里和家人互动,也可以解决很多因空间原因无法解决的很多工作场景问题。

这篇关于【内含实物图】一款可独立行走且支持远程对话的微型巡逻摄像头——嵌入式方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301517

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

poj 2594 二分图最大独立集

题意: 求一张图的最大独立集,这题不同的地方在于,间接相邻的点也可以有一条边,所以用floyd来把间接相邻的边也连起来。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <sta

poj 3692 二分图最大独立集

题意: 幼儿园里,有G个女生和B个男生。 他们中间有女生和女生认识,男生男生认识,也有男生和女生认识的。 现在要选出一些人,使得这里面的人都认识,问最多能选多少人。 解析: 反过来建边,将不认识的男生和女生相连,然后求一个二分图的最大独立集就行了。 下图很直观: 点击打开链接 原图: 现图: 、 代码: #pragma comment(

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数