当前位置: 首页 > news >正文

Linux内核 - 非仿生机器人之感知主控系统(协议栈)

Linux内核 - 非仿生机器人之感知主控系统(协议栈)

  1. 注:该项目为18年实习期间,参与非仿生六足机器人(Linux方案)的个人理解和积累。
  2. 时至今日,再看其实仅为一套系统编程相关框架,一直为私密,分析后不涉及泄密等问题,于是开放供基础学习和参考**
  3. 此处内容仅为案例,已屏蔽和删除涉密内容,仅供交流学习,勿做其他不合适使用。

1 robot 感知控制系统数据通信结构体

  • 通信结构体包含:数据头,航向角、俯仰角、横滚角、加速度、角速度、磁强度、温湿度及烟雾模拟AD值数据尾(64个字节)
struct storage_info
{unsigned char index[2];      
//数据头index[0]=0x55 index[1] =0xaasigned 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;
//取消结构体内存对齐char1个字节
signed short    2个字节
float:          4个字节
2+24+36+2 = 64(内存对齐68
  • 结构体赋值(64个字节)
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 感知控制系统命令通讯结构体

//从控制站下发命令给控制系统
struct msg   消息队列
{	 long type; //1L      	//命令类型long msgtype;      		//下发给那个线程unsigned char text[N];  //对设备进行具体操作;
};

3、robot 感知控制系统main及各线程

  • 功能:在主进程基础上,创建多个线程同时进行传感器及其他任务共同进行,为同步数据做基础。

3.1、感知模块 main逻辑

  • 在主程序基础上,创建各模块线程,同时进行工作,并且利用线程间同步机制简单实现同步数据并实时传输。
    (只是搭建了整体框架、还未移植已实现的传感器以及数据同步)
1.初始化并创建: 
温湿度线程、烟雾线程、IMU线程、摄像头线程、
接收/处理控制站命令线程、同步上传数据线程。2.简单初始化线程间通信相关同步变量。
(已实现: 各模块单独ARM上读取数据程序。)
(由于烟雾及温湿度部分模块问题,目前烟雾还差一点工作未实现)

3.2、感知系统 - 各线逻辑

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、感知主控稳定性问题

 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.数据传输方法及传输目标等等待续。。。。(简单定义了通讯结构体,有待指导建议) 

http://www.mrgr.cn/news/90523.html

相关文章:

  • 用AI绘制CAD气温曲线图
  • 初一说明文:我的护眼灯
  • pytest测试专题 - 1.1 运行pytest
  • 用easyExcel如何实现?
  • Unity项目实战-Player玩家控制脚本实现
  • 算法【状压dp】
  • android studio下载安装汉化-Flutter安装
  • 并发编程---多线程不安全示例以及解决,多线程创建方式
  • 【嵌入式Linux应用开发基础】read函数与write函数
  • 【工业安全】-CVE-2019-17621-D-Link Dir-859L 路由器远程代码执行漏洞
  • 自然语言处理NLP入门 -- 第三节词袋模型与 TF-IDF
  • haproxy+nginx负载均衡实验
  • 解锁大语言模型潜能:KITE 提示词框架全解析
  • DeepSeek-V3 技术报告
  • 设计模式全解(含代码实例)
  • 【科技革命】颠覆性力量与社会伦理的再平衡
  • web前端布局--使用element中的Container布局容器
  • C++基础学习记录—this指针
  • c#中“事件-event”的经典示例与理解
  • c++ 多线程知识汇总
  • 开发一个类似小红书的社交电商平台需要综合技术、产品和运营能力
  • 自然语言处理NLP入门 -- 第一节基础概念
  • 黑马Mistral Le chat逆转deepseek
  • 【NLP 21、实践 ③ 全切分函数切分句子】
  • lvsDR模式实现
  • Elasticjob在同一个实例上运行的多个分片任务