5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)

标题: 不知道有没有人感兴趣, Pixhawk的一些中文开发文档 [打印本页]

作者: liio    时间: 2014-4-27 23:22
标题: 不知道有没有人感兴趣, Pixhawk的一些中文开发文档
相关的文档会陆续发布在我的博客
在翻译的同时也会加入一些自己的理解, 当然, 你也可以选择看原版。
下面这篇就是uORB的翻译, uORB是我认为在px4中的一个最基本的架构。由于论坛字数限制,只好发一个大概说明, 详细请到我博客察看: http://blog.arm.so/docs/167-0427.html

进程与应用程序(e.g. 传感器应用程序发送传感器数据到姿态过滤应用程序)之间的通讯是Pixhawk软件架构的重要组成部分。进程(在此文通常称之为节点)通过命名的总线交换的消息称之为“话题”,在Pixhawk 中,一个话题仅包含一种消息类型,例如:vehicle_attitude 话题传输包含姿态结构(滚动,俯仰和偏航估算(yaw estimates))的消息。节点可以在总线、主题上发布一条消息("Send" data) 或者订阅总线、主题("Receive" Data)。通讯双方之间并不知道在与谁通讯,可以存在多个发布者或一条消息有多个订阅者。这种设计模式可以防止锁定的问题,常用于机器人技术。为了保证高效,一条总线上始终只有一条消息,并且不使用队列存放。

Pixhawk的发布/订阅机制是通过“微对象请求代理”(micro object request broker,uORB)来实现,uORB实现了一个简单的发布/订阅模式。

快速入门
在深入细节之前,以下是一对简单、完整的发布/订阅模型。发布者发布一条名为“random_integer”的话题并用随机整数更新该话题。订阅者检查并打印这些更新。
原版翻译引用:http://pixhawk.org/dev/shared_object_communication




作者: liio    时间: 2014-4-27 23:24
求审核。。

作者: 爵爷    时间: 2014-4-28 00:07
你这翻译也太不容易理解了...还不如看原文呢

作者: 416786163    时间: 2014-4-28 00:08
顶一下

作者: liio    时间: 2014-4-28 10:28
爵爷 发表于 2014-4-28 00:07
你这翻译也太不容易理解了...还不如看原文呢

px4 项目用了很多“专用”术语  , 比如 advertise  。这个我实在不知道该怎么翻译 , 通篇看完后觉得公告最合适一点 还有topic, 这个其实翻译成话题 主题没多大区别吧? 要不给您翻译成帖子如何 ?


如果有问题请指出  ,少说这种没营养的一句话


作者: yl494706588    时间: 2014-4-28 10:37
支持楼主~
来自安卓客户端
作者: jordanwys    时间: 2014-4-28 11:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: hzbunny    时间: 2014-4-28 12:15
无私的奉献总是难能可贵的,楼主加油!
有难题可以在此提出,大家一起参与讨论
希望本帖长盛不衰!

作者: liio    时间: 2014-4-28 12:26
hzbunny 发表于 2014-4-28 12:15
无私的奉献总是难能可贵的,楼主加油!
有难题可以在此提出,大家一起参与讨论
希望本帖长盛不衰!

感谢支持 翻译只是第一蛋, 在此之后我会分析下uORB的逻辑并且给出一段linux下的同等代码。


作者: 爵爷    时间: 2014-4-28 13:20
liio 发表于 2014-4-28 10:28
px4 项目用了很多“专用”术语  , 比如 advertise  。这个我实在不知道该怎么翻译 , 通篇看完后觉得公 ...

有些专用术语可以不去翻译..直接引用原文比较容易理解..如果硬翻的话可能会引起歧义~~

作者: liio    时间: 2014-4-28 13:32
爵爷 发表于 2014-4-28 13:20
有些专用术语可以不去翻译..直接引用原文比较容易理解..如果硬翻的话可能会引起歧义~~

嗯 后期会把这方面的修改下。现在看来uORB部份可以不用说的这么仔细了。。

