2020电赛D题绕组飞行器

2023-05-16

在准备电赛的过程中,做了一下去年的题,本文将介绍我的方案及部分代码,希望可以帮助到大家。

一、我的装备

由于初学飞控所以主控用的是匿名的拓空者,还有匿名的光流传感器,北醒的激光雷达,星瞳科技的OPENMV和正点原子的激光测距模块ATK-VL53L0X。

二、实现思路

1、一键起飞,然后自旋找到第一个杆。
2、找到第一个杆后,由于激光测距模块最远测距是2m,实际更短,所以还测不到距离,因此要先缓慢靠近杆,直到激光测距模块有效,再进行PID控制与杆的位置,期间始终有OPENMV的角度调节。
3、等到角度和距离都合适开始绕杆,通过航向角控制旋转角度
4、绕完第一个杆后边后退,自旋寻找第二个杆。
5、找到后重复绕第一个杆的过程
6、寻找降落点然后降落(我没有实现这个任务)

三、代码介绍

1、下面这一段代码是ATK-VL53L0X的控制程序,由正点原子的测试例程修改,具体的模块介绍可以看正点原子的使用手册。

#include "vl53l0x.h"
#include "vl53l0x_i2c.h"

VL53L0X_Dev_t vl53l0x_dev;//设备I2C数据参数
VL53L0X_DeviceInfo_t vl53l0x_dev_info;//设备ID版本信息
VL53L0X_RangingMeasurementData_t vl53l0x_data;//测距测量结构体
vu16 vl53l0x_pdata[10];
mode_data Mode_data[]=      
{
    {(FixPoint1616_t)(0.25*65536), 
	 (FixPoint1616_t)(18*65536),
	 33000,
	 14,
	 10},//默认
		
	{(FixPoint1616_t)(0.25*65536) ,
	 (FixPoint1616_t)(18*65536),
	 200000, 
	 14,
	 10},//高精度
		
    {(FixPoint1616_t)(0.1*65536) ,
	 (FixPoint1616_t)(60*65536),
	 33000,
	 18,
	 14},//长距离
	
    {(FixPoint1616_t)(0.25*65536) ,
	 (FixPoint1616_t)(32*65536),
	 20000,
	 14,
	 10},//高速
		
};   //三种模式的默认校准参数

VL53L0X_Error vl53l0x_start_single_test(VL53L0X_Dev_t *dev,VL53L0X_RangingMeasurementData_t *pdata,char *buf)
{               
	static u8 i=0;
	static vu32 sum=0;
	VL53L0X_Error status = VL53L0X_ERROR_NONE;
	VL53L0X_GetRangingMeasurementData(dev,pdata);//获取测量距离,并且显示距离
	if(pdata->RangeMilliMeter<2000)      //这里人工做一个滤波,因为测距模块超出最大距离会显示八米
	{
	  sum+=pdata->RangeMilliMeter;
	  i++;
	  if(i==5)
	  {
	    opmv_gan_ctrl.Juli=sum/5;   //取五次的平均值
	    sum=0;
	    i=0;
	  }
                }
                return status;
}

VL53L0X_Error vl53l0x_set_mode(VL53L0X_Dev_t *dev,u8 mode)  //设置测距模式,这里用的是连续高速测距
{
	
	 VL53L0X_Error status = VL53L0X_ERROR_NONE;
	 uint8_t VhvSettings;
	 uint8_t PhaseCal;
	 uint32_t refSpadCount;
	 uint8_t isApertureSpads;
	
	
	 status = VL53L0X_StaticInit(dev);
	 status = VL53L0X_PerformRefCalibration(dev, &VhvSettings, &PhaseCal);//Ref参考校准

	 Delay_ms(2);
	 status = VL53L0X_PerformRefSpadManagement(dev, &refSpadCount, &isApertureSpads);//执行参考SPAD管理
	 
                 Delay_ms(2);		 	 
	 status = VL53L0X_SetDeviceMode(dev,VL53L0X_DEVICEMODE_CONTINUOUS_RANGING);//使能连续测量模式
	 
	 Delay_ms(2);
	 status = VL53L0X_SetInterMeasurementPeriodMilliSeconds(dev,Mode_data[mode].timingBudget);//设置内部周期测量时间
	 
	 Delay_ms(2);
	 status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,1);//使能SIGMA范围检查
	 
	 Delay_ms(2);
	 status = VL53L0X_SetLimitCheckEnable(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,1);//使能信号速率范围检查
	 
	 Delay_ms(2);
	 status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,Mode_data[mode].sigmaLimit);//设定SIGMA范围
	 
	 Delay_ms(2);
	 status = VL53L0X_SetLimitCheckValue(dev,VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,Mode_data[mode].signalLimit);//设定信号速率范围范围
	 
	 Delay_ms(2);
	 status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev,Mode_data[mode].timingBudget);//设定完整测距最长时间
	 
	 Delay_ms(2);
	 status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_PRE_RANGE, Mode_data[mode].preRangeVcselPeriod);//设定VCSEL脉冲周期
	 Delay_ms(2);
	 status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, Mode_data[mode].finalRangeVcselPeriod);//设定VCSEL脉冲周期范围
	 VL53L0X_StartMeasurement(dev);
	 return status;
	
}	

