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…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
接口 RESTful 中的超媒体:REST 架构的灵魂驱动
在 RESTful 架构中,** 超媒体(Hypermedia)** 是一个核心概念,它体现了 REST 的 “表述性状态转移(Representational State Transfer)” 的本质,也是区分 “真 RESTful API” 与 “伪 RESTful AP…...
python数据结构和算法(1)
数据结构和算法简介 数据结构:存储和组织数据的方式,决定了数据的存储方式和访问方式。 算法:解决问题的思维、步骤和方法。 程序 数据结构 算法 算法 算法的独立性 算法是独立存在的一种解决问题的方法和思想,对于算法而言&a…...

河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~
MySQL 基础概念 数据(Data):文本,数字,图片,视频,音频等多种表现形式,能够被计算机存储和处理。 **数据库(Data Base—简称DB):**存储数据的仓库…...
Three.js + Vue3 加载GLB模型项目代码详解
本说明结合 src/App.vue 代码,详细解释如何在 Vue3 项目中用 three.js 加载并显示 glb 模型。 1. 依赖与插件导入 import {onMounted, onUnmounted } from vue import * as THREE from three import Stats from stats.js import {OrbitControls } from three/examples/jsm/co…...