自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

转载 哈希表实现

哈希表实现

2022-08-21 19:57:17 234 1

转载 c语言 backtrace

c语言backtrace的详细理解

2022-07-17 17:23:25 4995

原创 c语言 assert用法及错误分析

asset用法

2022-07-17 12:19:24 1079

转载 c语言运行程序崩溃(crash)的原因

C语言程序崩溃(crash)的原因

2022-07-17 12:08:22 3861

原创 makefile学习记录

makefile学习记录

2022-07-17 11:36:21 121

原创 图像的基本形态学处理方法(开运算、闭运算、顶帽运算、底帽运算)

图像的基本形态学处理方法(开运算、闭运算、顶帽运算、底帽运算)图像的形态学运算可以对图像进行预处理(去噪声、简化形状)、增强物体结构(抽取骨骼、细化、粗化、凸包)、从背景中分割物体、对物体进行量化描述(面积、周长、投影)。图像的形态学处理经常以二值化图像为源图像。二值化图像是将原始图像的灰度图以某一阈值进行分割,把像素点的灰度在阈值范围内的设置为255,用白色表示,在阈值范围之外的设置为0,用黑色表示。其具体的公式如下:上式中, f(x,y)代表灰度图某一像素的灰度值,T1、T2 分别是设置的上下灰

2022-04-27 22:38:26 5683

原创 硕士阶段个人经验

硕士阶段顺利拿到国家奖学金,获得上交读博机会和大疆offer。现把经验和建议分享如下:1:早日明确自己感兴趣的研究方向和工作重点,因为找工作或者读博大概率都是以硕士阶段的研究内容为基础,不会偏离得特别严重。因此越早明确自己的方向,便能够越早的积累相关的知识和项目经验。本人硕士三年大方向是智能机器人,但智能机器人研究方向里面具体的工作又可细分为:结构设计、硬件设计(学生一般不自己开发,都是购买现成的产品)、软件设计(学生一般集中在上层应用软件和代码的开发)、算法设计(包括控制算法、图像算法、规划算法等等)。

2022-04-18 14:51:52 2753 1

原创 实现复数模板类

#include<iostream>using namespace std;template<typename T>class Complex {public: //借助函数的默认参数,可以普通构造函数和“转换构造函数” //精简为以下带默认参数的构造函数 Complex(T a=0, T b=0) :m_real(a), m_imag(b){}; //拷贝构造函数 Complex(const Complex& c); //析构函数 ~Complex

2022-03-17 13:47:14 338

原创 Jetson 使用IIC接口读取TFmini-plus等传感器数据

Jetson 使用IIC接口读取TFmini-plus等传感器数据最近使用Jetson nx/nano的IIC接口来读取单点激光雷达TFmini-plus的数据,将开发过程记录如下。首先需要了解IIC通信协议的基本原理,可参考我之前所写的博客:https://blog.csdn.net/w1050321758/article/details/108956570?spm=1001.2014.3001.5501#include <stdio.h>#include <stdint.h&

2022-01-13 20:00:59 1548 1

原创 Jetson nano 使用ROS 实现串口通信,并且解析通信协议(C++)

Jetson nano 使用ROS 实现串口通信1:首先安装ros下的serial库sudo apt-get install ros-melodic-serial其中的melodic根据自己的ros版本来修改2:安装minicom和cutecom来首次检查串口是否通信成功sudo apt-get install minicomsudo apt-get install cutecom3:将自己的串口设备连接到jetson nano上jetson nano的引脚4 6 8 10 分别是VCC

2021-11-03 15:02:29 4404

原创 2022 DJI 大疆嵌入式软件开发面试经验分享

DJI 嵌入式软件开发面试经验分享从研究生入学以来便一直从事无人机/机器人相关的研发工作,所以DJI一直以来都是非常中意的公司,最终也如愿以偿收到了DJI的OC,现在把面试经验总结如下:7.6-8.11 网申,大疆的网申时间比较早,一旦错过了就基本要等到明年了,所以一定要注意网申时间7月28号 线上测评8月24日 技术笔试有选择题、多选题、填空题、简答题、编程题总的来说考察的嵌入式软件开发相关的知识范围比较广,编程题没有用到特别复杂的算法,比较简单,但是很难拿满分9月6日 技术一面,电话面试1

