源代码分析(2)

2019-05-17 19:06

等同于AP_HAL中的hal.scheduler->register_timer_process()。上述代码的意思是,HRT (high resolution timer)高精度定时器,以1000微妙的周期调用MPU6000::measure_trampoline函数。这些操作是禁止中断的,最多占用数十微妙的时间。 上面的优先级非常高。下面的方法,是稍低优先级。

work_queue(HPWORK, &_work, (worker_t)&HMC5883::cycle_trampoline, this, 1);

用于处理I2C设备。大概花几百微妙的操作时间。是可以被中断的任务。如果是最低优先级,那么参数改为LPWORK,这样的任务一般需要花费更长的时间。 6、AP_Scheduler任务调度系统

用于飞行器主线程,提供了简单的机制控制每个操作花费了多少时间。例如:1、等待一个新IMU采样;2、在每一个IMU采样周期之间调用一系列其他任务。

每一个飞行器都有一个AP_Scheduler::Task table任务列表,参考代码(ardupilot\\libraries\\AP_Scheduler\\ Scheduler_test.pde )类似如下:

static const AP_Scheduler::Task scheduler_tasks[] PROGMEM = { { ins_update, 1, 1000 }, { one_hz_print, 50, 1000 }, { five_second_call, 250, 1800 }, };

结构体第1列,循环调用的任务函数。第2列,调用频率(也叫tick,一个tick,就是一个最小时间单元,pixhawk为2.5ms)。第3列为最大可能占用的操作时间,scheduler.run()会传递当前可用的时间(微秒),如果时间不够,那么这个任务就pass掉了,不执行。 注意,AP_Scheduler::Task table列表必须具备以下条件: 1、 他们不能被阻塞。

2、 在飞行时,他们不能调用sleep function 3、 他们必须有可预估的最坏的运行时间。 你可以修改Scheduler_test.pde,加入自己的代码来读取气压计、罗盘、GPS、更新AHRS输出roll/pitch。 7、信号灯

有3种方法可以避免多线程访问冲突:1、信号灯;2、lockless data;3、PX4 ORB。 例如:I2C驱动可以通过信号灯,确保同一时间,只有一个I2C设备被使用。可以查看ardupilot\\libraries\\AP_Compass\\AP_Compass_HMC5843.cpp了解: 获得信号灯:_i2c_sem->take(1); 释放信号灯:_i2c_sem->give(); 8、Lockless Data Structures

Lockless Data Structures比信号灯要方便,例子见:

the _shared_data structure in libraries/AP_InertialSensor/AP_InertialSensor_MPU9250.cpp the ring buffers used in numerous places. A good example is libraries/DataFlash/DataFlash_File.cpp

Go and have a look at these two examples, and prove to yourself that they are safe for concurrent access. For DataFlash_File look at the use of the _writebuf_head and _writebuf_tail variables. 9、PX4 ORB

ORB(Object Request Broker)是PX4的互斥机制。

另外两种PX4驱动通信机制,列举如下:

ioctl calls (see the examples in AP_HAL_PX4/RCOutput.cpp)

/dev/xxx read/write calls (see _timer_tick in AP_HAL_PX4/RCOutput.cpp) 想要学习Pixhawk源码的朋友有福了,后边我会陆续的将Pixhawk的源码学习笔记整理出来分享给大家。敬请关注:新浪微博@WalkAnt,3017224@qq.com。欢迎交流。

Pixhawk源码笔记三:串行接口UART和Console

这里,我们对 APM UART Console 接口进行讲解。如有问题,可以交流30175224@qq.com。新浪@WalkAnt,转载本博客文章,请注明出处,以便更大范围的交流,谢谢。 第四部分 串行接口UART和Console

详细参考:http://dev.ardupilot.com/wiki/learning-ardupilot-uarts-and-the-console/ UART很重要,用于调试输出,数传、GPS模块等。 1、5个UART

目前共定义了5个UART,他们的用途分别是:

uartA – 串行终端,通常是Micro USB接口,运行MAVLink协议。 uartB – GPS1模块。

uartC – 主数传接口,也就是Pixhawk telem1接口。 uartD – 次数传接口,也就是telem2接口。 uartE – GPS2模块。