VL53L0X_Error vl53l0x_init(VL53L0X_Dev_t *dev)    //主要是初始化IIC
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	VL53L0X_Error Status = VL53L0X_ERROR_NONE;
	VL53L0X_Dev_t *pMyDevice = dev;
	
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//先使能外设IO PORTC时钟 
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
		
	pMyDevice->I2cDevAddr = VL53L0X_Addr;//I2C地址(上电默认0x52)
	pMyDevice->comms_type = 1;           //I2C通信模式
	pMyDevice->comms_speed_khz = 400;    //I2C通信速率
	
	VL53L0X_i2c_init();//初始化IIC总线
	
	GPIO_ResetBits(GPIOB,GPIO_Pin_0);//失能VL53L0X
	Delay_ms(30);
	GPIO_SetBits(GPIOB,GPIO_Pin_0);//使能VL53L0X,让传感器处于工作
	Delay_ms(30);
	Status = VL53L0X_DataInit(pMyDevice);//设备初始化
	Delay_ms(2);
	Status = VL53L0X_GetDeviceInfo(pMyDevice,&vl53l0x_dev_info);//获取设备ID信息
	return Status;
}

void vl53l0x_Init(void)  //这个函数放到主函数的初始化那里
{                
	 while(vl53l0x_init(&vl53l0x_dev)) ; //vl53l0x初始化
	 while(vl53l0x_set_mode(&vl53l0x_dev,3));  //配置测量模式                                       
	  
}
void vl53l0x_Task(u8 dT_ms)    //这个函数放到50ms的线程中
{
   static char buf[VL53L0X_MAX_STRING_LENGTH];//测试模式字符串字符缓冲区
   vl53l0x_start_single_test(&vl53l0x_dev,&vl53l0x_data,buf);//执行一次测量
}

2、下面是主要的控制函数,结构是模仿匿名的巡线程序写的