2021-10-21 15:21:52 5009 2

原创 使用ROS通过串口获取遥控器信号(二)

使用ROS通过串口获取遥控器信号(二)十:编写串口通信节点sudo gedit ~/catkin_ws/src/uart_communication/src commu.cpp加入以下代码,根据实际情况修改自己的代码,注意serial的API函数可以从ROS -wiki中搜索得到,根据自己需求调用相应的函数#include <ros/ros.h>#include <std_msgs/String.h>#include<uart_communication/remo

2021-04-06 21:05:20 1017 5

原创 使用ROS通过串口获取遥控器信号(一)

使用ROS通过串口获取遥控器信号硬件:AT9S遥控器和R9DS接收机TX2或者Jetson nano或者DJI manifold2G软件:Ubuntu16.04 ROS-kinetic实现方法:一:首先安装ROS下的Serial功能包sudo apt-get install ros-kinetic-serialP.S. 如果说使用此命令报404错误,可能是软件源的问题,可直接下载deb文件,如serial库http://packages.ros.org/ros/ubuntu/pool/m

2021-04-06 20:50:08 1302

原创 ROS使用serial库编译时出现“未定义的引用”解决办法

ROS使用serial库编译时出现“未定义的引用”解决办法在使用ROS的串口通信工具时:sudo apt-get install ros-kinetic-serial写好代码后编译出错,显示与串口相关的一些函数没有引用,报错xxx未定义的引用原因分析:编译器在链接时没有找到与serial相关的库,虽然在函数开头包了#include<serial/serial.h>,但是ros在使用catkin_make时会去CMakeLists找相关的库,原因就是在CMakeLists中没有将需要

2021-04-06 19:34:45 2437 4

转载 C++回调函数总结

一:函数指针回调机制在C语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调(注意分清回调函数和被调函数的概念,以便在下文论述中理解)。因此要实现回调,必须首先定义函数指针。例如:void Func(char *s) // 函数原型void (*pFunc)(char *); //函数指针可以看出,函数的定义和函数指针的定义非常类似。一般情况下,为了简化函数指针类型的变量定义,提高程序的可读性,我们需要把函数指针类型自定义一下。typedef void(*pcb)(

2021-03-30 14:34:40 152

转载 转:make cmake和catkin_make的区别

转:make cmake和catkin_make的区别转自:https://blog.csdn.net/fantasysolo/article/details/80868265程序在cmake编译是这样的流程, cmake指令依据你的CMakeLists.txt 文件,生成makefiles文件,make再依据此makefiles文件编译链接生成可执行文件. catkin_make是将cmake与make的编译方式做了一个封装的指令工具1.gcc是GNU Compiler Collection(就是G

2021-03-04 18:58:50 474 1

原创 Ubuntu 编译大疆Onboard-SDK-ROS-3.8.1过程中可能遇到的问题

Ubuntu 编译大疆Onboard-SDK-ROS-3.8.1过程中可能遇到的问题1:无法解析域名1.配置cndsudo vi /etc/resolv.confnameserver 8.8.8.8nameserver 114.114.114.1142.重启linux“us.archive.ubuntu.com”

2021-03-04 16:32:13 383 1

原创 第三届中国高校智能机器人创意大赛ROS挑战赛-迷宫夺宝机器人

全国高校智能机器人大赛之ROS挑战赛-迷宫夺宝机器人一、作品简介比赛规则:http://www.annisen.com/details.aspx?id=163参赛作品:获奖:二、硬件架构系统硬件列表:系统硬件框图:系统的硬件框图如图所示。上层控制器树莓派4B通过WIFI与下位机进行分布式网络通信,使用USB连接激光雷达获取障碍物距离信息,通过PWM引脚连接接收机与舵机,接收遥控器信号控制舵机转动,使用开发的通信协议通过串口发送速度指令与底层控制器STM32进行通信,底层控制器接收到

2021-01-02 21:04:22 2013 1

原创 DJI妙算 Manifold2G(TX2)(ubuntu16.04)之ZED2立体相机开发(一)

