自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

@司南牧|知乎|博客|易懂教程|李韬

他是华工机器人硕士,蓝桥杯重点本科组国奖获得者,知乎@司南牧 有百万级阅读量,专注初学者教程跨界机器人,人工智能,算法不再困难.

  • 博客(158)
  • 资源 (2)
  • 收藏
  • 关注

原创 【易懂教程】我是如何快速理解卡尔曼滤波Kalman Filter(KF)算法的(1)?

牛逼的算法往往都是来源于一个很简单的思想所演化而来,如果你不了解这个思想和演化过程那就谈不上了解那个牛逼的算法——@Ai酱直观理解首先卡尔曼滤波要解决的问题是什么?我以机器人估计自己离障碍物距离为例答:首先机器人已知“上个时刻机器人离障碍物距离”,“传感器测量的机器人离障碍物的距离(我们称它为观测值,比如雷达直接测量机器人离障碍物距离7m)”和“自己当前时刻的速度”这三个数据。而根据“上...

2019-08-01 14:50:54 3177 7

原创 【易懂教程】我是如何十分钟理解与推导贝叶斯滤波(Bayes Filter)算法?

像卡尔曼滤波(Kalman filters)、粒子滤波(Particle filters),隐含马尔科夫模型(Hidden Markov models),动态贝叶斯网络(Dynamic Bayesian networks)等等算法。这些算法都和贝叶斯滤波算法非常相似.因此学好了贝叶斯滤波再学其他算法那就容易很多了。破解概念上的束缚之贝叶斯滤波算法到底有什么用?学东西最烦的是看了半个月的算法细节...

2019-07-30 20:00:46 19981 34

原创 易懂如何理解单个神经元+随机梯度下降学习逻辑与规则编程实践

易懂的神经网络Python实战:单个神经元+随机梯度下降学习逻辑与规则目录逻辑与(AND)破除神经元的认知障碍实践:用程序表示一个手工设置权重weight和偏置bias的神经元那么怎么让计算机自己确定神经元的参数?梯度下降1。直观理解梯度下降2。梯度下降怎么做的?4。梯度下降有啥用?实践:动手实现随机梯度下降(根据上面的那个伪代码)AI韬鸽的笔记专栏中《...

2019-04-26 16:30:31 12674 1

原创 什么是大端(Big Endian)?什么是小端?为何需要这样设计?

存储的单元是字节,网络传输的单元也是字节。大小端是针对字节流中某个字节内存储的顺序而制造的一个概念。比如:在内存中存储是酱紫的:0x01 0x02 0x03 0x04(X86是4字节),从高字节开始存放(大端)。然后它向网络发送数据是从左到右发结果字节流就变成了0x04 0x03 0x02 0x01 (0x01是最先发送出去的,看起来网络字节流就变成了小端,小字节在前)然后接收端接收到的字...

2020-03-09 12:03:18 1088 1

原创 [易懂]如何真正理解SLAM中的BA中的扰动法求导泰勒展开

∂(Rp)∂ξ=lim⁡Δξ→0exp(Δξ^)exp(ξ^)p−exp(ξ^p)Δξ≈lim⁡Δξ→0(1+Δξ^)exp(ξ^)p−exp(ξ^p)Δξ=lim⁡Δξ→0exp(ξ^p)+Δξ^exp(ξ^)p−exp(ξ^p)Δξ=lim⁡Δξ→0Δξ^exp(ξ^)pΔξ=lim⁡Δξ→0Δξ^RpΔξ=lim⁡Δξ→0−(Rp)^ΔξΔξ=−(Rp)^>利用叉乘的性质交换\fra...

2020-02-19 16:40:53 791 2

原创 如何理解PnP问题的DLT解法以及Python编程实践