有些UART具备双重角色,比如通过修改SERIAL2_PROTOCOL参数,可以将uartD的Mavlink telemetry数传更改为Frsky telemetry数传(中国江苏产数传)。 测试 libraries/AP_HAL/examples/UART_test目录下的 example sketch,分别对5个UART都输出hello 消息。使用USB转串口工具,可以测试。 2、调试终端Debug console

作为5个UART的补充,有些平台额外的还有一个debug console调试终端。你可以通过检查HAL_OS_POSIX_IO宏定义来判断,诸如: #if HAL_OS_POSIX_IO ::printf(\ #endif

如果定义了HAL_OS_POSIX_IO,可以试着查看AP_HAL/AP_HAL_Boards.h代码。 3、UART函数

每个UART都一系列基本操作函数,主要有: 1. printf – formatted print

2. printf_P – formatted print with progmem string (saves memory on AVR boards) 3. println – print and line feed 4. write – write a bunch of bytes 5. read – read some bytes

6. available – check if any bytes are waiting

7. txspace – check how much outgoing buffer space is available

8. get_flow_control – check if the UART has flow control capabilities

可以到AP_HAL中查看他们的定义,并使用UART_TEST进行测试。 4、UART接口说明

众多UART接口,众多名称,他们的对应关系,我总结如下,如有问题,欢迎发邮件至30175224@qq.com 新浪@WalkAnt,欢迎指正。 代码定义 PCB电路表述 飞控板接口 Serial标号 说明 接USB,支持MAVLink协议 接GPS模块,另CAN2接口 接第1数传模块 接第2数传模块 一般接GPS2模块 Debug Console用于程序调试 APM代码中的电路板上的表Pixhawk外壳上串口序号 表述 述 的标识 uartA uartB uartC uartD uartE / Micro USB UART4 UART2 UART3 UART8 UART7 USB GPS Telem1 Telem2 SERIAL4/5 SERIAL4/5 USB Serial 3 Serial 1 Serial 2 Serial 4 Serial 5

前面的文章: Pixhawk源码笔记一:APM代码基本结构:http://blog.sina.com.cn/s/blog_402c071e0102v59r.html

Pixhawk源码笔记二:APM线程: http://blog.sina.com.cn/s/blog_402c071e0102v5br.html

经过对UART测试代码: libraries/AP_HAL/examples/UART_test)进行详细测试: void loop(void) {

// Micro USB口输出: Hello on UART uartA at 764.461 seconds test_uart(hal.uartA, \

// GPS接口输出:Hello on UART uartB at 91.845 seconds test_uart(hal.uartB, \

// 数传Telem1输出:Hello on UART uartC at 24.693 seconds test_uart(hal.uartC, \

// 数传Telem2输出:Hello on UART uartD at 805.557 seconds test_uart(hal.uartD, \

// SEIRAL 4口输出:Hello on UART uartE at 911.812 seconds test_uart(hal.uartE, \

// also do a raw printf() on some platforms, which prints to the // debug console #if HAL_OS_POSIX_IO

// SEIRAL 5口输出: Hello on debug console at 976.857 seconds

::printf(\on debug console at %.3f seconds\\n\hal.scheduler->millis()*0.001f); #endif

hal.scheduler->delay(1000); }

SERIAL 5 作为重要的调试口。Pixhawk启动时会通过该接口输出大量信息,可以用来对启动过程进行监控。

Pixhawk源码笔记四:学习RC Input and Output

这里,我们对 APM RC Input Output接口进行讲解。如有问题,可以交流30175224@qq.com。新浪@WalkAnt,转载本博客文章,请注明出处,以便更大范围的交流,谢谢。 第五部分 学习RC Input and Output

参考:http://dev.ardupilot.com/wiki/learning-ardupilot-rc-input-output/

RC Input,也就是遥控输入,用于控制飞行方向、改变飞行模式、控制摄像头等外围装置。ArduPilot支持集中不同RC input(取决于具体的硬件飞控板): 1. PPMSum – on PX4, Pixhawk, Linux and APM2 2. SBUS – on PX4, Pixhawk and Linux