DJI妙算 Manifold2G(TX2)(ubuntu16.04)之ZED2立体相机开发(一)(一)ZED相机开发环境搭建1:TX2刷机搭建ZED2开发环境时需要tx2提前安装好Jetpack3.3 Ubuntu16.04 和CUDA9,由于我所购买的DJI Manifold2-G已经提前安装好这些软件,所以没有进行前面的操作,如果你的TX2没有安装这些建议先参考其它博客将这些软件安装好。(二)下载 ZED SDK前往ZED的官网找到适合的SDK版本,并进行下载,由于网络原因我的电脑打开zed

2021-01-02 16:59:45 1101 2

原创 利用滑膜控制器实现舵机的角度控制与代码实现

利用滑膜控制器实现舵机的角度控制与代码实现一:滑模控制器的三大优点1:在被控对象参数发生变化或者受到外界干扰而引起的扰动时表现为不灵敏。2:不需要对被控系统进行在线的辨识。3:物理实现简单二:滑膜控制器的缺点及来源容易在滑膜面出现高频抖振的现象。来源:1:自身开关特性的影响;2:系统惯性与延迟三:解决高频抖振的方法1:准滑膜动态法:在边沿内侧采用饱和函数替代切换函数。2:趋近率方法:3:滤波方法…四:利用滑膜控制器实现舵机的角度控制1:舵机系统框图2:大疆M3508直流无刷

2020-11-22 15:43:44 1963 2

原创 XBee无线模块的通信方式和结合Arduino的具体实施过程

XBee无线模块的通信方式和结合Arduino的具体实施过程原理简介:XBee模块是Digi公司的一款采用ZigBee技术的无线模块,通过串口与单片机等设备间进行通信,能够非常快速地实现将设备接入到ZigBee网络的目的。XBee模块与单片机的串口通信有transparent和API两种操作模式,其中在transparent模式下单片机直接通过串口将要传输的数据发送给XBee模块,XBee模块按照ZigBee协议将数据通过无线发送给远端的XBee模块,远端模块再通过串口发送给单片机,就好像两个单片机之

2020-11-06 12:14:54 3613 5

原创 树莓派Ubuntu18.04使用pigpio库产生PWM波实现舵机控制

树莓派使用pigpio库产生PWM波实现舵机控制一:pigpio库简介pigpio是一个用于树莓派的库,它允许控制树莓派的通用输入输出(GPIO)引脚。它的下载与安装步骤请参考:http://abyz.me.uk/rpi/pigpio/download.html它提供了c语言风格与python语言风格的库函数,我们可以调用相关的库函数实现跟GPIO相关的操作。与PWM操作相关的几个函数的详细解释可以参考http://abyz.me.uk/rpi/pigpio/python.html#get_PWM

2020-10-22 15:46:32 2147 2

原创 树莓派连接接收机使用pigpio库读取PWM波脉宽实现与遥控器的远程通信

树莓派连接接收机使用pigpio库读取PWM波脉宽实现与遥控器的远程通信一:pigpio库简介pigpio是一个用于树莓派的库,它允许控制树莓派的通用输入输出(GPIO)引脚。它的下载与安装步骤请参考http://abyz.me.uk/rpi/pigpio/download.html它提高了c语言风格与python语言风格的库函数,我们可以调用相关的库函数实现跟GPIO相关的操作。二:读取PWM脉宽相关的几个库函数1:set_PWM_frequency(user_gpio, frequency

2020-10-21 13:42:13 2523 4

原创 队列及其应用-取牌游戏

队列及其应用-取牌游戏一:基本概念队列是一种操作受到限制的特殊线性表。其插入操作限定在表的一端进行,称为“入队”;其删除操作则限定在表的另一端进行,称为“出队”。插入一端称为队尾(rear);删除一端称为队头(front)。队列也被称作“先进先出”线性表(FIFO,First In First Out)。类似于生活中排队购票,先来先买,后来后买。在不断入队、出队的过程中,队列将会呈现出以下几种状态:队空:队列中没有任何元素。队满:队列空间已全被占用。溢出:当队列已满,却还有元素要入队,就会出

2020-10-19 22:55:01 2641

原创 C/C++指针相关知识详解