PnP问题的DLT解法欢迎关注知乎@司南牧已知:上一帧相机坐标系下的点的三维齐次坐标QQQ,和,那nnn个点在当前帧中的二维齐次坐标qqq, 和相机内参矩阵KKK。待求解变量 :当前帧相对上一帧的位姿变换矩阵[R∣t][R|t][R∣t] 。约束方程:K[R∣t]Q=λqK[R|t]Q = \lambda qK[R∣t]Q=λq我们记[R∣t]=[a11a12a13a14a21a...

2020-02-19 16:37:59 3686 2

原创 如何理解SLAM三维重建中的DLT算法求解单应矩阵Python实践代码

# -*- coding: utf-8 -*-"""Created on Thu Dec 5 20:22:04 2019@author: 知乎@司南牧"""import numpy as nppoints1 = np.array([ [1,1], [2,3], [4,8], ...

2019-12-05 21:26:44 1352

原创 cpp语法特性中数字开头数字后面紧跟字母如1ms是什么?cpp自定义字面量cpp自定义后缀

cout<<123ms<<endl;这是c++11出现的新语法叫做c++自定义字面量。就是自定义后缀的意思。举个例子就懂了#include <iostream> std::string operator "" ms(long double x){ return std::string("hello");}int main(int argc,c...

2019-12-02 20:46:06 447

原创 [简洁]点云库PCL绘制立方体代码

绘制立方体代码如下所示#include <thread>#include <pcl/common/common_headers.h>#include <pcl/features/normal_3d.h>#include <pcl/visualization/pcl_visualizer.h>using namespace std::chr...

2019-12-02 20:02:40 2407 2

原创 [有效]如何解决Cmake编译PCL项目报错:cannot find -lvtkproj4这个问题的解决方案

Cmake编译PCL项目报错:cannot find -lvtkproj4只需要在CmakeLists.txt里面中PCL依赖项后面加上这句话即可list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4") 。即为:find_package(PCL) include_directories(${PCL_INCLUDE_DIRS})link_directories...

2019-12-02 19:22:15 815

原创 cmake下使用PCL如何写CmakeLists.txt的内容

cmake_minimum_required(VERSION 2.6 FATAL_ERROR)project(YourProjectName)find_package(PCL)include_directories(${PCL_INCLUDE_DIRS})link_directories(${PCL_LIBRARY_DIRS})add_definitions(${PCL_DEFIN...

2019-12-02 19:07:49 1169

原创 cmake下使用boost,以shared_ptr和make_shared举例

Cmake文件配置首先需要在CmakeLists.txt文件中加入下面这段记得“YourExeName和 YourSourceCodeName”这两个部分需要替换成自己的源文件名字和自己想生成的目标文件名字find_package(Boost)if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) add_exe...

2019-12-02 16:24:39 763

原创 支持Python和c++的Open3D三维重建与点云操作库入门使用

Open3D是一个开放源代码库,支持快速开发处理3D数据的软件。Open3D前端在C ++和Python中公开了一组精心选择的数据结构和算法。后端经过高度优化,并设置为并行化。Open3D是从一开始就开发出来的,带有很少的,经过仔细考虑的依赖项。它可以在不同的平台上设置,并且可以从源代码进行最小的编译。代码干净,样式一致,并通过清晰的代码审查机制进行维护。而且文档也不错Open3D的文档。它...

2019-12-02 10:56:04 5569 6

原创 如何高效的统计最长回文子串的长度? Manacher马拉车算法通俗讲解与实践教程

待解决问题描述给定一个字符串abcbddacaddx要求输出这个字符串的最长回文子串的长度。解释:子串是指从这个字符串任意地方截取一段任意长度的字符串。回文子串指的是前面所提到的截取出的子串中是对称的那种子串。比如“bcb”就是对称。如果我们是要求出最长回文子串那么有一个简单的方式就是将原字符串逆序,然后匹配原字符串与逆序后的字符串之间最长公共子串。但是现在我们只需要统计最长回文子串的长...

2019-11-25 10:03:16 175

原创 c++易错点总结(1): cpp中的explicit的作用,为何尽量使用explicit关键字

在c++种explicit关键字只能用来修饰构造函数。禁止它自动调用拷贝初始化。什么是拷贝初始化?举个例子:现在我们不使用explicit关键字看看会发生什么?我们发现下面这个代码明明我们给函数f()传递的参数是一个整数,但是编译器却自动调用了类A的构造函数,这种就叫做拷贝初始化。这是超出预期的。如果你不希望这样那么请在构造函数前面加上explicit关键词禁止编译器这种自动调用拷贝初始化的行...

2019-11-17 19:13:03 1353

原创 [最新有效]高翔RGB-D SLAM中最新版本g2o报错解决方案

报错一共有两个原因:初始化g2o的接口已经发生变动需要修改解决方案:以下是最新的初始化g2o的代码(2019年11月15日14:17:40)// 初始化g2o typedef g2o::BlockSolver< g2o::BlockSolverTraits<6,3> > Block; // pose维度为 6, landmark 维度为 3 std::un...

2019-11-15 14:18:56 479

原创 如何理解视觉SLAM视觉里程计VO:如何从图片中还原计算出相机的三维位姿算法教程Python代码实践

视觉里程计是什么?视觉里程计有什么用?需要我们求解什么?视觉里程计(Visual Odometry,VO) 算法是什么?视觉SLAM中的视觉里程计算法就是指的是通过某个算法根据前后两张图片求出当前时刻内相机位置和姿态相对上个时刻相机位置和姿态的变化的那种算法。这个就和出租车的里程计一样记录每个时刻的车轮速度及其滚动距离类似。只不过视觉里程计算法是求相机在各个时刻的位置姿态,所以才叫做视觉里程计算...

2019-11-08 19:36:37 1626

原创 如何通俗理解相机标定公式推导与Python编程实践教程

今日疯言疯语:学习一个算法重要的就是弄清楚这个算法要解决怎样的问题,它的已知量(输入)是什么,待求解的未知量(输出)是什么。如果这三个问题没找到答案,就去学算法细节只会浪费大量时间。——知乎@司南牧相机标定(Calibration)做了什么事?为何很多地方都需要相机标定?相机标定主要是为了通过对某个特殊形状的物体拍照从而找到照片中的像素点坐标与现实世界中的三维坐标之间的变换关系。这个变换关...

2019-11-03 15:33:01 560

原创 编译orb slam遇到的一些bug和错误解决方案

error usleep not in this scope解决方案:在你报错的那些文件里面加上#include<unistd>collect2: error: ld returned 1 exit statusCMakeFiles/Makefile2:141: recipe for target 'CMakeFiles/mono_tum.dir/all' failedm...

2019-11-02 19:25:43 1457

原创 ubuntu cmake Fatal error: iostream: No such file or directory

报错描述:ubuntu cmake Fatal error: iostream: No such file or directory报错原因:造成这个报错的原因是因为iostream并不是c语言里面的写法。而你的文件名是xx.c,cmake看你文件是.c结尾所以它认为这是c语言程序,事实上你写的是cpp代码。解决方案:将xxx.c文件名改为xxx.cpp报错就会消失。...

2019-11-01 20:14:58 7453 1

原创 cv2 drawKeypoints 使用自定义数组来绘制关键点

def draw_features(img, features): """Draw features""" # Convert to OpenCV KeyPoints cv_kps = [] for f in features: cv_kps.append(cv2.KeyPoint(f.pt[0], f.pt[1], f.size)) # ...

2019-10-22 18:52:21 1673 1

原创 报错信息ax = axes if axes else plt.gca() ValueError: The truth value of an array with more than one ele

ax = axes if axes else plt.gca()ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()这个报错信息是因为ax是一个数组,而我们期待的是ax[i]。注意i是指第i个元素。将ax传递成a[i]即可。...

2019-10-19 01:15:57 1594

原创 如何理解二值图连通域快速标记算法快速连通物体检测Fast-Connected-Component教程附带python代码实现

如何快速在一张二值化了的图片检测那些像素是属于一个物体块?注意快速连通物体检测算法只能识别二值化了的图片中哪些像素是相互连接的一个整体。换句话说就是这个算法可以检测到哪些像素是相互连通的。它其实就是可以看作是计算机算法中的连通子图问题。连通物体检测算法有哪些用?1. OCR文字识别中可以用连通物体检测算法识别哪些像素是属于一个汉字。然后对这个汉字识别 2. 物体检测。直接看下图就懂了我对...

2019-10-15 00:15:09 876 1

原创 如何理解图像处理中的Otsu's 二值化算法(大津算法)Python编程实践

Otsu’s 二值化(大津算法)二值化是什么?有什么用?PDF扫描成电子版,文字识别,车牌识别等等图像处理场合均需要使用“二值化”操作。我们知道图像是一个矩阵组成,矩阵的元素是一个数字,这个数字是当前像素点对应的颜色(即像素值)。而图片的二值化操作就是将所有像素值变成要么是0要么是1.一般二值化怎么做的呢?答:“设置一个数字d,只要像素值大于这个阈值d那就设置为1,小于这个阈值d那就设置为0。...

2019-10-12 21:28:18 2245

原创 通俗易懂最小二乘法与牛顿法总结:线性与非线性,文末有Python和c++代码编程实践教程

今日疯言疯语:很多算法看不懂大概率是这些算法做出的一些假设你不知道——@Ai酱线性最小二乘法||Ax-y||可以直接求解问题:已知A和y,需要求x。并且需要最小化||Ax-y||。下面是求解x的方法:Ax=yATAx=ATyx=(ATA)−1ATyAx=y \\A^TAx = A^Ty\\x = (A^TA)^{-1}A^TyAx=yATAx=ATyx=(ATA)−1ATy之所...

2019-09-28 20:50:07 1005 1

原创 史上最易懂的最小二乘法实践:线性最小二乘法推导与Python求解编程教程

最小二乘法有什么用?一般用它做什么事?我们最早接触最小二乘法是在高中的时候学的。最小二乘法一般被用来拟合数据。什么叫做拟合数据?就是给定你一堆数据,然后你假设这些数据是满足某种函数的,比如你假设这些数据是一条直线。现在问题来了到底这些数据所对应的那条直线斜率是多少截距是多少?这就得用最小二乘法来求解。总结:最小二乘法拟合数据的步骤有两步。1.首先,假设这些数据符合某种函数。而这种函数往往有几...

2019-09-26 19:16:59 1021

原创 2D二维旋转变换,坐标旋转变换矩阵是如何推导而来?三维旋转变换矩阵与二维旋转变换有什么联系?

我们在做几何变换的时候经常需要把某个坐标系上的所有点都进行一个旋转,这个操作就叫做坐标系旋转。下图是一个典型的二维坐标系旋转。我们把蓝色的坐标系旋转了θ\thetaθ度,新坐标系就是红色的坐标系。假设我们现在已知一个点相对红色那个坐标系的坐标,然后我们想求得该点相对于蓝色那个坐标系的坐标。这个其实很简单我们利用高中学的三角几何就可以轻松解决。上面那个坐标系旋转可以转换为下面这个线段旋转。旋转前...

2019-09-25 22:10:38 1488 1

原创 python cv2 opencv手写一个棋盘格

有时候我们需要用棋盘格测试我们写的代码或者用于校准相机。虽然opencv里面有自带的代码。但是了解下如何写一个棋盘格也是有必要的。下图是一个简单的实现。import cv2import numpy as npchecker_img = np.zeros((320,320))block_width = 320//8black_block = np.full((block_width,blo...

2019-09-24 20:14:26 1852

原创 适合初学者的SLAM实践教程(1):相机模型-如何从照片中重建出像素点的三维坐标?

三维重建到底是怎么回事?已知什么数据?待求解哪些变量?看下面这张图,一图解释如何根据照片进行三维重建。首先,三维重建就是根据把照片的像素点对应现实世界中某个点在相机坐标系下的三维坐标计算出来。一般我们可以通过深度相机或者双目视觉等方式获取目标物体离相机坐标系原点的距离ZrealZ_{real}Zreal​,这里的相机坐标系的原点就是相机的焦点。所以现在我们已经知道了的数据有:“像素点A在照片坐...

2019-09-24 19:21:21 1044

原创 一文看懂强化学习中的那些概念及各算法之间本质上的联系易懂梳理简单举例与python实践

强化学习它的思路基本是想要遍历穷举计算各种状态的价值,然后尽可能的达到高价值的那些状态。那么什么是状态?什么是状态的价值?不同问题的里面含有的“状态”的内容和数量都不一样。下面我举个例子。比如玩井字棋(三个相同色在一条线就赢)。看下面这张图**,每张图对应的棋子放置的位置就是一个状态**。(在本例子中我们编程化那就一个状态就只需要用一个3×3的数组来保存棋谱即可)。# 用3×3的二维数组保存状...

2019-09-22 15:17:28 322

原创 在colab训练与使用运行PVNet进行估计物体的位置和姿态

为了能让colab操作google driver中的文件需要执行下面代码。!apt-get install -y -qq software-properties-common python-software-properties module-init-tools!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > ...

2019-09-14 22:09:51 532 1

原创 Unity脚本使用总结

执行逻辑和执行顺序Update是每一帧都调用,相邻两帧间隔的时间为Time.deltaTime。FixedUpdate是与帧无关,到一定时间就调用,不会因为卡帧就出问题。在Update和FixedUpdate都调用完后就会调用LateUpdate,一般这步可以让摄像机看看更改的了地方.Update和LateUpdate是每帧调用一次。FixedUpdate是解决卡帧问题用的。...

2019-09-07 10:04:47 418

原创 HoloLens Unity编程(2): 在Unity中如何设置HoloLens的相机属性

在上一篇文章介绍了Unity编辑器界面各个模块的功能。如果看完上篇文章你已经安装好了Unity并且了解Unity界面各个模块的作用。由于HoloLens原理就是把Unity中虚拟摄像头看到的场景投影到眼镜上,虚拟摄像头看到的场景就是我们人眼看到的场景。为了让这个虚拟摄像头能够和HoloLens投影模式匹配我们需要设置下Unity虚拟摄像头的属性。首先需要选中“Main Camera”,然后可以看...

2019-09-06 15:26:33 979

原创 Unity游戏编程教程(1): 认识Unity可视化编辑器界面

使用Unity我们可以可视化的制作游戏。如何下载与安装Unity?点击这个链接进入到下载页面Unit下载。然后点击"Download Unity Hub"。你会发现马上下好了。它是一个Unity管理器,它会在线的帮你下载Unity。Unity可视化界面各个模块的功能Unity如何创建一个项目我们一开始打开Unity是它的项目管理器。你需要点击右上角的"New"来创建一个Unity项目。...

2019-09-06 14:48:47 3669

原创 一文看懂机器人与自动驾驶与机器人的“眼睛”[即时定位与地图重建SLAM]到底是什么?有哪几个关键环节?他们之间的联系是什么?

即时定位与地图重建(SLAM)到底是什么?为什么需要它?在哪需要它?如何使用它?SLAM技术是什么?它就是通过摄像头和雷达等传感器来对周围环境进行实时地图重建并且还能计算出传感器位于所重建的地图的哪个地方。SLAM技术有什么用?在哪需要它?如何使用它?自动驾驶需用用SLAM技术来建图和定位自己在哪。通过建图后才能决策到底前面有没有车,以及前面是否有路口,到底改怎么转。机器人需要对周围环境进行建...

2019-09-02 15:16:48 354

原创 pandas dataframe常见使用场景大总结

import pandas as pddata = pd.DataFrame([1,2,3,4],columns=['a', 'b', 'c','d'])

2019-08-30 15:45:55 888

原创 python读取matlab保存的点mat文件

Python下读取.mat文件import scipy.io as siodata= sio.loadmat('./nidewenjianming.mat') # 返回一个字典(dict)类型的数据

2019-08-30 15:32:33 289

原创 如何直观理解粒子滤波并进行Python编程实践

疯言疯语:如果你对一个算法有什么用都一无所知,那么学这个算法的难度那就增加了100倍。——知乎@Ai酱首先我们看看粒子滤波怎么用的。我以粒子滤波可以用来机器人自主定位为例。现在已知机器人脑子里面有某个商场的地图,然后它想知道自己到底在哪。注意:现在机器人已知商场地图,并且能看到周围长啥样,需要求机器人位于地图哪个位置(就像我们人自己在商场都经常迷路不知道自己在哪)。那么根据粒子滤波算法机器...

2019-08-28 17:17:20 3839 1

原创 分类交叉熵与二元交叉熵区别?Categorical Cross-Entropy Loss, Binary Cross-Entropy Loss

有时候你用交叉熵发现损失值很低但是识别效果就是不好这可能是因为你有多个分类但是却用二元交叉熵的原因。

2019-08-27 19:34:01 3421 1

原创 [易懂实例讲解]离散型贝叶斯滤波python编程代码实践

本文是从例子的角度来讲解贝叶斯滤波。如果你想看贝叶斯滤波的理论推导的话可以看这篇文章《我是如何十分钟理解与推导贝叶斯滤波(Bayes Filter)算法?》。不懂贝叶斯滤波理论也凭直觉可以看懂本文的例子和Python代码实践。例子的背景介绍假设有一个机器人它在困在一个管子里面了,只能前进或后退。管子的长度是20cm。机器人收到"前进"命令后有三种可能“有25%概率不执行,有50%概率前进1cm...

2019-08-27 16:25:53 4573 4

驯服烂代码

Kent Beck、Martin Fowler、Michael C. Feathers、Robert C. Martin、Joshua Kerievsky、Gerard Meszaros等大师们的传世著作为如何提升编程技艺和代码质量提供了思想和原则上的指导,本书则为实践和融合这些思想、原则提供了过程和方法上指导。本书通过编程操练的方式讲述了如何用TDD(测试驱动开发)的方法来驯服烂代码,通过结对编程的对话形式展示了驯服烂代码的完整过程,将驯服烂代码所需要的思想、态度、习惯、方法和技艺完全融入编程操练实践中,是目前最具实践指导意义的驯服烂代码的著作。, 全书共20章,分为四个部分:第一部分(第1~10章)首先通过测试后行和测试先行两种方法完成了一个名为“码农酒店”(世界时钟)的编程操练题目,然后对这两种方法进行对比,引出了烂代码的概念,读者能非常直观看出哪一种方法更容易写出烂代码。第二部分(第11~15章)通过一个名为Trivia(答题闯关游戏)的经典编程操练题目详细讲述了驯服一段烂代码的过程,首先讲解了代码腐臭的识别和记录,然后讲解了如何通过一系列的重构来清除这些腐臭。第三部分(第16~18章)通过三个编程操练题目详述了编写真正的单元测试的过程,首先讲解了用提取接口的办法编写Stub来进行单元测试,以及用子类化并覆写方法的办法编写Mock来进行单元测试,然后讲解了如何将被测类与文件系统之间的这种不适用于单元测试的耦合,转化为被测类与字符串之间这种适合与单元测试的耦合。第四部分(第19~20章)总结了驯服烂代码的步骤及方法,首先讲解了TDD开发方法的一种实现:I-EPP-TR方法,该方法中的全面重构的概念对传统的重构概念进行了扩展,然后讨论了如何才能将前面所讨论的良好的编程方法形成习惯并固化下来。

2017-04-15

汇编编译器

汇编集成开发环境

2016-06-27

空空如也

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

TA关注的人

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