#include "Gan_Ctrl.h"
#include "Drv_OpenMV.h"
#include "Ano_OPMV_Ctrl.h"
#include "Ano_Math.h"
#include "Ano_Filter.h"
#include "ANO_IMU.h"
#include "Ano_FlightCtrl.h"
#include "vl53l0x.h"
#include "Drv_usart.h"
#include "Ano_FlyCtrl.h"
//需要操作赋值的外部变量:
//全局变量:
_opmv_gan_ctrl_st opmv_gan_ctrl;    //控制结构体
Ldc_gan_PID  Gan_PID;   //PID结构体
//参数设定:
#define FORWARD_VEL      12    //前进速度   
#define Ganyspeed         6   //绕杆切向速度
#define Ganyawspeed       90   //绕杆角速度
static u8 step;                //在分布控制中用作标志位
float Color=1;                //标志位,可以实现正逆时针绕杆
unsigned char Uartsendbuff[7]={0xaa,0xaf,0x05,0x01,0x06,0x03,0x68};   //给OPENMV发送要寻找第二个杆
void Ldc_pid_Init(void)     //PID参数及其他参数的初始化
{
   Gan_PID.Kp=20;
   Gan_PID.Kd=5;
   Gan_PID.Expect=500;
   opmv_gan_ctrl.Ganyaw=0;
   opmv_gan_ctrl.Gannumber=0;
   opmv.gan.sta=0;
   opmv_gan_ctrl.target_loss=1;	
}
void Ldc_gan_Ctrl(void)     //PID控制函数
{
    Gan_PID.Out=0;
    Gan_PID.Now=(float)opmv_gan_ctrl.Juli;
    Gan_PID.P=Gan_PID.Now-Gan_PID.Expect;
    Gan_PID.D=Gan_PID.Old-Gan_PID.Now;
    Gan_PID.Out=Gan_PID.Kp*Gan_PID.P+Gan_PID.Kd*Gan_PID.D;
    Gan_PID.Out	=0.001f*Gan_PID.Out;
    Gan_PID.Old	=Gan_PID.Now;
}
void Ldcqiehuan(void)       //这个函数用于控制旋转角度
{
   static u8 x=0;  //杆数目标志位
   if(opmv_gan_ctrl.Gannumber==0)
    {
      opmv_gan_ctrl.Gannumber=1;	  
      opmv_gan_ctrl.Ganyaw=imu_data.yaw+200*Color;    //再旋转200度进入下个阶段
      if(opmv_gan_ctrl.Ganyaw<-180) opmv_gan_ctrl.Ganyaw+= 360;     //控制角度在+-180度
      else if(opmv_gan_ctrl.Ganyaw>180) opmv_gan_ctrl.Ganyaw -= 360;
    }
   else if((opmv_gan_ctrl.Gannumber==1)&&( (opmv_gan_ctrl.Ganyaw-imu_data.yaw<35)&&(opmv_gan_ctrl.Ganyaw-imu_data.yaw>-35)))  //判断条件比较宽泛
   {
      opmv_gan_ctrl.Gannumber=2 ;
      opmv_gan_ctrl.Ganyaw=imu_data.yaw+220*Color;      //再旋转220度
      if(opmv_gan_ctrl.Ganyaw<-180) opmv_gan_ctrl.Ganyaw+= 360;
      else if(opmv_gan_ctrl.Ganyaw>180) opmv_gan_ctrl.Ganyaw -= 360;
   }
   else if((opmv_gan_ctrl.Gannumber==2)&&( (opmv_gan_ctrl.Ganyaw-imu_data.yaw<35)&&(opmv_gan_ctrl.Ganyaw-imu_data.yaw>-35)))
   {
      opmv_gan_ctrl.Gannumber=3;
      Usart3_Send(Uartsendbuff,7);    //寻找第二个杆
   }
   else if(opmv_gan_ctrl.Gannumber==3)
   {
       if(x==0)
       {
       step=2;
       x=1;
       Color=-1;	       
       opmv_gan_ctrl.Gannumber=0;
       }
       else
       {
           MyFlyCtrl(0x02,0,0);     //降落
       }	       
	
   }
}
void Ldc_gan_StepProcedure(u8 *dT_ms)    //分步控制函数
{
	static u8 time=0;
	switch (step)
	{
		case 0:{  //什么都不做
			opmv_gan_ctrl.exp_yaw_pal_dps = 0;
			opmv_gan_ctrl.exp_velocity_h_cmps[0]=0;
			opmv_gan_ctrl.exp_velocity_h_cmps[1]=0;
			time=0;
			step=1;
		}break;
		case 1:{
			if(opmv.gan.sta==1)  //如果找到杆调节角度
			{
			  opmv_gan_ctrl.exp_yaw_pal_dps=opmv.gan.ganx;
			  step=3;  //执行第三步
			}
                                                else
			{
			  if(opmv_gan_ctrl.Gannumber==0)  //自旋
			  {
                                                     opmv_gan_ctrl.exp_yaw_pal_dps=(-15);
			  }
			  else
			  {
			     if(time<=100)   //等待然后自旋,这里是为了保证绕杆过程中丢失可以重新找到杆
			     {
                                                         time+=*dT_ms;
			     }
                                                     else
			     {
                                                       opmv_gan_ctrl.exp_yaw_pal_dps =(-15)*Color;
			       time=0;
			     }				     
			  }
			}
		}break;
		case 2:{   //只有在两个杆中间转换的时候才会执行这里,内容是边自旋边后退,防止飘
			opmv_gan_ctrl.exp_velocity_h_cmps[0]=-16;
			opmv_gan_ctrl.exp_yaw_pal_dps=(-4);
                                                if(time<200)
			{
				time+=*dT_ms;
			}
			else
			{
				time=0;
				opmv_gan_ctrl.exp_velocity_h_cmps[0]=0;
				step=0;
				opmv_gan_ctrl.Gannumber=0;
			}
		}break;
		case 3:{    //判断距离是否合适
			if(opmv_gan_ctrl.Juli<=550&&opmv_gan_ctrl.Juli>=450)
			{
			  step=4;
			  Ldcqiehuan();  //合适就开始绕杆
			  opmv_gan_ctrl.exp_velocity_h_cmps[0]=Gan_PID.Out;
			}
			else
			{
			   if(opmv_gan_ctrl.Gannumber==0)
			   {
			     opmv_gan_ctrl.exp_velocity_h_cmps[0] =FORWARD_VEL;
			     if(time<80)
			     {
		                         time+=*dT_ms;
			     }
			     else
			     {
			        time=0;
			     }
		                   }
                                                   else
			   {
                                                      step=4;
			   }				   
			}
		}break;
		case 4:{   //如果角度合适就y方向平移
                                                if((opmv.gan.ganx<=20)&&(opmv.gan.ganx>=-20))  
			{
			   
			   opmv_gan_ctrl.exp_velocity_h_cmps[0]=Gan_PID.Out;
                                                   opmv_gan_ctrl.exp_velocity_h_cmps[1] =Ganyspeed*Color;
		                   if(time<300)  //延时
			   {
		                       time+=*dT_ms;
			   }
			   else
			   {
			      opmv_gan_ctrl.exp_velocity_h_cmps[1]=0;
			      step=5;   
			      time=0;
			   } 
			}
			else
			{
			   opmv_gan_ctrl.exp_yaw_pal_dps =opmv.gan.ganx;			
			}
		}break;
		case 5:{        //改变航向角
			opmv_gan_ctrl.exp_velocity_h_cmps[0]=Gan_PID.Out;
			opmv_gan_ctrl.exp_yaw_pal_dps=Ganyawspeed*Color;
			    if(time<250)
			   {
		                       time+=*dT_ms;
			   }
			   else
			   {
			      opmv_gan_ctrl.exp_yaw_pal_dps=0;
			      step=1;   //回到第一步
			      time=0;
			   } 
		}break;
		default:{
			
		}break;
	}
}	
					