C++指针相关知识详解一:内存和内存地址内存可以说是电脑里的内存条,内存大小就是内存条的容量。操作系统和程序在运行过程中都需要用到不同的数据,而运行过程中用到的数据都保存在内存中。程序运行时,操作系统首先把程序从硬盘读入到内存中,然后再把内存里面的代码指令读取到CPU内运行,这是因为硬盘的读写速度相对于CPU的运算速度慢很多,把数据先读到内存里面,减少CPU等待读取指令的时间,以提高CPU的利用率。内存按照逐个字节进行划分,操作系统为每个字节的内存按顺序给一个编号,而这个编号就是内存地址,那么操作系

2020-10-15 16:50:02 214

原创 栈及其应用-中缀表达式转后缀表达式并用后缀表达式求值

栈及其应用-中缀表达式转后缀表达式并用后缀表达式求值一:栈的基本原理栈是一种特殊的线性表,因为它对线性表中的元素做出了明确的要求:栈中的元素只能从线性表的一端进出,且要遵循“先入后出”的原则,即先进栈的元素后出栈。基于栈结构的特点,在实际应用中,通常会对栈执行以下两种操作:向栈中添加元素,此过程被称为“进栈”(PUSH、入栈或压栈);从栈中提取出指定元素,此过程被称为“出栈”(POP、或弹栈);进栈和出栈一般采用数组和栈顶指针来实现栈。进栈(PUSH)算法:①:若top>=n,则给出

2020-10-14 19:17:36 1039

原创 STM32通过IIC读取MPU6050原始数据过程详解

STM32通过IIC读取MPU6050数据过程详解一:硬件介绍此款MPU6050是通过IIC来与MCU通信的,它有两个IIC接口,第一个是SCL和SDA与主IIC通信;第二个是AUX_CL和AUX_DA,这个接口可用来连接外部从设备,比如磁传感器,这样就可以组成一个九轴传感器。VLOGIC 是 IO 口电压,该引脚最低可以到 1.8V,我们一般直接接 VDD 即可。AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制IIC 地址的最低位。如果接 GND,则 MPU6050 的 IIC 地

2020-10-11 14:36:26 11607 3

原创 I2C通信协议及STM32代码解释

I2C通信协议及其在MPU6050中的应用一:简介IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SD

2020-10-07 22:45:29 5033

原创 STM32中断相关知识总结

STM32中断相关知识总结一:中断是什么?中断是指处理器运行过程中,出现某些意外情况,CPU能自动停止正在运行的程序并转入处理新情况的程序(中断服务函数),处理完毕后又返回原被暂停的程序继续运行。CM3和CM7 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但 STM32 并没有使用 CM3或CM7 内核的全部东西,而是只用了它的一部分。STM32F1系列有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,STM32F76

2020-10-07 21:58:00 2581

原创 无人机姿态解算:四元数及其与欧拉角的转换

四元数在无人机姿态解算中的应用与实现**引言:**获得无人机飞行时的飞行姿态对于无人机稳定控制来说至关重要。无人机主要通过传感器数据融合来进行状态估计,常用于无人机的传感器包括:MPU(包含了三轴加速度计和三轴陀螺仪,9250还包括磁力计),气压计,超声波传感器,光流计等。通过传感器数据融合算法可以得到无人机的最优状态估计值,包括无人机的姿态角,俯仰pitch、横滚、偏航角等。通过传感器的数据来求得无人机姿态角的信息的过程就是姿态解算,本文详细推导了利用四元数与四阶龙格库塔法求解四元数微分方程得到姿态角,

2020-09-28 16:32:33 8390 2

原创 旋转矩阵、欧拉角、万向锁详解

旋转矩阵、欧拉角、万向锁详解物体的姿态描述物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接。用坐标系{B}的三个单位主矢量{Xb,Yb,Zb}相对于参考坐标系{A}的方向余弦组成的3*3的矩阵来表示刚体B相对于坐标系{A}的方位,(_B^A)R称为旋转矩阵。式中,上标A代表参考坐标系{A},下表B代表被描述的坐标系{B},(_B^A)R共9个元素,但只有三个式独立的。三个单位列矢量两两相互垂直,长度为1,因而它的9给元素满足正交条件:旋转矩阵

2020-09-25 16:11:14 3617 2

原创 STM32输入捕获详细配置及通过编码器读电机转速

