Linux内核 - 非仿生机器人之感知主控系统(协议栈)
Linux内核 - 非仿生机器人之感知主控系统(协议栈)
- 注:该项目为18年实习期间,参与非仿生六足机器人(Linux方案)的个人理解和积累。
- 时至今日,再看其实仅为一套系统编程相关框架,一直为私密,分析后不涉及泄密等问题,于是开放供基础学习和参考**
- 此处内容仅为案例,已屏蔽和删除涉密内容,仅供交流学习,勿做其他不合适使用。
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;
//取消结构体内存对齐char : 1个字节
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.数据传输方法及传输目标等等待续。。。。(简单定义了通讯结构体,有待指导建议)
相关文章:
Linux内核 - 非仿生机器人之感知主控系统(协议栈)
Linux内核 - 非仿生机器人之感知主控系统(协议栈) 注:该项目为18年实习期间,参与非仿生六足机器人(Linux方案)的个人理解和积累。时至今日,再看其实仅为一套系统编程相关框架,一直为…...
CZML 格式详解,javascript加载导出CZML文件示例
示例地址:https://dajianshi.blog.csdn.net/article/details/145573994 CZML 格式详解 1. 什么是 CZML? CZML(Cesium Zipped Markup Language)是一种基于 JSON 的文件格式,用于描述地理空间数据和时间动态场景。它专…...
【gRPC-gateway】auth-通过拦截器从上下文中提取元数据用于认证,与从http header转发待认证数据到上下文进行验证,go案例
从grpc上下文中提取元数据用于认证 案例 interceptor.go package serverimport ("context""errors""google.golang.org/grpc""google.golang.org/grpc/metadata""strings" )// UnaryInterceptor 是一个 unary RPC 的拦截器…...
Sass基础知识以及常用知识整理
Sass基础知识以及常用知识整理 一、CSS 功能拓展 注意:>、 、和~的区分 1.1 嵌套规则 Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器,例如: #main p {color: #00ff00;width: 97%;…...
Redis 内存回收机制
Redis 是一个基于内存的键值存储系统,为了避免内存耗尽,Redis 提供了多种内存回收机制。以下是 Redis 内存回收的主要方式: 1. 过期键删除 Redis 支持为键设置过期时间,过期后会自动删除键以释放内存。 1.1 设置过期时间 SET key…...
docker安装mongo,导入、导出数据
1、docker安装mongo docker pull mongo docker run -d -p 27017:27017 --name mongodb mongodocker update mongodb --restartalways ## 开机自启动-d:表示以后台模式运行容器。 -p 27017:27017:将容器内部的 MongoDB 默认端口 27017 映射到宿主机的 27…...
Excel常用操作
Excel常用操作 学习资源 37_电子表格处理考点精讲_设置数据格式_哔哩哔哩_bilibili 快速输入数据与编辑数据 一个工作簿可以包含多个工作表 特殊数据的添加格式 输入负数, 例如-3、-5 常规输入, 直接输入-3、-5;使用(), 例如在单元格中输入(3)回车即可变为-3;上述括号不区分中…...
嵌入式EasyRTC实时通话支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc
EasyRTC已经完美支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc,总体SDK大小控制在680K以内(预计还能压缩100K上下): EasyRTC在hi3516cv610芯片上能双向通话、发送文字以及二进制指令,总体运行…...
在freertos中,中断优先级和任务优先级之间的关系和使用方法
中断优先级和任务优先级如何匹配?任务优先级不同任务之间该用多高的优先级?中断优先级不同中断中该用多高的优先级?中断优先级和任务优先级设置时,怎样设置可以让任务在调度时屏蔽中断?怎样设置可以让任务在调度时&…...
设置ollama接口能外部访问
为了配置Ollama以允许外网访问,你可以按照以下步骤进行操作: 确认Ollama服务已正确安装并运行: 使用以下命令检查Ollama服务的状态: bash Copy Code systemctl status ollama如果服务未运行,使用以下命令启动它&…...
Go GUI 框架, energy many-browser 示例解读
CEF 在 Go 中的应用实现 示例链接 1. 初始化和配置 在使用 CEF 创建基于浏览器的应用时,首先需要初始化并配置应用实例。 1.1 创建应用实例 // 创建CEF应用实例 app : cef.NewApplication()1.2 配置应用参数 // 设置缓存路径 rootCache : filepath.Join(const…...
Docker 部署 MongoDB | 国内阿里镜像
一、简易单机版 1、镜像拉取 docker pull registry.cn-hangzhou.aliyuncs.com/farerboy/mongo:8.0.5-rc1 2、运行镜像 docker run -it --name mongodb \ -e MONGO_INITDB_ROOT_USERNAMEmongoroot \ -e MONGO_INITDB_ROOT_PASSWORDmongoroot \ -v /wwwroot/opt/docker/mong…...
软件工程-软件设计
包括 从管理的观点看包括: 详细设计 概要设计 从技术的观点看包括: 数据设计(详细设计) 系统结构设计(概要设计) 过程设计(详细设计) 任务 分析模型——》设计模型——》设…...
Elasticsearch:15 年来致力于索引一切,找到重要内容
作者:来自 Elastic Shay Banon 及 Philipp Krenn Elasticsearch 刚刚 15 岁了!回顾过去 15 年的索引和搜索,并展望未来 15 年的相关内容。 Elasticsearch 刚刚成立 15 周年。一切始于 2010 年 2 月的一篇公告博客文章(带有标志性的…...
DeepSeek大模型一键部署解决方案:全平台多机分布式推理与国产硬件优化异构计算私有部署
DeepSeek R1 走红后,私有部署需求也随之增长,各种私有部署教程层出不穷。大部分教程只是简单地使用 Ollama、LM Studio 单机运行量化蒸馏模型,无法满足复杂场景需求。一些操作配置也过于繁琐,有的需要手动下载并合并分片模型文件&…...
Docker 部署 MySQL-5.7 单机版
一、镜像获取 # docker hub 镜像 docker pull farerboy/mysql:5.7 # 国内阿里镜像 docker pull registry.cn-hangzhou.aliyuncs.com/farerboy/mysql:5.7 以上两个镜像二选一即可 二、运行容器 docker run -dti --name mysql \n --privileged \n --cgroupns private \n --e…...
打破AI黑盒,拥抱开源力量:基于openGauss+DeepSeek的本地知识库,打造你的专属AI助手!
引言:什么是RAG和LLM? LLM (Large Language Model,大语言模型): 就像 ChatGPT 这样的 AI 模型,拥有强大的语言理解和生成能力,但它们的知识局限于训练数据,且可能产生“幻觉”(即生成不准确的信…...
java配置api,vue网页调用api从oracle数据库读取数据
一、主入口文件 1:java后端端口号 2:数据库类型 和 数据库所在服务器ip地址 3:服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1:column后变量名是数据库中存储的变量名 property的值是column值的…...
visual studio导入cmake项目后打开无法删除和回车
通过Cmakelists.txt导入的项目做删除和回车无法响应,需要点击项目,然后选择配置项目就可以了...
linux运行kettle 遇到问题汇总
1、把本地的repositories.xml 放在跟目录 2、配置机台名解析 vi /etc/hosts bogon是服务器名字,根据实际情况修改 3、指定内存和字符集 vi spoon.sh -Xms1024m -Xmx2048m -Dfile.encodingUTF-8 4、执行kettle job ./kitchen.sh /rep pg_kettle /user admin /pa…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
