配置无线串口可以提高发射功率、波特率,改变网段避免冲突,官方有指导

安装依赖 SDCC

1
sudo apt-get install sdcc

编译固件

1
2
3
git clone https://github.com/tridge/SiK.git
cd SiK/Firmware
make install

上传

1
tools/uploader.py --port /dev/ttyUSB* dst/radio~hm_trp.ihx

配置

默认波特率为 57600,通过 screen 连接

1
screen /dev/ttyUSB* 57600 8N1

几个常用 AT 命令如下:

  • +++ 进入 AT 模式
  • ATI5 罗列选项
  • AT&W 保存配置
  • ATZ 重启模块

3DR 官方也有提供 windows 下的配置软件,强烈推荐使用,因为有中文,每项选项都有详细的解释,有助迅速理解。

一些概念

  • 无线串口推荐连接到 Pixhawk 的 TELEM1 口。 TELEM2 及 Serial4/5 也可以用,不过不建议。

  • 当传送的数据里包括 MAVLINK_HEARTBEAT 信息时, 无线串口固件会偷偷地发送一个叫 MAVLINK_RADIO 的包。

  • MAVLINK_RADIO 包包含 RSSI,错误率以及串口 buffer 的容量!!!APM 固件针对这个包的数据,会调整发包速率,避免串口发不过来

  • 无线串口固件会尝试把几个包合成一个包进行发送,这个合成包的最大 size 为 252 字节。

  • 按照教程的说法,串口会保证在 MAX_WINDOW 的时间内发送一次,减小 MAX_WINDOW 会缩小带宽。所以应该是这样理解: MAX_WINDOW 没到,串口会收集数据包,到了以后一次全发送出去; 提高发送频率,会导致每次发送的数据包数量变少,减少的数量大于频率提高增加的数量,所以带宽就小了。

烧系统

手动方法

参考官方指南,并且优先选择 Grinch Kernel,因为带了很多驱动。

21.2 版本的网络驱动有问题, Grinch Kernel 页面有介绍怎么搞,但是不是最优方案,复杂的解决方案看这里

注意在烧写的那一步,为了用完板子的 16G 空间,用以下命令:

1
$ sudo ./flash.sh -S 14580MiB jetson-tk1 mmcblk0p1

利用官方 JetPack 工具

官方 JetPack 会自动下载内核、文件系统、cv4Tegra、CUDA 以及一些测评工具,一步步配置并在最后推送到板子上,比较简单。

缺点是看不出来怎么复用原来做好的系统,似乎每烧一块版都要解压一次文件系统并配置。而且这个工具比较新,非常不稳定。

配置

优先参考elinux wiki,然后

  • 添加 MIT 的源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    deb http://mirrors.mit.edu/ubuntu-port/ trusty main restricted universe multiverse
    deb http://mirrors.mit.edu/ubuntu-port/ trusty-security main restricted universe multiverse
    deb http://mirrors.mit.edu/ubuntu-port/ trusty-updates main restricted universe multiverse
    deb http://mirrors.mit.edu/ubuntu-port/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.mit.edu/ubuntu-port/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.mit.edu/ubuntu-port/ trusty main restricted universe multiverse
    deb-src http://mirrors.mit.edu/ubuntu-port/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.mit.edu/ubuntu-port/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.mit.edu/ubuntu-port/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.mit.edu/ubuntu-port/ trusty-backports main restricted universe multiverse
  • 利用 apt-fast 加速升级