void Gan_Ctrl(u8 *dT_ms,u8 en)   //放到线程中50ms执行一次
{
	//开启控制
	if(en)
	{
	      Ldc_gan_Ctrl();    //首先设置PID
                      if(opmv.gan.sta == 1)   //如果找到了杆
		{
			opmv_gan_ctrl.exp_yaw_pal_dps =opmv.gan.ganx;  //进行角度调节
			opmv_gan_ctrl.target_loss=0;     //这个标志位可以控制灯
		}
	      else
	                {
			opmv_gan_ctrl.target_loss=1;
			opmv_gan_ctrl.exp_velocity_h_cmps[0]=0;
			opmv_gan_ctrl.exp_velocity_h_cmps[1] = 0;
			opmv_gan_ctrl.exp_yaw_pal_dps =0;
		}
                      if(opmv_gan_ctrl.Gannumber!=0)   //等待首次位置调节好再执行
	      {
		 Ldcqiehuan();    
	      }
	      Ldc_gan_StepProcedure(dT_ms);   //分布控制
	      opmv_gan_ctrl.exp_yaw_pal_dps = LIMIT(opmv_gan_ctrl.exp_yaw_pal_dps,-90,90);//限幅
	}
	else  //不动
	{
		opmv_gan_ctrl.exp_velocity_h_cmps[0] = 0;		
		opmv_gan_ctrl.exp_velocity_h_cmps[1] = 0;
		opmv_gan_ctrl.exp_yaw_pal_dps = 0;
		step=0;
	}

	
}

