东风草堂博客

公众号:开发者来风

编译pixhawk环境搭建

参考原网页进行说明,有两种搭建环境的方式。

第一种为自动执行脚本(推荐),较为方便,但有问题需解决。

由于使用apt-get update时部分文件无法下载,导致脚本执行不完整,故可将ardupilot/Tools/scripts/install-prereqs-ubuntu.sh文件里的$APT_GET update行用#注释掉。

然后操作如下:

阅读全文 »

这段时间又参与了一个新的小项目,简单概括为蓝牙、智能、家居吧,虽然时间有点紧,还是希望能把这一些东西记录下来。


# BLE 什么是BLE?参考这篇[文章](http://www.mianfeiwendang.com/doc/e5f0219633d14d7b2d6ac032)做如下总结。 中文名称为蓝牙低功耗。主要特点为低成本、超低功耗、短距离、标准接口和可互操作性强,并且工作在免许可的2.4GHz ISM射频段,需要支持蓝牙4.0(系统为Android4.3及以上)的主机设备才能与其连接。

目前生产BLE芯片的厂家主要有CSR、TI、Nodic和NXP(QN902x),各个厂家芯片对比如下图

s

从如上图对比可以看出,NXP的QN902x在功耗方面比CSR和TI更省电,在接收灵敏度和模式方面比Nodic的胜一筹,它的从设备相比其它几家可以连接的更多,共有8个,这也算是蓝牙4.0的一大特色吧,并且NXP的芯片已经过了MFI认证,直接能与苹果设备相连接,因为这种认证也是挺贵的。

阅读全文 »

代码调用关系可使用doxygen工具,cmake中使用doxygen,总体的代码结果图如下:

具体可参考APM飞控浅析


# ArduPilot编程库 这些[库](https://github.com/diydrones/ardupilot/tree/master/libraries)是和Copter, Plane and Rover共享的,具体的库及功能可见[原文](http://dev.ardupilot.com/wiki/apmcopter-programming-libraries/)。
  • 核心库
  • AP_AHRS —— 使用DCM或扩展卡尔曼滤波姿态估计
  • AP_Common —— 所有草图和库所需要的核心包括
  • AP_math —— 各种数学函数尤其对向量操作有用
  • AC_PID —— PID控制器库
  • AP_InertialNav —— 惯性导航库,用于融合加速度计、gps和气压计的数据输入
  • AC_AttitudeControl —— 姿态控制库
  • AP_WPNav —— 航点导航库
  • AP_Motors —— 多轴和传统的直升机电机混合
  • RC_Channel —— 这个库将更多的转换为PWM输入/输出,将来自APM_RC的数据转换为内部单位,如角度
  • AP_HAL, AP_HAL_AVR, AP_HAL_PX4 —— 这库实现“硬件抽象层”,这向高级别代码提供了一个相同的接口,以便它可更容易地移植到不同的板
  • 传感器库
  • AP_InertialSensor —— 读取陀螺和加速度计数据,执行校准和以标准单位(度/秒,米/秒),向主代码和其它库提供数据
  • AP_RangeFinder —— 声纳和红外距离传感器接口库
  • AP_Baro —— 气压计接口库
  • AP_GPS —— gps接口库
  • AP_Compass —— 3轴罗盘接口库
  • AP_OpticalFlow —— 光学流量传感器接口库
  • 其他库
  • AP_Mount, AP_Camera, AP_Relay —— 摄像头安装控件库,相机的快门控制库
  • AP_Mission —— 从EEPROM存储/检索任务的命令
  • AP_Buffer —— 与惯性导航使用的简单FIFO缓冲区

# 姿态控制 代码结构如图所示
阅读全文 »

资源http://www.cplusplus.com