1
2
3
sudo add-apt-repository ppa:saiarcot895/myppa
sudo apt-get update
sudo apt-get install apt-fast
1
echo "alias apt-get='apt-fast'" >> ~/.bashrc
  • 自动补全

    1
    2
    3
    $ sudo apt-add-repository universe
    $ sudo apt-get update
    $ sudo apt-get install bash-completion command-not-found
  • 安装 x11vnc

  • 调时区并更新时间

    1
    2
    3
    4
    5
    $ sudo dpkg-reconfigure tzdata

    $ sudo service ntp stop
    $ sudo ntpdate pool.ntp.org
    $ sudo service ntp start
  • 卸载不必要的东西

    1
    2
    3
    4
    $ sudo apt-get remove aisleriot gnome-mines gnome-sudoku gnome-mahjongg
    $ sudo apt-get remove deja-dup unity-lens-photos unity-lens-video unity-lens-friends unity-lens-video unity-lens-music unity-webapps-common unity-scope-audacious rhythmbox totem
    $ sudo apt-get remove simple-scan empathy transmission-common transmission-gtk brasero
    $ sudo apt-get autoremove

  • 完善语言安装

  • 安装编译环境

    1
    2
    $ sudo apt-get install build-essentials
    $ sudo apt-get install libncurses5-dev

  • 添加用户组

    1
    2
    3
    $ sudo usermod -a -G video $USER
    $ sudo usermod -a -G dialout $USER
    $ sudo usermod -a -G plugdev $USER
  • 安装 cudaopencv4tegra

还需要到 cuda 安装页面 看看怎么添加路径。

卸载方式也需要参考以上地址。

  • ssh 免密码登录

修改 .ssh/authorized_keys 添加内容,内容来自主机的 .ssh/id_rsa.pub

系统调优

  • cpu 频率
    check /var/log/boot.log for booting messages and use dmesg to show kernel messages

    1
    $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
  • disable ondemand

    1
    $ sudo update-rc.d ondemand disable
  • install cpufrequtils

    1
    $ sudo gedit /etc/init.d/cpufrequtils

增加 swapfile

ROS 里常常有一些包,需要很大的编译空间。TK1 默认的 2G 内存完全不够,需要手动添加 swap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
#NVIDIA Jetson TK1
#Create a swapfile for Ubuntu at the current directory location
fallocate -l 4G swapfile
#List out the file
ls -lh swapfile
# Change permissions so that only root can use it
chmod 600 swapfile
#List out the file
ls -lh swapfile
#Set up the Linux swap area
mkswap swapfile
#Now start using the swapfile
swapon swapfile
#Show that it's now being used
swapon -s

以上脚本会在执行的地方搞出一个 4G 的 swap 空间,执行完以后,系统空间就少了 4G。

开机自动挂载这个空间,需要修改 fstab。

1
$ sudo gedit /etc/fstab
1
/media/swapfile none swap sw 0 0

如果想要重新调整 swap 大小,切换到 swap 所在的目录,然后

1
2
3
4
dd if=/dev/zero of=swapfile bs=1M count=2048 # 调成 2G
chmod 600 /swapfile # only root has permission
mkswap /swapfile # format it to swap
swapon /swapfile # activate

编译内核

在 host 机上编译内核

e-con 公司有一页教程,很详细地讲了怎么在 host 机上编译内核、开启 USB3.0, fastboot 与 uboot 的不同配置之类的问题,很值得一看。

串口驱动

一个串口设备接上的时候,可以通过 lsusb 查看设备使用的芯片,比如说这样子

1
2
ubuntu@tegra-ubuntu:~$ lsusb
Bus 002 Device 006: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

可是 TK1 的内核默认没有开启支持

1
2
3
ubuntu@tegra-ubuntu:~$ zcat /proc/config.gz | grep FTDI
# CONFIG_USB_SERIAL_FTDI_SIO is not set
# CONFIG_USB_FTDI_ELAN is not set

