0%

这里使用C++语言来作为示例,但对其他语言的函数书写也有借鉴意义。

函数书写的原则

写函数的第一规则是要短小。第二条规则是还要更短小。

下面是两段功能一致的代码,分别展示了不同的实现方式:

第一段代码将所有的实现都写在了一个函数里,实现了一个简单的计算平均值的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
include <iostream>
#include <vector>

using namespace std;

double average(vector<double> v) {
double sum = 0;
for (int i = 0; i < v.size(); i++) {
sum += v[i];
}
return sum / v.size();
}

int main() {
vector<double> v{1, 2, 3, 4, 5};
double avg = average(v);
cout << "The average is: " << avg << endl;
return 0;
}

第二段代码对第一段代码进行了抽象,将复用的代码抽取成了一个共用的函数sum,然后在average函数中调用sum函数,实现了相同的功能。这样做的好处是可以减少代码量,提高代码的可读性和可维护性。

阅读全文 »

算法实现

purepursuit的核心其实是一个曲率半径的几何计算。

(x, y)是转换到机器人坐标系上的路径点。Llookahead distancer是形成的圆弧半径。Drx之间的差值。

根据上面的图形,可以发现有下面的几何关系:

同时通过
$$
y^2 + D^2 = r^2
$$
可以推算出下面的等式关系:

阅读全文 »

优化问题描述

假设一个机器人初始起点在0处,然后机器人向前移动,通过编码器测得它向前移动了1m,到达第二个地点x1。接着,又向后返回,编码器测得它向后移动了0.8米。但是,通过闭环检测,发现它回到了原始起点。可以看出,编码器误差导致计算的位姿和观测到有差异,那机器人这几个状态中的位姿到底是怎么样的才最好的满足这些条件呢?

首先构建位姿之间的关系,即图的边:

线性方程组中变量小于方程的个数,要计算出最优的结果,使出杀手锏最小二乘法。先构建残差平方和函数:

为了使残差平方和最小,我们对上面的函数每个变量求偏导,并使得偏导数等于0.

阅读全文 »

机器人软件系统中使用的通讯框架多种多样。比如,百度Apollo使用的Cyber RT,ROS1中的TCPROS/UDPROS通信机制,ROS2中使用的DDS等等。

下面介绍一种轻量,易用的通讯框架LCM(Lightweight Communications and Marshalling)。

LCM是一套用于消息传递和数据编码的库和工具,目标是构建高带宽和低延的实时通讯系统。它提供了一个发布/订阅消息传递模型和自动编码/解码代码的生成器。

LCM为多种编程语言(C/C++,C#,Java,Lua,MATLAB,Python)的应用提供接口。

LCM具有如下特性:

  • 低延迟的进程间通信
  • 使用UDP组播的高效广播机制
  • 类型安全的消息编排
  • 用户友好的记录和回放工具
  • 没有集中的 “数据库 “或 “枢纽”–节点间直接通讯
  • 没有守护进程
  • 极少的依赖
阅读全文 »

下面的安装过程是在ubuntu20.04上进行的。

安装gnuplot需要依赖lua5.2。所以先安装lua5.2

安装lua5.2

下载安装包

1
wget http://www.tecgraf.puc-rio.br/lua/ftp/lua-5.2.0.tar.gz

编译安装lua5.2

解压后进入源码目录

1
2
make linux
sudo make install
阅读全文 »

Doxygen是一个代码文档生成工具。它从代码文件中提取注释并可生成多种文档形式。如:网页文档HTML,RTF (MS-Word),PDF等等。同时也可生成函数之间的调用和文件的依赖关系图表。

Doxygen除了支持C++语言外还支持C, Objective-C, C#, PHP, Java, Python, IDL (Corba, Microsoft, and UNO/OpenOffice flavors),甚至它也支持硬件描述语言VHDL。

doxygen的安装

  1. 使用apt安装doxygen
1
sudo apt install doxygen
阅读全文 »

你的机器人安全吗?

ROS1中的通信数据基本是开放的。只要我们知道机器的IP。然后使用下面的命令在自己的笔记本电脑里声明一下机器人系统中ROS_MASTER的地址。

1
export ROS_MASTER_URI="http://192.7.8.48:11311"

注意,这里的ip(192.7.8.48)需要设成实际机器的ip。

这样我们就可以获取机器人系统的所有通信数据。

并且很危险的是,我们可以在自己的电脑中向机器人系统发送任意速度指令或者其他指令来干扰机器人的正常运行。

想想就很不安全。

ROS2中默认集成了SROS2功能包。它可以将通信数据进行加密从而保证数据安全。下面来认识一下这个功能包。

SROS2仓库地址:https://github.com/ros2/sros2

阅读全文 »

这里记录一下使用cppcheck进行C++代码静态检测的方法和步骤。

本机安装cppcheck

1
sudo apt-get update && sudo apt-get install cppcheck

使用cppcheck来检查代码

新建一个目录,并在目录中加入如下内容的cpp文件,用于测试静态代码分析工具。

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>

using namespace std;

int test_fun()
{
int a;
return a;
}


int main(int argc, char* argv[]) {
int num = argc - 1;

int * a = nullptr; // intentional mistake
*a = 9;

if (num = 0) {
cout << "No arguments provided\n";
} else if (num == 0) { // intentional mistake
cout << "1 argument provided\n";
} else if (num == 2) {
cout << "2 arguments provided\n";
} else {
cout << num << " arguments provided\n";
}
if (argv != 0) {
cout << "argv not null\n";; // intentional extra-semicolon
}
if (argv == nullptr) {
return **argv; // intentional nullptr dereference
}

return 0;
}
阅读全文 »