STM32输入捕获详细配置及通过编码器读电机转速STM32输入捕获工作过程通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。STM32输入捕获设置步骤1:设置输入捕获滤波器首先,FDTS的频率由TIMx_CR1的CKD[1:0]的设置决定,为00时,FDTS=FCK_INT。其次,TIMx_CCMR1的ICF[3:0]这几个为用来设置输入采用频率和数字

2020-09-23 16:01:19 11685 11

原创 STM32定时器配置、PWM输出比较详解、电机PWM输出配置

STM32定时器配置详解STM32拥有三种定时器基本功能其通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)、定时、计数等。其通用定时器(TIM2、TIM3、TIM4、TIM5)的功能包括:1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT),F7的TIM2和TIM5有32位。2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。3) 4 个独立通道(TIMx_C

2020-09-22 21:09:16 4887 1

转载 STM32的JTAG和SWD模式

STM32的JTAG和SWD模式的区别一:JTAGJTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如ARM、DSP、FPGA器件等。标准的JTAG接口是4线:TMS、 TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。相关JTAG引脚的定义为:TMS:模式选择,TMS用来设置JTAG接口处于某种特定的测试模式;TCK:时钟输入;TDI:数据

2020-09-18 13:58:36 17973

原创 C++结构体、联合体、枚举体及其内存

C++结构体、联合体、枚举体及其内存结构体:是一种特殊形态的类结构体与类的区别:结构体与类具有不同的默认访问控制属性:在类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型;在结构体中,对于未指定任何访问控制属性的成员,其访问控制属性为公有型。关键字:struct定义:Struct 结构体名称{ 公有成员; Protected: 保护型成员Private:私有成员};什么时候用结构体而不用类:1:主要用来保存数据,而没有什么操作的类型2:人们习惯将结构体的数据成员设

2020-09-16 12:56:09 411

原创 STM32 SYSTICK定时器及延时函数详解

STM32 SYSTICK及延时函数详解SysTick定时器SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心

2020-09-15 11:26:47 1841

原创 STM32时钟配置函数详解

STM32时钟配置函数详解一:STM32F1时钟树图上图从左往右看,就是整个 STM32 的时钟走向。这里,我们挑选出 4 个重要的地方进行介绍(图 5.2.2.1 中标出的 1~4)。1、 PLLPLL 用于设置 STM32 的 PLLCLK,STM32 支持 2~16 倍频设置。我们常用的是 8M 外部晶振+9 倍频设置,刚好得到 72Mhz 的 PLLCLK。从上图可以看出,PLLMUL 的时钟源,可以来自内部(HSI) 8M RC 振荡/2 或者外部(HSE)高速晶振(4~16Mhz)。

2020-09-14 20:21:57 5639 2

原创 模糊PID实现步骤及其MATLAB仿真与STM32程序实现

模糊PID实现步骤及其MATLAB仿真与STM32程序实现一:模糊PID相比传统PID的优点传统PID控制器自出现以来,凭借其结构简单、稳定性好、工作可靠、调整方便等优点成为工业控制主要技术。当被控对象的结构和参数具有一定的不确定性,无法对其建立精确的模型时,采用PID控制技术尤为方便。PID控制原理简单、易于实现,但是其参数整定异常麻烦。对于传统的PID,其参数KP、KI、KD是根据开发者经验在某种特定环境下调试之后得到的一组接近最优的PID参数,然而对于一些非线性时变系统而言,其工作环境是时刻变

2020-09-14 11:05:12 25794 18

转载 static关键字的作用详解及其在STM32按键输入实验中的运用

static关键字的作用详解一:先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; // global variablevoid msg() { printf("Hello\n"); }下面是main.c的内容int main(void){ extern

2020-09-11 13:10:56 3207

转载 数据类型及其长度

数据类型及其长度c/c++数据类型:1、整形:int、long2、字符型:char、wchar_t3、布尔型:bool4、浮点型:float、double5、指针从表中可以看出这么几个问题,int类型在64位系统下竟然是4个字节32位的。还有,这些玩意儿到底跟什么有关系?是谁在控制着?从网上扒了各种解释,大概有这么两点:1、64位系统下,编译器为了向前兼容,将int类型自动编译为4个字节的了;2、这些个玩意儿就是编译器来控制的,不同的编译器将int类型编译成不同长度的,所以,使用什么编译

2020-09-11 10:37:29 4870

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除