其实uORB就是一个类似共享内存的东西,它不需要使用信号同步的原因是 所有“订阅”者 必须只读的来访问其中的数据,并且同一时间内只会有一份有效数据,即便发布者进行多次更新发布 ,这次的数据会覆盖掉上一次的~~~

还以为有多悬 ,, 哎~


作者: 爵爷    时间: 2014-4-28 17:53
liio 发表于 2014-4-28 13:32
嗯 后期会把这方面的修改下。现在看来uORB部份可以不用说的这么仔细了。。

其实uORB就是一个类似共享 ...

不用队列是因为怕延时...如果不小心队列堆积了会造成不必要的延时..这种内存读取倒是有个好处..是肯定实时的..


作者: liio    时间: 2014-4-28 18:44
爵爷 发表于 2014-4-28 17:53
不用队列是因为怕延时...如果不小心队列堆积了会造成不必要的延时..这种内存读取倒是有个好处..是肯定实 ...

今天陆陆续续翻译了下 , 目前都翻译完了 ,就是很拗口,晚上或者明天开始分析uORB的实现代码
来验证是否是使用的共享内存, 目前看来 这种架构相对于共享内存来说它把消息接口当成文件i/o一样的处理,这样就可以使用poll模型来等待某个主题上的更新
而且可单向设置某一主题上消息的接收频率。 这个也要看一下~


作者: zmin21    时间: 2014-4-28 19:40
可以都志同道合的摩友一起来翻译....5i模型翻译组

作者: 爵爷    时间: 2014-4-28 20:03
liio 发表于 2014-4-28 18:44
今天陆陆续续翻译了下 , 目前都翻译完了 ,就是很拗口,晚上或者明天开始分析uORB的实现代码
来验证是 ...

但是这样做会不会有其他问题..比如文件锁一样的问题..还有就是频率对不上的话会不会导致读取缺失掉某个数据?

作者: liio    时间: 2014-4-28 20:12
爵爷 发表于 2014-4-28 20:03
但是这样做会不会有其他问题..比如文件锁一样的问题..还有就是频率对不上的话会不会导致读取缺失掉某个数 ...

目前还没有深入进去看这部分, 不过文件描述符不一定要与文件相关联,其实通俗的说就是一个句柄对象,与文件和io无关, poll调用的开销主要在线程调度 与其它无关


作者: liio    时间: 2014-4-28 20:14
zmin21 发表于 2014-4-28 19:40
可以都志同道合的摩友一起来翻译....5i模型翻译组

我不打算翻译他们的文档, 我会沿着rcS的启动顺序把一些沿途的模块给梳理一遍.搞清楚他们的系统架构,我的目的是为了移植到linux并且尽量保持原有的Real -time特性和高效.



作者: 爵爷    时间: 2014-4-28 20:26
liio 发表于 2014-4-28 20:12
目前还没有深入进去看这部分, 不过文件描述符不一定要与文件相关联,其实通俗的说就是一个句柄对象,与文件 ...

那就是一个指针而已...不过估计不可能就一个单一的指针..


作者: 抓食者    时间: 2014-4-28 20:39
liio 发表于 2014-4-28 20:14
我不打算翻译他们的文档, 我会沿着rcS的启动顺序把一些沿途的模块给梳理一遍.搞清楚他们的系统架构,我的 ...

楼主真棒,支持你!

我也想在改进pixhawk代码方面做一点工作,正在思考怎么开始

它的改写比apm复杂


作者: 抓食者    时间: 2014-4-28 20:46
楼主是专门搞软件的吗?我看到博客里很多关于软件开发的文章



作者: liio    时间: 2014-4-28 21:06
抓食者 发表于 2014-4-28 20:46
楼主是专门搞软件的吗?我看到博客里很多关于软件开发的文章

博客有部分i9300手机上传感器的native代码.  但很久都没有更新了.  你有兴趣我也可以share出来


作者: liio    时间: 2014-4-28 21:08
爵爷 发表于 2014-4-28 20:26
那就是一个指针而已...不过估计不可能就一个单一的指针..

一般的封装过程无非就是两种, 1指针,指向自定义的一个上下文结构体, 2内核对象, 这个略复杂一点. 所以要进一步分析


作者: 爵爷    时间: 2014-4-28 22:20
liio 发表于 2014-4-28 21:08
一般的封装过程无非就是两种, 1指针,指向自定义的一个上下文结构体, 2内核对象, 这个略复杂一点. 所以要 ...

指针可能性最大..内核对象貌似除了复杂没啥优点..C不熟...美版


作者: liio    时间: 2014-4-28 22:50
本帖最后由 liio 于 2014-4-28 22:53 编辑
爵爷 发表于 2014-4-28 22:20
指针可能性最大..内核对象貌似除了复杂没啥优点..C不熟...美版

看了下uORB的实现。 其内部就是一个虚拟的I/O节点+POLL接口
每次open时拉开一个定长buffer用来日后发布公告时存放数据。也就是要传输的数据。
而发布者只能以只写打开这个节点, 订阅者只能以只读打开(同一个节点)。 每次写完就用poll去通知那些读的订阅户

那么这个在linux中怎么移植呢.. 考虑了2种方案
1、 共享内存+信号, 设计一个数据结构  由头+负荷组成, 头中包含了消息的状态以及异步信号。 发布者创建这块共享内存,初始化相关的异步信号,订阅者打开这块内存,映射到自己空间  这样每个订阅户要访问发布者的信息时就可以直接像访问本地内存一样的使用拉。
当然,可以像uORB一样设计一个函数接口, 设定轮旬的频率~ 还美其名曰 ,“单独设置频率,而不影响其它的订阅”

2、我用的是a n droid linux,那么我可以直接用binder, binder也是基于共享内存,但自我封装了一层。 貌似我用作飞控不需要这么大的开销。

所以, 我只需要一个能够支持到1Khz周期通讯的玩艺就差不多了。 一般sensors采样都不到这么高的频率。 也就是我通讯一个PAGE_SIZE(4KB)在1ms内完成。  我不能在通讯周期内有任何的内核/用户模式切换,切换一次就要花10ms了。这样,我会优先选择第1种方案,因为我不清楚binder中的实现会不会导致模式切换。 而第一种方案 ,我想模式切换只会发生在处理异步信号上。 而异步信号并不常用(既然都需要等了, 那就无所谓延迟了。而sensors采样可以直接使用轮询+频率设定解决)

还有轮询时每次轮完直接调用nanosleep(0) 放弃下cpu  避免过高占用  调度下其他进程~~~    哎 非实时系统干这个活还真是坑爹~
补充说明下,  uORB重载了CDev对象 ,整个px4代码如果一定要用分层概念来描述的话 就是类似于linux的R0.  优势阿~~




作者: 抓食者    时间: 2014-4-29 15:20
liio 发表于 2014-4-28 21:06
博客有部分i9300手机上传感器的native代码.  但很久都没有更新了.  你有兴趣我也可以share出来

博主太犀利了!!

如果我想开发pixhawk控制任务代码,博主任务应该从哪开始


作者: liio    时间: 2014-5-1 23:30
考虑了几个方案~
1. linux SysV IPC通信   - 失败
2. a n droid Ashmem 共享内存 - 失败

最后自己写了个内核模块, 实现了一套跨进程的通信来替代uORB.
20 bytes / 次的传输时 , 能达到180 KHz的频率
1K / 次 的传输时, 大约在160 KHz 的频率, 完全够用了。
测试环境是 ARM Linux - 三星 exynos 4412处理器
接口部分完全兼容uORB

实现了uORB就意味着剩下的模块可以完全照搬Pixhawk 而要做的仅仅是匹配下kernel以及hal部分
Pixhawk Linux 四轴又近了一步

作者: kmani    时间: 2014-5-2 00:00
翻译总比不翻译好,不能因噎废食。
不是每个模友英语水平都好。