# 阅读笔记 - 才发现CC为标准UNIX C++编译器,而cc为标准UNIX C编译器。g++为GNU C++编译器,而GNU C++编译器的MS-DOS版本名为gpp。comeau编译器最为严格、标准。都是先生成.o文件,再生成.out文件。 - 在C中,main函数括号为空表示对是否接受参数保持沉默,而在C++中为空与跟void一样。C++中main函数默认返回0。 - cout是可扩展的,允许自行开发新的数据类型。 - short至少16位;int至少和short一样长;long至少32位,且至少与int一样长。 - sizeof对类型名使用时,必须加上括号。 - C++使用前一(两)位来标识数字常量的基数。如果第一位是1~9,则基数为10;如果第一位为0,第二位为1~7,则基数为8;如果前两位为0x或0X,则基数为16。 - 数据后缀标识存储的类型,如2344L,默认情况下为int型,除非太大,int装不下。 - char在默认情况下既不是有符号,也不是没符号。在符号很重要的情况下,一定要特别声明。 - E表示法适合于非常大和非常小的浮点数。如:+3.45E+6指的是3.45与1000000相乘的结果,E后为负数代表除以10的乘方。 - cout.setf(ios_base::fixed, ios_base::floatfield);,这样可以显示浮点数多余的零。 - 赋值计算在类型转换时,较大的数转换为较小的数时,原来的值可能超过目标类型的取值范围,这种情况结果将是不可确定的。将浮点型转换为整形时,C++采取截取(丢弃小数部分),而不是四舍五入。 - true被转换为1,false被转换为0,这些转换称为整形提升(int类型计算速度更快)。 - 传统C语言总是将float提升为double,即使两个操作数都是float。 - 强制类型转换的格式为:(typeName)value/typeName(value),第一种来自C语言,第二种来自C++语言。 - 用引号括起的字符串隐式的包括了结尾的空字符。如“S”表示两个字符,而‘S’单表示一个字符,更糟糕的是,“S”表示的是一个内存的地址。 - strlen函数返回的是存储在数组中字符串的长度,而不是数组本身的长度。另外strlen不会计算空字符。 - 为了能够输入多个单词,可以使用cin.getline()函数和cin.get()函数,getline丢弃了换行符,存储时用空字符替换,而get保留在了输入序列中,所以在使用这种方法时,需要不带任何参数的cin.get()调用读取下一个字符,也可以连续调用,如cin.get(name, ArSize).get()。 - string在C++中是作为类出现。string类具有自动调整大小的功能。输入字符串的方法为getline(cin, str)。
1
2
3
4
5
for (int i = 0; i < SIZE; i++)
{
cout << i + 1 << ": ";
getline(cin, list[i]);
}
- C++允许在结构声明中省略关键字struct,结构体成员中也能进行赋值操作。 - 结构中的位字段:字段的类型应该为整形或枚举型,接下来是冒号,冒号后面是一个数字,它指定了使用的位数。通常用在低级编程中。 - 匿名共用体:将共用体用于结构体中,它们的地址相同,所以不需要中间标识符。 - 枚举、枚举量:默认情况,第一个枚举量为0。另外枚举变量只定义了赋值运算,没有定义算术运算。可自动转换为int型。如果只打算使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称。可以创建多个值相同的枚举量。可以将在取值范围内的任意整数赋给枚举量。 - 面向对象编程和传统的过程性编程的区别在于,OOP强调的是在运行阶段(而不是编译阶段)进行决策。动态联编/静态联编。 - 如果给cout提供一个地址,如果指针的类型为char *,则cout将显示字符串,如果要显示字符串的地址,应该使用int *。 - cout.setf(ios::boolalpha)函数调用设置了一个标记,该标记命令cout显示true和false,而不是1和0。 - C++规定,逗号表达式的值是第二部分的值。如cats = (17, 24)为24。 - C-风格字符串是通过结尾的空值字符定义的,而不是由其所在数组的长度定义的。这意味着两个字符串即使被存储在长度不同的数组中,也可能是相同的。 - cin将忽略空格和换行,如需读取,请使用cin.get(ch),其返回的是cin对象,在需要bool值的地方可以自动转换。相当于C规则的getchar(ch) - ctrl + D/Z相当于EOF,可以使用cin.eof()/cin.fail()返回的bool值进行检测,输入错误和EOF都将导致cin返回false,可以用cin.clear()进行清除然后重新输入。 - 从存储空间的角度来讲,指针数组比char数组的数组更为经济。 - if(17 < age < 35)的含义为if((17 < age) < 35),所以一直为真。 - &&的优先级高于||,但是c++实际运行时是按顺序的,如果||在前面就先执行前面的,比如++x||++y&&z++。 -
阅读全文 »

环境搭建

参考官网,注意这里需要采用Ubuntu15.10或者16.04。
具体命令简写如下:

1
2
3
4
5
6
7
8
9
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get update
sudo apt-get install ros-kinetic-desktop-full
sudo rosdep init
rosdep update
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt-get install python-rosinstall

基础ROS操作教程

开始基本操作

阅读全文 »

由于sublime的多平台性,以及也有很多强悍的插件可供使用,是我不得不将兴趣移植这个编辑器上面来。将查看代码而言,在linux下也可以通过wine安装sourceinsight,但是对于安装跟使用来说不是很方便,特别是有git项目的时候。


# 安装 首先下载安装[文件](http://www.sublimetext.com/2)。将下载好的文件解压至/opt,然后创建链接文件。
1
$ ln -s /opt/Sublime\ Text\ 2/sublime_text /usr/bin/