解决方案:

  • 下载内核源代码,假设解压到 ~/kernel 文件夹

  • 将当前内核配置复制到源码文件夹里

    1
    zcat /proc/config.gz > ~/kernel/.config
  • 启动 menuconfig 工具配置内核

    1
    2
    sudo apt-get install ncurses-bin libncurses5-dev
    make menuconfig
  • 进入 Device Drivers -> USB Support -> USB Serial Converter Support,将 USB FTDI Single Port Serial Driver 标记为 M,保存并退出

  • 确认驱动已设置为模块编译

    1
    2
    3
    ubuntu@tegra-ubuntu:~/kernel$ cat .config | grep FTDI
    CONFIG_USB_SERIAL_FTDI_SIO=m
    # CONFIG_USB_FTDI_ELAN is not set
  • 编译内核(只针对串口驱动部分)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    make prepare
    make modules_prepare

    make M=drivers/usb/serial/
    Building modules, stage 2.
    MODPOST 2 modules
    CC drivers/usb/serial/baseband_usb_chr.mod.o
    LD [M] drivers/usb/serial/baseband_usb_chr.ko
    CC drivers/usb/serial/ftdi_sio.mod.o
    LD [M] drivers/usb/serial/ftdi_sio.ko

  • 安装编译好的模块

    1
    2
    sudo cp drivers/usb/serial/ftdi_sio.ko /lib/modules/$(uname -r)/kernel
    sudo depmod -a

这块可能有问题,因为貌似每次都要 insmod ftdi_sio.ko 才能用

  • 确认驱动正确安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ubuntu@tegra-ubuntu:~/kernel$ dmesg | grep usb
[ 57.385970] usb 2-1.5: new full-speed USB device number 5 using tegra-ehci
[ 57.407931] usb 2-1.5: New USB device found, idVendor=0403, idProduct=6001
[ 57.407950] usb 2-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 57.407964] usb 2-1.5: Product: FT232R USB UART
[ 57.407976] usb 2-1.5: Manufacturer: FTDI
[ 57.407987] usb 2-1.5: SerialNumber: A601NG2B
[ 57.479238] ftdi_sio: version magic '3.10.24 SMP preempt mod_unload ARMv7 p2v8 ' should be '3.10.24-gf455cd4 SMP preempt mod_unload ARMv7 p2v8 '
[ 57.504885] usbcore: registered new interface driver ftdi_sio
[ 57.507384] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 57.508073] ftdi_sio 2-1.5:1.0: FTDI USB Serial Device converter detected
[ 57.508917] usb 2-1.5: Detected FT232RL
[ 57.508934] usb 2-1.5: Number of endpoints 2
[ 57.508948] usb 2-1.5: Endpoint 1 MaxPacketSize 64
[ 57.508960] usb 2-1.5: Endpoint 2 MaxPacketSize 64
[ 57.508971] usb 2-1.5: Setting MaxPacketSize 64
[ 57.511143] usb 2-1.5: FTDI USB Serial Device converter now attached to ttyUSB0

SPI 使用

SPI 能够实现 25MHz 的传输频率,但是默认并不开启,有大神详细地写了配置及使用方法。

挂载 USB 技巧

USB 挂载以后的序列号经常变,比如说原来是 /dev/ttyUSB0,下一次可能是 /dev/ttyUSB1,所以可以考虑用设备号挂载,比如说 /dev/serial/by-id/FTDI_XXX

ROS

ROS Wiki 上有针对 TK1 的页面,目前还不完善,可以跟踪。

安装 OpenCV

Till Nov.24th, OpenCV4Tegra is totally a piece of shit.

  • deb install cv-bridge
    ros-indigo-cv-bridge
  • modified line 112 of /opt/ros/indigo/share/cv_bridge/cv_bridgeConfig.cmake
  1. since cv4tegra does not contain libopencv_ocl
  2. the default route of cv4tegra is not armhf*

workaround

IMU

some more usefully tricks

  • show the content of a pkg

    1
    $ dpkg -L ***
  • hold a pkg

    1
    $ sudo apt-mark hold/unhold ***
  • download a deb

    1
    $ apt-get download ***
  • install a pkg no matter how

    1
    $ sudo dpkg --force-all -i ***

源码安装 pkg

wstool

一个例子:

1
2
3
4
$ wstool init src (if not already initialized)
$ wstool set -t src mavros --git https://github.com/mavlink/mavros.git
$ wstool update -t src
$ rosdep install --from-paths src --ignore-src --rosdistro indigo -y

最后一条会安装依赖。