3. Spektrum/DSM – on PX4, Pixhawk and Linux 4. PWM – on APM1 and APM2

5. RC Override (MAVLink) – all boards

其中SBUS and Spektrum/DSM是串行协议,SBUS为100kbps反UART协议,Spektrum/DSM为115200bps UART协议。对于PX4,这些协议是通过硬件UARTs实现的,而有些Linux系统是通过软件UARTs实现的。(原文:Some boards implement these using hardware UARTs (such as on PX4) and some implement them as bit-banged software UARTs (on Linux).)

RC Output,是指飞控接受到RC输入后,再将其处理后,输出到伺服和电机(电调)上。RC Output默认50Hz PWM信号。对于ArduCopter多轴飞行器和直升机,输出频率为400Hz。

1、RCInput对象(AP_HAL) RCInput 对象声明: AP_HAL::RCInput* rcin;

相关例程: libraries/AP_HAL/examples/RCInput/RCInput.pde ,试着动动遥控器手柄,看看输出是否符合预期。

2、RCOutput对象(AP_HAL) RCOutput对象声明:

AP_HAL::RCOutput* rcout;

不同的飞控,代码实现有所不同,可能包含了片上定时器、I2C、经由协处理器(PX4IO)输出等程序。

相关例程: libraries/AP_HAL/examples/RCOutput/RCOutput.pde 这段程序从1通道到14通道,控制电机从最小转速到最大转速逐级变化。 3、RC_Channel对象

hal.rcin和hal.rcout对象,为低层次调用。最常用的是使用更高级封装的RC_Channel 对

象来实现RC input 和 output。它允许用户对参数进行配置,例如每个通道min/max/trim值,同时支持辅助AUX通道函数,还可对input output进行比例缩放处理等。

相关例程: libraries/RC_Channel/examples/RC_Channel/RC_Channel.pde例程教你如何setup、read、copy input to output。

4、RC_Channel奇怪的input/output 设置

看代码时,有些地方程序会让你感到奇怪,有一些是由于程序代码的不完善产生的,有一些则不是。

例如,很多变量作用在input和output上:

radio_out = (pwm_out * _reverse) + radio_trim;

上述代码中的radio_trim,是一个trim叠加,用来修正遥控器的值。 又例如,对于固定翼飞行器,roll(横滚)输入,成为了steer(转向 yaw)。对于ArduCopter中的多轴飞行器,在处于Drift模式(漂移模式)时,我们看到,pitch用于前飞,roll用于转向(而不是传统yaw用于转向)。以后,APM团队会将其纠正过来,将这两个概念分开。大家知道这么回事就OK了。 5、RC_Channel_aux 对象

另一个非常重要的类:RC_Channel_aux class,它是RC_Channel的子类。它有很多特点可供用户使用。这个会有一点比较难以理解,举个例子:

用户想要使用通道6(Channel 6)对航拍设备的横向稳定进行控制,那么他可以将FUNCTION设置为21,枚举变量类型为” k_rudder”(偏航,偏转,转向的意思)。如下: AP_GROUPINFO(\ AP_GROUPEND

如果程序中调用此代码,RC_Channel_aux::set_servo_out(RC_Channel_aux::k_rudder, 4500);,那么所有FUNCTION设为21(k_rudder)的通道(channel)都将输出满偏(4500就是满偏最大值)。

在相应的update_aux_servo_function()代码中, case RC_Channel_aux::k_rudder:

_aux_channels[i]->set_angle(4500);// 设置最大角度。 break;

注意这是一对多的设置。就我的理解,其实也就是我们常说的混控输出。比如在辅助通道6中,我们可以将其他通道设置为使用function = 21。那么其他使用了21的通道,将会被通道6混控。(这个很复杂,我也没太明白,对这个有更好理解的,请一定告诉我,相互学习:30175224@qq.com。当然如果日后我能有更好的理解,我会更新本博客。) 下图,RC_Channel共4个通道,RC_Channel_aux共10个通道。 第一组:1、2、3、4、5、6、7、8、10、11(共10通道) 第二组:9、12 第三组:13、14


源代码分析(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:基于导游讲解视角的景区旅游形象感知研究-以凤凰古城为例

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: