Linux内核 - 非仿生机器人之感知主控系统(协议栈)
- 注:该项目为18年实习期间,参与非仿生六足机器人(Linux方案)的个人理解和积累。
- 时至今日,再看其实仅为一套系统编程相关框架,一直为私密,分析后不涉及泄密等问题,于是开放供基础学习和参考**
- 此处内容仅为案例,已屏蔽和删除涉密内容,仅供交流学习,勿做其他不合适使用。
1 robot 感知控制系统数据通信结构体
- 通信结构体包含:数据头,航向角、俯仰角、横滚角、加速度、角速度、磁强度、温湿度及烟雾模拟AD值数据尾(64个字节)
c
struct storage_info
{
unsigned char index[2];
//数据头index[0]=0x55 index[1] =0xaa
signed short yaw; //航向角
signed short pitch; //俯仰角
signed short roll; //横滚角
signed short ax; //X轴加速度
signed short ay; //Y轴加速度
signed short az; //Z轴加速度
signed short gx; //X轴角速度
signed short gy; //Y轴角速度
signed short gz; //Z轴角速度
signed short hx; //X轴磁强度
signed short hy; //X轴磁强度
signed short hz; //X轴磁强度
float temperature; //温度
float temperatureMIN; //温度下限
float temperatureMAX;//温度上限
float humidity; //湿度
float humidityMIN; //湿度下限
float humidityMAX; //湿度上限
float ad; //当前烟雾传感器电压值
float adMIN; //烟雾报警上限
float adMAX; //烟雾报警下限
unsigned char endex[2]; //0xaa 0x55
//数据尾
} __attribute__((packed)) REPO_ENV;
//取消结构体内存对齐
char : 1个字节
signed short 2个字节
float: 4个字节
2+24+36+2 = 64(内存对齐68)
- 结构体赋值(64个字节)
c
REPO_ENV.index[0]=0x55;
REPO_ENV.index[1] =0xaa;
REPO_ENV .yaw = ; //航向角
REPO_ENV .pitch; //俯仰角
REPO_ENV .roll; //横滚角
REPO_ENV .ax; //X轴加速度
REPO_ENV .ay; //Y轴加速度
REPO_ENV .az; //Z轴加速度
REPO_ENV .gx; //X轴角速度
REPO_ENV .gy; //Y轴角速度
REPO_ENV .gz; //Z轴角速度
REPO_ENV .hx; //X轴磁强度
REPO_ENV .hy; //X轴磁强度
REPO_ENV .hz; //X轴磁强度
REPO_ENV .temperature; //温度
REPO_ENV .temperatureMIN;//温度下限
REPO_ENV .temperatureMAX;//温度上限
REPO_ENV .humidity; //湿度
REPO_ENV .humidityMIN; //湿度下限
REPO_ENV .humidityMAX; //湿度上限
REPO_ENV .ad; //当前烟雾传感器电压值
REPO_ENV .adMIN;烟雾报警上限及下限
REPO_ENV .adMAX;
REPO_ENV .endex[0]=0xaa;
REPO_ENV .endex[1]=0x55
memcpy (data, &REPO_ENV, 64);
void *memcpy(void*dest, const void *src, size_t n);
功能
由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内
2、robot 感知控制系统命令通讯结构体
c
//从控制站下发命令给控制系统
struct msg 消息队列
{
long type; //1L //命令类型
long msgtype; //下发给那个线程
unsigned char text[N]; //对设备进行具体操作;
};
3、robot 感知控制系统main及各线程
- 功能:在主进程基础上,创建多个线程同时进行传感器及其他任务共同进行,为同步数据做基础。
3.1、感知模块 main逻辑
- 在主程序基础上,创建各模块线程,同时进行工作,并且利用线程间同步机制简单实现同步数据并实时传输。
(只是搭建了整体框架、还未移植已实现的传感器以及数据同步)
c
1.初始化并创建:
温湿度线程、烟雾线程、IMU线程、摄像头线程、
接收/处理控制站命令线程、同步上传数据线程。
2.简单初始化线程间通信相关同步变量。
(已实现: 各模块单独ARM上读取数据程序。)
(由于烟雾及温湿度部分模块问题,目前烟雾还差一点工作未实现)
3.2、感知系统 - 各线逻辑
c
1、温湿度线程:
1.1、已实现单独在PC及开发板数据读取。
1.2、已合并到主进程的温湿度线程中,并实现开发板移植。
1.3、实现串口相关设置,根据AT指令集编程实现读取相关温湿度数值。
2、IMU线程:(已实现,未合移植)
2.1、已实现单独在PC及开发板数据读取数据。
2.2、未合并到主框架中,由于接口问题未移植到开发板。
2.3、实现读取IMU各个坐标并根据厂家协议解读坐标值,实时更新数值。
3、摄像头线程:( 移植相关驱动和程序)
3.1、已实现方法1.
读取摄像头ARM接口Video,其解码并输出为avi。
实现读取mjpg格式数据,此处需注解码问题,数据外传及实时显示的实现;
3.2、已实现方法2.(网络常用方式)
移植Mjpg-stream到ARM开发板,实现局域网内客户端或网页端实时显示。
4、命令控制线程:( 情况待续。。。)
4.4、实现接收控制站遥控信号.实现动作控制。
4.2、实现接收遥控信号,实现视频(客户端及网页局域网内)实时传输。
4.3、实现接收遥控信号,同步所有数据信息,并进行实时信息上传。
5、数据刷新线程( 情况待续。。。)
实时刷新数据,并实现数据的同步。
4、相关问题记录
4.1、移植相关驱动
4.2、移植内核
4.3、数据采集
4.4、协议联调
4.5、机器人六足数据采集
4.6、机器人平衡&IMU坐标采集
4.7、USB线程和视觉采集
4.8、感知主控稳定性问题
c
A. 未知原因,两个USB接口只有一个接口可用。
(原因1. 接口硬件问题,有待返回商家检测。
原因2. 驱动问题,编译并移植了多次内核,仍无法解决
原因3. Linux最小根文件系统问题,
以上问题与技术支持探讨过,由于其中一个可暂时支持传感器数据提取工作,暂时稍后解决)
B. 其中一个可以的USB接口,插入USB-hub只能实现IMU、温湿度、烟雾接口同时共用,插上摄像头以后会出现接口错误。但是插上USB-HUB可以正确连接摄像头并正常使用。(即摄像头video与其他传感器不能在USB-HUB上同时使用,摄像头必须单独插一个USB接口)
(原因:1.驱动问题
(但是单独使用任何一个都没问题,不解。)
2.接口可能出现插入接触不良)
C. 由于所购买模块与开发板接口电压问题,导致部分小模块无法连接。
(原因:开发板GPIO输出电压太低,模块使用电压不常见,无法正常使用模块店家给的电压及接口转换模块)
(已解决:商家只换不退,更换了部分模块,返回的已经实现,目前还有一个小模块在路上(基本功能与接口应该是可以使用了,有待解决。))
D.传输问题
1 数据同步(目前考虑在实现主进程基础上,利用各线程间同步机制进行数据同步,有待指导建议)
2 未知传输端以及传输方法。(只是简单构建了一个通信协议结构体以及控制站命令接收的消息队列,有待建议指导。)
E.下面的工作:
1、待返回的烟雾模块,实现开发板数据提取
2、问题B,问题C。
3、将各部分传感器已单独实现的功能程序合并到主进程的各部分线程中,移植到开发板并基本实现在主进程下各模块线程的基本工作,为后续同步保存数据及发送数据做基础。
4.简单实现同步各部分数据。(有待建议指导)
5.接受控制站命令线程及数据上传同步刷新线程。
6.问题A。(重要问题)
7.在6的基础上,实现摄像头与其他传感器一同工作,并进行实时的数据传输和命令接收控制等。
8.数据传输方法及传输目标等等待续。。。。(简单定义了通讯结构体,有待指导建议)