本人水平有限,此代码仅供参考,如果要做找降落点的任务可以修Ldcqiehuan()函数,大佬们有好的方法或者认为我的代码有可以优化的地方的欢迎留言,我变量的命名实在是比较随便。
最终效果可以看我在b站的视频:https://www.bilibili.com/video/BV1o64y1y7Em

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020电赛D题绕组飞行器 的相关文章

  • 8、docker+k8s+kubesphere:nfs安装(2020-08-02更新)

    8 docker 43 k8s 43 kubesphere nfs安装 server端安装在node151 yum y span class token function install span nfs utils rpcbind 配置文
  • 2020-08-09

    广西 河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院 智控无人机小组 写作时间 2020年8月9日 周报 一 了解了msOS系统的系统框架和页面显示 msOS是 1 基于 C 语言 xff0c 没有
  • anaconda3 2020.07_Anaconda3 &amp; isce2

    Anaconda3安装 参考 xff1a https www digitalocean com community tutorials how to install anaconda on ubuntu 18 04 quickstart w
  • 2020-09-29

    广西 河池学院 广西高校重点实验室培训基地系统控制与信息处理重点实验室 本篇博客来自河池学院 智控无人机小组 写作时间 xff1a 2020 9 29 刚刚接触STM32f103 xff0c 简单了解了基本内容 有48个引脚 xff0c 其
  • 2020-11-05

    私有云的优缺点是什么 xff1f 与公有云的区别 毋庸置疑 xff0c 企业选择私有云的重要原因之一是数据安全性 与传统的 IT 架构相比 xff0c 云算力的高可用性 xff0c 让 IT 解决方案更经济高效地运行 优点 xff1a 可定
  • 北航2系921 2021考研历年真题及参考答案(2020-2004)

    需要自取 百度网盘 提取码 xff1a iwbg 关于2020北航921试题 相信大家都听说了 xff0c 2020年的921试题整体难度较2019年小 2019考完后 xff0c 群里面怨声载道 xff0c 信号10年没考电路题了怎么就今
  • 2020-11-17

    大数据的就业前景还是很不错的 大数据的价值体现在以下几个方面 xff1a xff08 1 xff09 对大量消费者提供产品或服务的企业可以利用大数据进行精准营销 xff1b xff08 2 xff09 做小而美模式的中小微企业可以利用大数据
  • 2020-12-22

    云计算主要包含哪些关键技术 xff1f 1 虚拟化技术 xff1a 云计算的虚拟化技术不同于传统的单一虚拟化 xff0c 它是涵盖整个IT架构的 xff0c 包括资源 网络 应用和桌面在内的全系统虚拟化 xff0c 它的优势在于能够把所有硬
  • 2020论文阅读:Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector

    文章目录 文章贡献1 绪论2 有关研究2 1 General Object Detection2 2 Few shot learning 3 FSOD A Highly Diverse Few Shot Object Detection D
  • 使用2020版IDEA创建Servlet

    使用2020版IDEA创建一个完整的Web项目的整个过程分为四步 第一步 创建一个普通的Java项目 1 打开IDEA xff0c 选择菜单File gt New gt Project 2 选择Java xff0c 以及自己的JDK xff
  • pycharm安装matplotlib失败(2020最新)

    欢迎关注 xff1a 天际使徒的个人博客 请修复网络 使用国内镜像速度会快很多 xff1a 临时使用 xff1a pip install i https pypi tuna tsinghua edu cn simple some packa
  • 2020-10-22

    SSD Keras code解析 一 模型建立 1 1 重要标志参数 aspect ratios per layer span class token operator 61 span span class token punctuatio
  • 2020/05/25 Prometheus监控k8s企业级应用 1

    2 2 课程介绍及课程大纲 普罗米修斯的配置很难 2 3 Prometheus监控软件概述 prometheus是一名google的前员工写的 xff0c 也是go语言写的 xff0c K8S是第一个托管的项目 xff0c promethe
  • 手把手教你复现顶会论文 —— RandLA-Net (CVPR 2020 Oral)

    前言 代码库 xff1a Pytorch 或者 Tensorflow Tensorflow1 11 作者代码库链接 xff1a https github com QingyongHu RandLA Net Pytorch 1 4 代码库链接
  • 2020-11-10

    https pan baidu com s 1uvuB6ahrfijMiWy9AqFCig
  • 2020-09-17

    在上篇推文中simulink bus总线创建方法详细介绍了基于matlab数据创建总线对象的方法 xff0c 这里介绍使用bus editor与data dictionary进行总线的创建管理 简单来说 xff0c data diction
  • 2020总结

    2020年可以说是我开始工作的第二年了 在第一年中我可以说了解了工作和组里的基本情况 xff0c 而这第二年就开始真正的加深学习了 还是以时间线一点点的慢慢讲吧 春节前我们一边工作一边准备年会 我们公司有个惯例那就是让每年最新入职的员工来主
  • 【slam-2020-01-02】扩展应用

    一篇比较全面的slam博客 一 VR 43 AR 1 VR和AR的关系 AR MR是平台 xff0c 覆盖面比VR更广 xff0c VR是一种媒体形式 xff0c 任何用得到媒体的场景 xff0c 如娱乐 教育等 xff0c 都会有VR的影
  • 自然资源部卫星遥感应用报告(更新至2020)

    自然资源部每年7月份发布上一年度的自然资源部卫星遥感应用报告 xff0c 是对自然资源领域典型应用的总结 xff0c 对于遥感应用探索有一定参考 自然资源部卫星遥感应用报告 2020版 自然资源部卫星遥感应用报告 2019版 摘录2020年
  • IntelliJ IDEA创建Servlet最新方法 Idea版本2020.2.2以及IntelliJ IDEA创建Servlet 404问题(超详细)

    第一次用IntelliJ IDEA写java代码 xff0c 之前都是用eclipse xff0c 但eclipse太老了 下面为兄弟们奉上IntelliJ IDEA创建Servlet方法 xff0c 写这个的目的也是因为在网上找了很多资料

