最近在 TK1 上用一个节点从飞控里读数据。单独跑的时候非常好,可是算法起来以后就各种延时,于是给这个节点提高优先级。

绑核

在我们的系统里,主要的算法都绑定了核,所以首先将节点绑定到空闲的 CPU 核上。有两种方式:

  1. CPU_SET
    待补充
  2. taskset
    taskset 是一个 shell 命令,我直接在节点的 launch 文件里加了一行
    1
    launch-prefix="taskset -c 1"

renice

renice 改的是进程的优先级,取值范围应该为 -20..0,越小优先级越高。用 top 命令观察 NI 项可以看到变化。

1
2
3
4
int pid = getpid();
char renice_cmd[128];
sprintf(renice_cmd, "sudo renice -20 %d", pid);
ROS_INFO("renice ncore_bridge: %d", system(renice_cmd));

pthread 参数

线程参数里可以指定调度策略及优先级。

调度策略有普通及实时之分。普通策略有 OTHERBATCHIDLE,没有优先级参数; 实时策略有 FIFORR,优先级取值 1..99top 命令 PI 项可以看到变化,当优先级设为 99 时, PI 项直接显示 rt。

1
2
3
4
5
6
int priority = 40;
struct sched_param param;
param.sched_priority = priority;
if(pthread_setschedparam(pthread_self(), SCHED_FIFO, & param)) {
ROS_ERROR("error while setting thread priority to %d", priority);
}

特别注意!!!

在代码里调进程或线程优先级需要特殊权限,否则会提示 sched_setscheduler: Operation not permitted 之类的东西。可以通过 PAM (Pluggable Authentication Modules) 模块 做这件事。

PAM 会读取 /etc/security/limits.conf,暴力一点,直接加一行

1
* - rtprio 100

和 Mavlink 一样, Armadillo 也建议安装到 $ROSINSTALL 环境变量对应的目录里,这样子 ROS 程序的 CMakeList 比较容易写。

安装

从官网下载解压后,进入目录

1
2
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=$(ROSINSTALL) .
make install

不过想要 Armadillo 火力全开,还需要额外安装一堆数学库,又涉及到 Armadillo 编译时怎么引用 $ROSINSTALL 里的库的问题,暂未研究。

Pixhawk

Pixhawk 上的坐标系均为 NED,即机头朝向为 x 轴正向,z 轴正向朝地。

加速度计

加速度计数值体现加速度。当水平静置飞机时,z 轴读数为 -9.8,意思是飞机等效运动为向上(z轴负方向)加速。

Gyro

简单理解即可。

Mag

测试发现,假设存在一个指向北极的线 $\mathsf{v}$,那么坐标轴正向与 $\mathsf{v}$ 重合的时候,数值最大,约为 0.5。

水平放置飞机的时候,机头朝北,数值约为 0.25。所以可以认为,真北朝向 $\mathsf{v}$ 其实是以 45 度射入地面的。

遥控器

控制 roll 的为 y 轴,控制 pitch 的为 x 轴。

MAVROS

MAVROS 采用的坐标系遵照 ROS 的约定。

acc 及 gyro

x 轴正向超前,z 轴正向朝天。

mag

磁力计的转换比较奇怪,似乎是 y 轴正向超前,z 轴正向朝天。

Shadowsocks

服务器端

安装

1
2
apt-get install python-pip
pip install shadowsocks

配置

Create a config file /etc/shadowsocks.json

1
2
3
4
5
6
7
8
9
10
{
"server":"server_ip",
"server_port":433,
"local_address": "127.0.0.1",
"local_port":1080,
"password":"mypassword",
"timeout":300,
"method":"rc4-md5",
"fast_open": true
}

启用 shasa20 加密

1
2
3
4
5
6
7
8
apt-get install python-m2crypto

wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.1.tar.gz
tar zxvf libsodium-1.0.1.tar.gz
cd libsodium-1.0.1
./configure
make && make check
make install

It is said that we need to fix association, though I have no idea what it means.

1
2
3
# 修复关联
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig

开启与关闭

1
2
ssserver -c /etc/shadowsocks.json -d start
ssserver -c /etc/shadowsocks.json -d stop

优化

事实上,由于国内网络连 DO 主机的速度,根本谈不上优化。。。

解决 DO CSS 被墙

/etc/hosts 添加

1
199.27.79.249 cloud-cdn-digitalocean-com.global.ssl.fastly.net

客户端

  • 下载后端

后端有好几个,选了 shadowsocks-libev

1
2
3
sudo apt-get install build-essential autoconf libtool libssl-dev
./configure && make
sudo make install
  • 下载前端
1
2
3
sudo add-apt-repository ppa:hzwhuang/ss-qt5
sudo apt-get update
sudo apt-get install shadowsocks-qt5

PPTP

1
2
apt-get update
apt-get install pptpd

注销 /etc/pptpd.conf 的下面两行以分配 IP

1
2
localip 192.168.0.1 
remoteip 192.168.0.234-238,192.168.0.245

编辑 /etc/ppp/chap-secrets 添加登录账户(别忘了最后的 * 号)

1
[username] pptpd [password] *

编辑 /etc/ppp/pptpd-options 设置 DNS 解析

1
2
3
4
5
6
# OpenDNS
ms-dns 208.67.222.222
ms-dns 208.67.220.220
# google DNS
ms-dns 8.8.8.8
ms-dns 8.8.4.4

配置 /etc/sysctl.conf 以允许转发

1
net.ipv4.ip_forward=1

重启服务

1
2
sysctl -p
/etc/init.d/pptpd restart

配置防火墙 iptables

1
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

保存并配置重启后的 iptables

1
iptables-save > /etc/iptables-rules

修改 /etc/network/interfaces,在 eth0 下添加:

1
pre-up iptables-restore < /etc/iptables-rules

最后清理 nash-hotplug,修改 /etc/rc.local 文件,在 exit 0 之前添加此命令: pkill -9 nash

dnsmasq

Dnsmasq 用于引导对 DNS 服务器的访问,比如说访问国内地址,就去查 114 DNS 服务器,如果访问国外地址,就去查 8.8.8.8 服务器。