1 ]]>
http://ziyangli.github.io/2015/04/01/ros-replacement/
2015-04-01T09:12:32.000Z
2015-07-26T08:48:30.518Z
nanomsg nanomsg 是一个 c 语言的 socket 库,实现了好几种通信模式,包括:
PAIR - simple one-to-one communication
BUS - simple many-to-many communication
REQREP - allows to build clusters of stateless services to process user requests
PUBSUB - distributes messages to large sets of interested subscribers
PIPELINE - aggregates messages from multiple sources and load balances them among many destinations
SURVEY - allows to query state of multiple applications in a single go
其中, BUS, REQREP, PUBSUB 是 ROS 常见的形式。
这里 有相应的例程,不过感觉不是很对,比如说里面 REQREP 的例子,可以考虑直接看 API 文档 ,也包含简单的例子。
zeromq ]]>
nanomsg nanomsg 是一个 c 语言]]>
http://ziyangli.github.io/2015/03/29/linux-interrupt/
2015-03-29T07:42:02.000Z
2015-07-26T08:48:30.514Z
查看中断分配
典型输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 CPU0 CPU1 CPU2 CPU3 29: 18801666 16647304 15917474 14185149 GIC arch_timer 30: 0 0 0 0 GIC arch_timer 32: 0 0 0 0 GIC timer0 51: 0 0 0 0 GIC mmc1 52: 0 0 0 0 GIC tegra-otg, tegra-udc 53: 0 0 0 0 GIC pmc_usb_phy_wake_isr 55: 0 0 0 0 GIC tegra-sata 63: 68639 0 0 0 GIC mmc0 69: 142835 265551 0 0 GIC serial-tegra.1 71: 3748708 0 0 0 GIC tegra-xhci:usb1 97: 9260863 0 0 0 GIC host_syncpt 122: 602 0 0 0 GIC serial 131: 483307 0 0 0 GIC PCIe-MSI 642: 477100 0 0 0 PCIe-MSI eth3 643: 6232 0 0 0 PCIe-MSI iwlwifi
其中 serial-tegra.1 对应 TK1 上 /dev/ttyTHS1 的中断。第一列代表的是中断号,每个 CPU 下面的数字代表接收到的中断数。
默认情况下,系统用 CPU0 去收所有的中断。处理中断是非常耗时的任务,而系统又认为所有 CPU 的计算能力是一致的。当 CPU0 用了 30% 的资源去处理中断时,那别的 CPU 也只能发挥 70% 的计算性能,所以需要合理分配中断。
Affinity 指的是任务与处理器的亲和度。如果我们一直用处理器 X 运行任务 Y,两者 affine 。Affine 的情况下,处理器的 cache 里会存有任务部分的 memory,所以效率是比较高的。
和一般进程相反,对中断来说,affine 到某个处理器则会导致低效。因为中断程序往往非常小,将中断程序存在 CPU 里不能改善 cache hits,而多个中断会长期占用 CPU。调度器会认为所有核都和这个中断处理核一样忙,导致其它 CPU 实际上很空闲,但是缺用不上。
APIC (Advanced Programmable Interrupt Controller) APIC 负责分配中断,默认将所有中断交给 CPU0 处理。APIC 具有好几种传输 (delivery) 及 (destination) 模式,包括:
physical
logical
fixed
low priority
能够将中断绑到任意核上 (其实只能绑到前八个核),还能做负载均衡。
使用
对某些系统来说,可能需要先停掉 irqbalance 服务
1 # /etc/init.d/irqbalance stop
对每一个中断号, /proc/irq/ 下面都有一个对应的目录,下面有一个 smp_affinity 文件,通过修改这个文件,能够改变该中断绑定的核。
文件里存的是一个 16 进制的 bitmask。哪一位为 1,就用哪个核。
比如说我们要让 CPU1 处理 TK1 的串口中断,可以这样:
1 sudo bash -c 'echo 2 > /proc /irq/69 /smp_affinity'
理论上,f 能够使四个核平均处理中断。但是,实际结果还要看 APIC 是否处于 physical destination mode 及 low priority delivery mode,如果是的话才可以,可惜 TK1 不是。
在内核里关掉 CONFIG_HOTPLUG_CPU 可以使 APIC 正常工作
ubuntu 可以安装一个叫 irqbalance 的东西,说不定可以解决
]]>
查看中断分配
1
http://ziyangli.github.io/2015/03/29/linux-priority/
2015-03-29T06:16:42.000Z
2015-07-26T08:48:30.514Z
最近在 TK1 上用一个节点从飞控里读数据。单独跑的时候非常好,可是算法起来以后就各种延时,于是给这个节点提高优先级。
绑核 在我们的系统里,主要的算法都绑定了核,所以首先将节点绑定到空闲的 CPU 核上。有两种方式:
CPU_SET
待补充
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 参数线程参数里可以指定调度策略及优先级。
调度策略有普通及实时之分。普通策略有 OTHER , BATCH 及 IDLE ,没有优先级参数; 实时策略有 FIFO 和 RR ,优先级取值 1..99 。 top
命令 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 ,暴力一点,直接加一行
]]>
最近在 TK1 上用一个节点从飞控里读数据。单独跑的时候非常好,可是算法起来以后就各种延时,于是给这个节点提高优先级。
绑核 在我们的系统里,主要的算法都绑定了核,所以首先将节点绑定到空闲的 C]]>
http://ziyangli.github.io/2015/01/29/armadillo/
2015-01-29T08:37:02.000Z
2015-07-26T08:48:30.511Z
和 Mavlink 一样, Armadillo 也建议安装到 $ROSINSTALL
环境变量对应的目录里,这样子 ROS 程序的 CMakeList 比较容易写。
安装 从官网下载解压后,进入目录
1 2 cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=$(ROSINSTALL) . make install
不过想要 Armadillo 火力全开,还需要额外安装一堆数学库,又涉及到 Armadillo 编译时怎么引用 $ROSINSTALL
里的库的问题,暂未研究。
]]>
和 Mavlink 一样, Armadillo 也建议安装到 $ROSINSTALL
环境变量对应的目录里,这样子 ROS 程序的 CMakeList 比较容易写。
安装 从官网下载解压后,进入目录]]>
http://ziyangli.github.io/2015/01/19/pixhawk-convension/
2015-01-19T03:52:42.000Z
2015-07-26T08:48:30.514Z
PixhawkPixhawk 上的坐标系均为 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 轴正向朝天。
]]>
PixhawkPixhawk 上的坐标系均为 NED,即机头朝向为 x 轴正向,z 轴正向朝地。
加速度计 加速度计数值体现加速度。当水平静置飞机时,z 轴读数为 -9.8,意思是]]>
http://ziyangli.github.io/2015/01/12/shadowsocks/
2015-01-12T12:00:50.000Z
2015-08-24T02:51:59.000Z
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 . /configuremake && 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
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 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 用于引导对 DNS 服务器的访问,比如说访问国内地址,就去查 114 DNS 服务器,如果访问国外地址,就去查 8.8.8.8 服务器。
]]>
Shadowsocks服务器端
http://ziyangli.github.io/2015/01/06/3dr-radio/
2015-01-06T03:48:17.000Z
2015-07-26T08:48:30.511Z
配置无线串口可以提高发射功率、波特率,改变网段避免冲突,官方有指导 。
安装依赖 SDCC 1 sudo apt-get install sdcc
编译固件 1 2 3 git clone https: //github.com /tridge/SiK.git cd SiK/Firmwaremake 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 没到,串口会收集数据包,到了以后一次全发送出去; 提高发送频率,会导致每次发送的数据包数量变少,减少的数量大于频率提高增加的数量,所以带宽就小了。
]]>
配置无线串口可以提高发射功率、波特率,改变网段避免冲突,官方有指导 。
http://ziyangli.github.io/2014/12/20/jetsontk1/
2014-12-20T05:40:22.000Z
2015-08-24T16:41:26.699Z
烧系统手动方法 参考官方指南 ,并且优先选择 Grinch Kernel ,因为带了很多驱动。
21.2 版本的网络驱动有问题, Grinch Kernel 页面有介绍怎么搞,但是不是最优方案,复杂的解决方案看这里 。
注意在烧写的那一步,为了用完板子的 16G 空间,用以下命令:
1 $ sudo ./flash.sh -S 14580 MiB jetson-tk1 mmcblk0p1
利用官方 JetPack 工具 官方 JetPack 会自动下载内核、文件系统、cv4Tegra、CUDA 以及一些测评工具,一步步配置并在最后推送到板子上,比较简单。
缺点是看不出来怎么复用原来做好的系统,似乎每烧一块版都要解压一次文件系统并配置。而且这个工具比较新,非常不稳定。
配置 优先参考elinux wiki ,然后
添加 MIT 的源
1 2 3 4 5 6 7 8 9 10 deb http: deb http: deb http: deb http: deb http: deb-src http: deb-src http: deb-src http: deb-src http: deb-src http:
利用 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
安装 cuda
及 opencv4tegra
还需要到 cuda
安装页面 看看怎么添加路径。
卸载方式也需要参考以上地址。
修改 .ssh/authorized_keys 添加内容,内容来自主机的 .ssh/id_rsa.pub
系统调优
增加 swapfile ROS 里常常有一些包,需要很大的编译空间。TK1 默认的 2G 内存完全不够,需要手动添加 swap 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/bin/bash fallocate -l 4 G swapfile ls -lh swapfile chmod 600 swapfile ls -lh swapfile mkswap swapfile swapon swapfile swapon -s
以上脚本会在执行的地方搞出一个 4G 的 swap 空间,执行完以后,系统空间就少了 4G。
开机自动挂载这个空间,需要修改 fstab。
1 /media/swapfile none swap sw 0 0
如果想要重新调整 swap 大小,切换到 swap 所在的目录,然后
1 2 3 4 dd if= /dev/zero of= swapfile bs= 1 M count= 2048 chmod 600 /swapfile mkswap /swapfile swapon /swapfile
编译内核 在 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
解决方案:
这块可能有问题,因为貌似每次都要 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 能够实现 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
since cv4tegra
does not contain libopencv_ocl
the default route of cv4tegra
is not armhf*
workaround IMU
some more usefully tricks
]]>
烧系统手动方法 参考
http://ziyangli.github.io/2014/12/17/ros-trick/
2014-12-17T08:53:13.000Z
2015-08-15T09:54:31.000Z
源码安装 pkg一个例子:
1 2 3 4 $ wstool init src (if not already initialized) $ wstool set -t src mavros $ wstool update -t src $ rosdep install
最后一条会安装依赖。
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
手动添加第三方库 有两种方式
将自己的程序做成库,用 PkgConfig 提供的宏自动找,这种方式需要自己写 pkg-config 文档
自己写 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 可以使用不同后端, matplotlib
及 qwt
慢或者支持不完善,推荐用 pyqtgraph
。
1 2 $ wget https: //bootstrap.pypa.io/ez _setup.py -O - | sudo python$ sudo easy_install pyqtgraph
0X04 用 Qt Creator 作为 IDE (未测试)
安装好 qt 以后
1 export CMAKE_PREFIX_PATH=/opt/ qt54/lib/ cmake: $CMAKE_PREFIX_PATH
open qt creator with the environment path
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
]]>
源码安装 pkg一个例子:
<]]>
http://ziyangli.github.io/2014/12/17/mavros/
2014-12-17T03:45:43.000Z
2015-07-26T08:48:30.514Z
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/srccd ~/ros_depsrosinstall_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 里面包含一个针对 ARDrone 的,结合视觉的状态估计器,一个控制器及一个 GUI。状态估计器及 GUI 暂时用不上,不过控制器可以参考一下。
里面有个 pelicon 的 urdf。
Python 通信 Google Group 里有人发过一个 Python 的例子 。
手动安装依赖
1 $ sudo apt-get install libeigen3-dev libyaml-cpp-dev
]]>
mavros 之前有一个老的版本,叫 mavlink_ros ,比较简单,可以用来]]>
http://ziyangli.github.io/2014/12/17/qgroundcontrol/
2014-12-17T03:05:10.000Z
2015-07-26T08:48:30.518Z
依赖安装Qt5.4 自从某个版本以后,编译 QGroundControl 要求 Qt5.4,Ubuntu 14.04 需要自行添加 ppa 。
1 2 $ sudo add-apt-repository ppa:beineri/opt-qt541-trusty $ sudo apt-get install qt54tools qt54base qt54declarative qt54serialport qt54svg qt54webkit qt54quickcontrols qt54xmlpatterns qt54x11extras qt54websockets qt54sensors qt54script qt54quick1 qt54qbs qt54multimedia qt54location qt54imageformats qt54graphicaleffects qt54creator qt54connectivity
ppa 安装的 QT 位于 /opt/qt54 ,需要手动在 .bashrc 里添加来屏蔽系统 qt
1 2 ## qt 5.4 source /opt/ qt54/bin/ qt54-env.sh
貌似加在 ~/.profile
会更好,登录就启用
SDL1.2 1 $ sudo apt-get install qtcreator qttools5-dev qtbase5-dev qt5-default qtdeclarative5-dev libqt5serialport5-dev libqt5svg5-dev libqt5webkit5-dev libsdl1.2-dev build-essential libudev-dev
定制编译 需要设置的编译选项可以创建并写在 user_config.pri 文件里,比如说关闭 qupgrade ,设置 mavlink dialect 之类的。
1 2 DEFINES="DISABLE_QUPGRADE DISABLE_3DMOUSE" MAVLINK_CONF="pixhawk"
额外功能 额外功能包括语音提示,3D flight view 之类的东西,参考官方指示安装
1 $ sudo apt-get install espeak libespeak-dev libopenscenegraph-dev
XBee QGroundcontrol 内部包含了一个 xbee 的库,可以这样安装
1 2 3 $ cd libs/thirdParty/libxbee$ make$ sudo make install
编译
qmake 似乎执行一种 incremental build 的策略,据说不是很可靠,所以必要的时候需要先删除 build_release 。
]]>
依赖安装Qt5.4 自从某个版本以后,编译 QGroundControl 要求 Qt5.4,Ubuntu 14.04 需要自行
http://ziyangli.github.io/2014/12/12/pixhawk-rc/
2014-12-12T14:05:29.000Z
2015-07-26T08:48:30.514Z
生产RC 信号由 src/drivers/px4io/px4io.cpp#L1653 发布,频率上限只有 50Hz (由 IO_POLL_INTERVAL 限制)。
事实上在同一块代码里发现,对电调的 PWM 输出也是限制在 50Hz。
发布载体为 struct rc_input_values
,sensors.cpp 中 rc_poll() 流程如下:
发布流程图 表明,无论信号质量怎样, rc_channels 总是会广播。本信息放的是归一化后的各通道数值,限制在 -1~1
根据 rc_channels 的处理方式,油门的 trim 设置非常重要,一定等于该通道的最小值
如果信号质量正常,还会广播以 struct manual_control_setpoints_s
为载体的 manual_control_setpoint
在 manual 控制模式下,本消息会复制到 _v_att_sp 供姿态控制 app 使用
最后,manual_control_setpoint 会复制到 actuator_controls_3 ,至于怎么用,需要进一步研究
内部消费 mavlink 消费 mavlink 模块会发送两种 RC 包,分别为 RC_CHANNELS_RAW
及 RC_CHANNELS
。
RC_CHANNELS_RAW RC_CHANNELS_RAW 是为了兼容老的飞控搞的一个消息。生成机制如下:
首先,消息载体 mavlink_rc_channels_raw_t
只能装 8 路信号,然后一位 port
指示这 8 路走哪个端口。事实上好的遥控器很容易就超过 8 路,比如说有 18 路的 Futaba,那么这个载体肯定是不够用的。在这种情况下,port
可以复用来指示是低 8 路,中 8 路或者高 8 路;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 typedef struct __mavlink_rc_channels_raw_t { uint32_t time_boot_ms; uint16_t chan1_raw; uint16_t chan2_raw; uint16_t chan3_raw; uint16_t chan4_raw; uint16_t chan5_raw; uint16_t chan6_raw; uint16_t chan7_raw; uint16_t chan8_raw; uint8_t port; uint8_t rssi; } mavlink_rc_channels_raw_t ;
然后,在 uORB 上实际在走的 rc 载体是 struct rc_input_values
,除去 18 路信号外,还包含时间戳,丢包统计之类的东西,参见 drv_rc_input.h#90L
;
mavlink 发送 RC 包的时候,会循环 3 次,发送 MAVLINK_MSG_ID_RC_CHANNELS_RAW
信息(因为一次只能发 8 路。。。)
RC_CHANNELS 在 RC_CHANNELS_RAW
消息发送以后,mavlink 会紧跟上发送 RC_CHANNELS
。RC_CHANNELS
的载体是 mavlink_rc_channels_t
,跟 struct rc_input_values
相比,主要是少了丢包信息。
优化 简单地说,RC_CHANNELS_RAW
基本不会用到,发送频率又跟 RC_CHANNELS
绑定,最好的方法是直接注释掉。
]]>
生产RC 信号由 src/drivers/px4io/px4io.cpp#L1653 发布,频率上限只有 50Hz (由 IO_POLL_INTERVAL ]]>
http://ziyangli.github.io/2014/12/10/git/
2014-12-10T09:21:44.000Z
2015-07-26T08:48:30.511Z
基本命令1 2 3 4 5 git config --global user.name ziyangli git config --global user.email ziyang.d .lee @gmail.com git config --list #查看配置的信息 git help push/config
新建仓库 1 2 git remote add origin git@github.com:***/test .git # 添加源 git push -u origin master # push 新建仓库到 origin 源,同时设置默认 up -stream 分支为 master
建立 fork 与上游版本的同步 显示目前项目的上游路径都有哪些,自己的一般是 origin
打头
添加上游路径1 $ git remote add upstream https: //github.com /ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
下载上游版本
Merge the changes from upstream/master
into your local master
branch1 $ git merge upstream/master
]]>
基本命令1
http://ziyangli.github.io/2014/12/09/pixhawk/
2014-12-09T08:36:25.000Z
2015-07-26T08:48:30.518Z
资源Lorenz 最近重新整理了一下 wiki ,非常值得一个一个页面浏览一遍。
主要是安装依赖并将用户加入 dialout 组及 plugdev 组
1 2 $ sudo usermod -a -G dialout $USER $ sudo usermod -a -G plugdev $USER
然后安装 arm-gcc ,注意网上可以找到一个 ppa,但是不要使用,因为版本不对。
1 2 3 4 5 6 7 8 9 10 $ sudo apt-get install ia32-libs python -serial python -argparse grep $ sudo apt-get install flex bison libncurses5-dev autoconf texinfo build-essential libtool zlib1g-dev genromfs git wget $ pushd . $ cd ~ $ wget https: //launchpadlibrarian.net/174121628 /gcc-arm-none-eabi-4 _7-2014 q2-20140408 -linux.tar.bz2 $ tar -jxf gcc-arm-none-eabi-4 _7-2014 q2-20140408 -linux.tar.bz2 $ exportline="export PATH=$HOME/gcc-arm-none-eabi-4_7-2014q2/bin:\$PATH" $ if grep -Fxq "$exportline" ~/.profile ; then echo nothing to do ; else echo $exportline >> ~/.profile ; fi $ . ~/.profile $ popd
烧程序并上传固件 如果 NuttX 更新过1 2 3 4 $ make distclean$ make clean$ make archives$ make px4fmu-v2_default
否则1 2 $ make clean$ make px4fmu-v2_default
上传1 $ make upload px4fmu-v2_default
经测试,这一步一定要先卸载 modemmanager
1 $ sudo apt-get remove modemmanager
启动顺序由 /etc/init.d/rcS
控制,步骤:
检测硬件
加载传感器驱动
其他 apps
所有用于自动启动的脚本都位于 ROMFS/px4fmu_common/init.d/
。
所以牛逼的人才自己写 etc/rc.txt
,自己修改时改 etc/config.txt
及 etc/extras.txt
重刷固件的时候,SYS_AUTOCONFIG = 1
,导致所有参数重置(包括这个变量)。
重刷后依然想保留的配置(mixer , output mode , PWM range etc.),应该写在 etc/config.txt
里面。
The mavlink application sends and receives MAVLink packets on a serial port and translates them into the onboard object request broker structure.
app 功能
航点管理 (waypoint management)
用户在地面站输入航点
mavlink app 接收航点
app 确定当前位置及当前激活航点的偏差判断是否到达
当前激活当点会作为位置控制器的输入
参数更新 (updating of parameters)
使用 系统启动以后自动 TELEM1 (/dev/ttyS1
) 开 mavlink。
如果希望用串口 (serial 4),需要自己手动启动或者加到启动脚本里。
1 nsh> mavlink start -d /dev/ttyS6 -b 460800
usb 口 (/dev/ttyACM0
) 比较特殊,默认开的是一个 nsh,不发送 mavlink 信息。但是连上 QGC 以后,QGC 会通过 nsh 开 mavlink! 。
1 2 3 4 5 6 7 8 9 const char init[] = {0x0d , 0x0d , 0x0d };link->writeBytes(init, sizeof (init)); const char * cmd = "sh /etc/init.d/rc.usb\n" ;link->writeBytes(cmd, strlen (cmd)); link->writeBytes(init, 4 );
mavlink log Mavlink 提供三种 log 功能。
1 2 3 mavlink_log_emergency(_fd, _str) mavlink_log_critical(_fd, _str) mavlink_log_info(_fd, _str)
这样子使用:
1 2 3 4 #include <mavlink/mavlink_log.h> static int mavlink_fd;mavlink_fd = open(MAVLINK_LOG_DEVICE, 0 ); mavlink_log_info(mavlink_fd, "[myapp] Hello, this is myapp talking." );
MAVLINK_LOG_DEVICE = “/dev/mavlink”
这个设备由 mavlink_main.cpp
注册,其它模块只打开及写入
mavlink_log.h
由 mavlink 提供,不是 Pixhawk 的一部分
其它 Output Mixers
The output mixer
defines how the controller output gets mapped to the motor and servo outputs.
不同飞机的 mixer 都放在 etc/mixers
,文件夹内有 README 可以看文件格式定义
个人定制的 mixer 文件命名为 FMU_ABC.mix
,然后通过 MIXER = FMU_ABC
来使用
Custom Modeletc/config.txt
内可以定制机架类型。如果要定制 a quadcopter with “+” configuration with ESCs connected to PX4IO and custom PWM range (1100…1900) ,大概写成这样:
1 2 3 4 5 6 7 8 9 # Generic Quadcopter + set VEHICLE_TYPE mcset MIXER FMU_quad_+# PX4IO PWM output will be used by default set PWM_OUTPUTS 1234 # Change parameters for the first 4 outputsset PWM_RATE 400 # Set PWM rate to 400 Hz for better performanceset PWM_DISARMED 900 # Motors should stop at this PWM value set PWM_MIN 1100 # Motors should spin at low, idle speed at this PWM value set PWM_MAX 1900 # Motors should spin at max speed at this PWM value
断流器 (Circuit Breakers) 用来在软件上屏蔽某些模块。
例如想省去每次上电需要按 safety switch 的步骤,就可以使 CBRK_IO_SAFETY = 22027
。
]]>
资源Lorenz 最近重新整理了一下]]>
http://ziyangli.github.io/2014/12/09/hexo/
2014-12-09T08:12:04.000Z
2015-08-24T03:13:28.000Z
安装 nvm (Node Version Manager)利用官方脚本
脚本会把 nvm 克隆到 ~/.nvm
1 2 $ wget -qO- https: //raw.github.com /creationix/nvm/master/install.sh | sh $ nvm install stable
显示安装的实际版本
Update
安装并初始化 Hexo
进入博客文件夹(assume Documents/gist_src
)
生成静态文件
!!! make sure rendering plugins have already been installed
预览
安装必要插件Be noticed, it seems that all the plugins will be intalled under gist_src/node_modules/
To update all the plugins, just
RendererThe following renderers seem to be must-have if you need to view the html result locally.
1 2 3 $ npm install hexo-renderer-ejs $ npm install hexo-renderer-stylus $ npm install hexo-renderer-marked
MathJax Show math locally:
1 $ npm install hexo-renderer-mathjax
修改 _config.yml
1 2 plugins: - hexo-renderer-mathjax
Hexo tags that enable you to reference files in post asset with relative path
1 $ npm install hexo-tag-asset-res --save
使用 发现新终端内总是需要先开启 nvm
设定归档页面文章的篇数 安装 Hexo 插件。在站点目录下使用 npm install --save
安装如下扩展:
hexo-generator-index
hexo-generator-archive
hexo-generator-tag
安装完成后,在 站点配置文章 中,设定:
index_generator :
per_page : 5
archive_generator :
per_page : 20
yearly : true
monthly : true
tag_generator :
per_page : 10
将 per_page 设定成所需要的篇数
]]>
安装 nvm (Node Version M]]>