rosinstall

似乎有这样一个工具 ros-install-generator,专门根据包名,去数据库里找包的源码仓库信息

1
$ sudo apt-get install python-rosinstall-generator

结合 tee,就可以生成一个用于安装的 yaml 文档,比如说想从上游安装 mavlink,可以这样

1
$ rosinstall_generator mavlink | tee rosinstall.yaml

再这么做,就安装好了

1
2
$ wstool init <pkg_path> ./rosinstall.yaml
$ catkin_make_isolated --install-space $ROSINSTALL --install -DCMAKE_BUILD_TYPE=Release

其中,$ROSINSTALL 需要自己配置好,如果 $ROSINSTALL 是一个需要权限的路径,比如说 /opt/ros/$ROS_DISTRO,最后一条命令加 sudo s

catkin_make

catkin_make 可以有 GUI 方式查看编译选项

1
$ catkin_make edit_cache

或者

1
2
$ sudo apt-get install cmake-qt-gui
$ cmake-gui build

手动添加第三方库

两种方式

  1. 将自己的程序做成库,用 PkgConfig 提供的宏自动找,这种方式需要自己写 pkg-config 文档
  2. 自己写 cmake 文档

显式指定编译器

1
2
3
4
5
6
7
8
9
10
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

rqt_plot

同时显示多个话题

1
2
$ rqt_plot /turtle1/pose/x:y:z
$ rqt_plot /turtle1/pose/x /turtle1/pose/y /turtle1/pose/z

后端

rqt_plot 可以使用不同后端, matplotlibqwt 慢或者支持不完善,推荐用 pyqtgraph

1
2
$ wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
$ sudo easy_install pyqtgraph

0X04 用 Qt Creator 作为 IDE (未测试)

  1. 安装好 qt 以后

    1
    export CMAKE_PREFIX_PATH=/opt/qt54/lib/cmake:$CMAKE_PREFIX_PATH
  2. open qt creator with the environment path

    1
    sh -i -c qtcreator
  3. open project

    • open the CmakeList.txt under your package file
    • choose the Build Location to be under your package file
      e.g. ../catkin_ws/src/hello/build
    • edit your Run Cmake to be like this:
      -DCATKIN_DEVEL_PREFIX=/catkin_ws/devel
      -DCMAKE_BUILD_TYPE=Debug

mavros 之前有一个老的版本,叫 mavlink_ros,比较简单,可以用来上手。

安装

官方网站有详细的介绍,强烈建议做之前看一看有没有更新。

土法安装

从源里面安装 mavlink,这个子不方便自己加 mavlink 消息,不推荐

1
$ sudo apt-get install ros-indigo-mavlink

然后同步 mavros 并编译

1
2
$ wstool set mavros_pkg --git https://github.com/mavlink/mavros.git
$ wstool update

注意: 编译的时候需要指定 mavlink 针对的平台。

1
$ catkin_make -DMAVLINK_DIALECT=pixhawk

高大上安装

先安装 mavlink

1
2
3
4
5
mkdir -p ~/ros_deps/src
cd ~/ros_deps
rosinstall_generator mavlink | tee rosinstall.yaml
wstool init src ./rosinstall.yaml
catkin_make_isolated --install-space $ROSINSTALL --install -DCMAKE_BUILD_TYPE=Release

其中,$ROSINSTALL 可以指定为 ~/catkin_ws/install

接下来和上面一样装 mavros 就好了。

使用

添加 custom message

添加 custom message 的时候推荐加到 pixhawk.xml

参考

tum_ardrone

tum_ardrone 里面包含一个针对 ARDrone 的,结合视觉的状态估计器,一个控制器及一个 GUI。状态估计器及 GUI 暂时用不上,不过控制器可以参考一下。

astec_mav_framework

里面有个 pelicon 的 urdf。

Python 通信

Google Group 里有人发过一个 Python 的例子

vicon

手动安装依赖

1
$ sudo apt-get install libeigen3-dev libyaml-cpp-dev