下面解决不能输入中文的问题
保存下面的代码到文件sublime_imfix.c(位于~目录,即主文件夹目录)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <gtk/gtkimcontext.h>

void gtk_im_context_set_client_window (GtkIMContext *context,
GdkWindow *window)
{
GtkIMContextClass *klass;
g_return_if_fail (GTK_IS_IM_CONTEXT (context));
klass = GTK_IM_CONTEXT_GET_CLASS (context);

if (klass->set_client_window)
klass->set_client_window (context, window);

g_object_set_data(G_OBJECT(context),"window",window);

if(!GDK_IS_WINDOW (window))
return;

int width = gdk_window_get_width(window);
int height = gdk_window_get_height(window);
if(width != 0 && height !=0)
gtk_im_context_focus_in(context);
}
阅读全文 »

本文将一个新手学习px4入门,装机,PID调节过程,以及试飞注意事项陈述如下:


# 器件准备

硬件一套,包括DJI F450机架、Pixhawk 2.4.6 mini飞控、好盈乐天20A电调、1045正反桨、银燕电机2216、天地飞6通道遥控器。详情见淘宝链接里的套餐方案

这些是PX4自动驾驶仪的元件要求:

  • 1x Pixhawk 或者 FMU + IO Kit (Pixhawk 和FMU + IO是一样的)
  • 1x u-blox GPS模块
  • 1x RC 接收器
  • 1x 无线数传
  • 多块3300 mAh LiPo电池,至少能提供25A/30A电流。最好是买几个相同的电池为了保持直升飞机更换电池的重量恒定。
阅读全文 »

PX4源代码

PX4项目建立在这些主要软件模块:

  • PX4 Flight Stack (estimation and control, cross-platform)

  • PX4 Middleware (IPC / ORB, *nix (NuttX, Linux, MacOS, etc))

  • PX4 ESC Firmware (for motor controllers)

  • PX4 Bootloader (for STM32 boards)

  • Operating System (NuttX or Linux/Mac OS)
    项目地址:

  • PX4 Firmware source

PX4飞行栈

PX4飞行栈能控制多轴飞行器,航模,直升机,实验飞机和地面车辆的飞行。它由一组单独的应用程序/节点组成。

阅读全文 »

这篇文章主要记录学习NuttX的过程以及对NuttX的理解,并结合apm里的px4-v2例程设置进行说明。


1.0 NuttX Operating System User’s Manual
============

NuttX Operating System User’s Manual从软件开发者的视角为NuttX提供一般的使用信息。


2.0 NSH 启动脚本------翻译自[NuttX文档1.8节](http://nuttx.org/doku.php?id=documentation:nuttshell),欢迎提出宝贵意见 ============

Tip: 源码中apps/nshlib/README.txt即为说明书。

阅读全文 »

注意:基于参考原因,本文参杂了APM的算法分析。

本篇文章首先简述了下px4和apm调用姿态相关应用程序出处,然后对APM的DCM姿态解算算法参考的英文文档进行了翻译与概括,并结合源代码予以分析,在此之前,分析了starlino的DCM,并进行了matlab的实现,因为它更加利于理解。后段时间会对px4的四元数姿态解算进行分析。姿态控制部分描述了串级PID在APM里的实现流程,同样后期会完善对px4的分析。最后针对自己平时使用的一些调试技巧进行了总结。

姿态出处分析

  1. 下面看下重要的一个脚本/etc/init.d/rc.mc_apps,可以知道姿态估计用的是attitude_estimator_q和position_estimator_inav,用户也可以选择local_position_estimator、ekf2,而姿态控制应用为mc_att_control和mc_pos_control。

    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
    #!nsh
    if param compare INAV_ENABLED 1
    then
    attitude_estimator_q start
    position_estimator_inav start
    else
    if param compare LPE_ENABLED 1
    then
    attitude_estimator_q start
    local_position_estimator start
    else
    ekf2 start
    fi
    fi

    if mc_att_control start
    then
    else
    # try the multiplatform version
    mc_att_control_m start
    fi

    if mc_pos_control start
    then
    else
    # try the multiplatform version
    mc_pos_control_m start
    fi
    ...
  2. 而在ardupilot中,姿态解算与控制算法在ArduCopter.cpp的fast_loop任务中以400Hz的频率运行。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // Main loop - 400hz
    void Copter::fast_loop()
    {

    // IMU DCM Algorithm
    // --------------------
    read_AHRS();
    ...
    }

    void Copter::read_AHRS(void)
    {
    ...

    ahrs.update();
    }

了解了上面的源码出处后,下面将分具体应用进行分析。

阅读全文 »
0%