随机推荐

  • Highway_env(Intersection)修改离散动作空间

    前言 在十字路口环境中 xff0c 主车默认的动作空间是以5m s变化的加减速以及保持原速三个动作 有时候为了学习更优化的策略 xff0c 同时与自己设置的奖励函数吻合 xff0c 需要修改环境的动作空间 这里我们主要添加两个较小加速度的纵
  • 离散动作的修改(基于highway_env的Intersection环境)

    之前写的一篇博客将离散和连续的动作空间都修改了 xff0c 这里做一下更正 基于十字路口的环境 xff0c 为了添加舒适性评判指标 xff0c 需要增加动作空间 xff0c 主要添加两个不同加速度值的离散动作 需要修改以下几个地方 xff1
  • VM 导入.ova/.ovf,未通过 OVF 规范一致性或虚拟硬件合规性检查.

    今天在用虚拟机VM导入ubuntu riscv ova文件新建Ubuntu时报错 xff1a 未通过OVF规范一致性或虚拟硬件合规性检查 网上查了一下 xff0c 了解到这是因为VM内置的Ofvtool工具的版本较低导致的 xff0c 解决
  • 借助FileZilla实现Ubuntu和 Windows之间文件互传

    借助FileZilla实现Windows和 Ubuntu间文件互传 xff0c 需要使用 FTP服务 xff0c 设置方法如下 xff1a 1 Windows下安装FTP客户端 FileZilla xff08 该软件免费 xff0c 可以直
  • 使用Ubuntu系统中的gparted工具对Ubuntu磁盘扩充

    最近在使用Ubuntu时 xff0c 发现经常提示内存空间不足 就总结了扩充Ubuntu内存的主要流程 xff0c 操作步骤如下 xff1a 第一步 xff1a 在虚拟机操作界面 xff08 关闭要进行磁盘扩充的Ubuntu xff09 进
  • 通过挂载的方式,解决由于权限无法将rootfs直接拷贝到SD卡的EXT4分区的问题

    最近在使用SD卡制作Linux启动文件时 xff0c 要将自己制作的根文件系统 xff08 rootfs xff09 拷到SD卡的EXT4分区时 xff0c 发现由于权限问题无法直接拷贝 xff0c 现通过挂载的方式解决该问题 xff0c
  • RISC-V架构下,Busybox工具的安装

    今天在RISC V架构下安装Busybox工具箱时 xff0c 找了很多的资料 xff0c 但都是ARM架构下的安装教程 xff0c 尽管内核不同但有一定的参考价值 xff0c 安装完成后对RISC V下Busybox工具箱的安装过程做出了
  • 串行通信协议小结(Serial Protocols)(1)

    通信关键点 同步通信 xff08 例如SPI xff09 双方之间的数据传输使用公共时钟信号进行同步 xff0c 数据以稳定的流传输 不需要额外的比特来标记传输的每个数据块的开始 结束 xff0c 因此速度更快 异步通信 xff08 例如U
  • MATLAB课程笔记(二)——MATLAB基础知识

    MATLAB系统环境 MATLAB操作界面的组成 采用与office 2010相同风格的操作界面 gt gt 命令提示符表示MATLAB处于准备状态 xff1a 续行符 MATLAB的搜索路径 gt gt clear 清除工作区的全部变量
  • SVN的日常使用

    1 已经加入ignore的文件夹 xff0c 解除方法 xff1a 直接到被ignore的位置 xff0c 执行 xff1a svn add lt 你被ignore的文件名 gt no ignore no ignore是取消忽略 如果是ad
  • RM遥控器接收程序的分析

    由遥控器接收分析串口与DMA RM的遥控器在使用的过程中在大体上可以分成两个部分 xff1a 信息的接收 与 信息的解析 xff0c 在信息的接收中主要用到了串口的空闲中断和DMA双缓冲区接收在本篇的信息接收部分主要根据RM官方给出的代码来
  • robomaster麦轮运动解算

    1 资源与代码 1 1 参考文章 本文主要参考的三篇文章如下 xff1a 麦轮运动特性分析 xff1a https mp weixin qq com s biz 61 MzI3MTIyMjQwNQ 61 61 amp mid 61 2247
  • FreeRTOS内核——任务与任务切换

    2 任务 相关函数 1 xTaskCreateStatic 2 prvInitialiseNewTask 3 prvInitialiseTaskLists 4 vTaskStartScheduler 5 xPortStartSchedule
  • FreeRTOS应用——任务

    12 任务 12 1 相关函数 12 1 1 任务创建函数与启动调度 12 1 1 1 xTaskCreateStatic 静态创建任务 if configSUPPORT STATIC ALLOCATION 61 61 1 TaskHand
  • FreeRTOS应用——消息队列

    13 消息队列 消息队列是一种常用于任务键通信的数据结构 xff0c 队列可以在任务与任务间 中断与任务间传递信息 xff0c 实现了任务接收来自其他任务或者中断的不定长数据 任务能从队列中读取信息 xff0c 当队列中的消息为空时 xff
  • RoboMaster电机驱动

    1 硬件 1 1 电机 RM有很多不同型号的电机 xff0c 不同型号的电机有它不同的用途 xff0c 但是以用途分类的话主要是分成两种电机 xff1a 用来精准控制位置的电机 xff0c 在RM中的主要是云台电机 RM官网上的云台电机只有
  • 数据结构——校园导游系统

    校园导游系统 1 要求 大二下学期修了数据结构这门课 xff0c 课设的要求是做一个校园导航系统 详细的要求如下 问题描述 xff1a 当我们参观校园时 xff0c 会遇到如下问题 xff1a 从当前所处位置去校园另外一个位置 xff0c
  • 平衡小车实现

    平衡小车 1 前期准备 1 1 I2C通讯协议 在与MPU6050进行数据的读取时需要用到I2C通讯协议来进行通信 物理层 IIC一共有只有两个总线 xff1a 一条是双向的串行数据线SDA xff0c 一条是串行时钟线SCL SDA Se
  • 关于STM32CubeMX生成不了Keil代码的解决办法

    关于STM32CubeMX生成Keil代码时弹出but MDK ARM project generation have a problem的问题 有两种可能 xff1a 1 输出路径或文件名包含中文 2 Java环境版本不匹配 下载 xff
  • 2020电赛D题绕组飞行器

    在准备电赛的过程中 xff0c 做了一下去年的题 xff0c 本文将介绍我的方案及部分代码 xff0c 希望可以帮助到大家 一 我的装备 由于初学飞控所以主控用的是匿名的拓空者 xff0c 还有匿名的光流传感器 xff0c 北醒的激光雷达