作者: liio    时间: 2014-5-2 00:04
kmani 发表于 2014-5-2 00:00
翻译总比不翻译好,不能因噎废食。
不是每个模友英语水平都好。

pixhawk代码之所以难看 和 这个uORB有很大的关系
uORB通俗来讲就是消息的流水线,  比如传感器把原始数据抛到这个流水线上 , 一个类似于采集器的东西把所有数据收集好打个包 然后再抛到另一条流水线. 最后融合器从这上面取出数据进行姿态等计算~  
除了通讯以外 , 也可以发送命令~
  有兴趣的可以延着uORB看下去 就 比较容易理解了


作者: hitman1984523    时间: 2014-5-2 00:10
关注,准备入手个玩玩


作者: kmani    时间: 2014-5-2 02:42
liio 发表于 2014-5-2 00:04
pixhawk代码之所以难看 和 这个uORB有很大的关系
uORB通俗来讲就是消息的流水线,  比如传感器把原始数据 ...

十分感谢分享
没搞明白pix这么做的好处什么,好复杂的感觉


作者: liio    时间: 2014-5-2 07:16
kmani 发表于 2014-5-2 02:42
十分感谢分享
没搞明白pix这么做的好处什么,好复杂的感觉

流程是复杂了,但整体架构上比较清晰明朗.在以前的px4-imu时代,也就是他们重构前, 那份代码虽然直接,但sensor,姿态融合,mavlink等所有代码全部参杂在一起,非常不利于维护
px4-fmu是重构后的版本(v1开始重构). 重构后虽然复杂,但架构至少合理了一点.  起码不用担心他再重构了~ 因为目前看来架构上px4确实下了点功夫. 我就是被之前的imu坑了 之前没看到fmu的代码 直接把老的imu代码移植到linux 白搞了


作者: benniewang    时间: 2014-5-2 07:30
看看

作者: 抓食者    时间: 2014-5-3 18:46
liio 发表于 2014-5-2 07:16
流程是复杂了,但整体架构上比较清晰明朗.在以前的px4-imu时代,也就是他们重构前, 那份代码虽然直接,但sen ...

楼主,我看那个代码确实有点蒙圈。
可否私聊,指点一二?
qq315302189


作者: liio    时间: 2014-5-3 20:06
抓食者 发表于 2014-5-3 18:46
楼主,我看那个代码确实有点蒙圈。
可否私聊,指点一二?
qq315302189

uORB 的分析总结我写在了 http://blog.arm.so/docs/183-0503.html今天把uORB的代码完整的移植到了linux , 只是为了Real-Time性能 所以内核重写而已,包括ORB_DEFINE这些宏定义。 用起来相当方便。 测了一遍 感觉不错~
从今起 ,就是大量的代码搬运工作了。体力活了



作者: 抓食者    时间: 2014-5-5 22:16
liio 发表于 2014-5-3 20:06
uORB 的分析总结我写在了 http://blog.arm.so/docs/183-0503.html今天把uORB的代码完整的移植到了linux , ...

楼主,在px4代码开发的过程中,Git Github都起到了什么作用?
它们和所使用的开发环境什么关系?


作者: 抓食者    时间: 2014-5-5 22:22
liio 发表于 2014-5-3 20:06
uORB 的分析总结我写在了 http://blog.arm.so/docs/183-0503.html今天把uORB的代码完整的移植到了linux , ...

或者具体一点说,咱们可以怎么运用它?
为什么px4的官网让安装Github?



作者: kmani    时间: 2014-6-2 12:54
liio 发表于 2014-5-2 07:16
流程是复杂了,但整体架构上比较清晰明朗.在以前的px4-imu时代,也就是他们重构前, 那份代码虽然直接,但sen ...

pix是C语言编的吗?怎么出现了 class 和public啊,我看不懂百度了下发现是java里面的class MS5611 : public device::CDev{
public:







作者: 龍眼樹    时间: 2014-7-13 13:37

樓主加油!支持你!







欢迎光临 5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年) (http://bbs.5imx.com/) Powered by Discuz! X3.3