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方案)的个人理解和积累。时至今日,再看其实仅为一套系统编程相关框架,一直为…...
Node.js 工具模块
Node.js 工具模块 引言 Node.js 是一个开源的、基于 Chrome V8 引擎的 JavaScript 运行时环境。它允许开发者使用 JavaScript 编写服务器端代码,从而构建快速、可扩展的网络应用。在 Node.js 开发过程中,工具模块扮演着至关重要的角色。本文将详细介绍 Node.js 中常用的工具…...
【网络安全 | 漏洞挖掘】价值3133美元的Google IDOR
未经许可,不得转载。 文章目录 正文正文 目标URL:REDACTED.google.com。 为了深入了解其功能,我查阅了 developer.google.com 上的相关文档,并开始进行测试。 在测试过程中,我发现了一个 XSS 漏洞,但它触发的域名是经过正确沙盒化的 *.googleusercontent.com,这符合 …...
大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法|文献速递-医学影像人工智能进展
Title 题目 Brain networks and intelligence: A graph neural network based approach toresting state fMRI data 大脑网络与智力:基于图神经网络的静息态fMRI数据分析方法 01 文献速递介绍 智力是一个复杂的构念,包含了多种认知过程。研究人员通…...
Codeforces Round 1004 (Div. 2)(A-E)
题目链接:Dashboard - Codeforces Round 1004 (Div. 2) - Codeforces A. Adjacent Digit Sums 思路 只有两种情况:n1之后没有进位,y-x1。n1之后进位(y-x-1)%90。 代码 void solve(){int x,y;cin>>x>>y;if(y-x1){cout<<…...
掌握正则表达式_模式匹配的艺术
当然,以下是《掌握正则表达式:模式匹配的艺术》文章内容,使用 Java 正则表达式,并包含丰富的代码示例: 1. 引言 1.1 正则表达式的定义与历史 正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于描述文本模式的强大工具。它最初由数学家 Stephen Kleene…...
Python使用OpenCV图片去水印多种方案实现
1. 前言 本文为作者学习记录,使用Python结合OpenCV,总结了几种常见的水印去除方式,简单图片去水印效果良好,但是复杂图片有点一言难尽,本文部分代码仅供参考,并不能针对所有水印通用,需要根据具…...
论文阅读2——S波段宽波束圆极化天线设计
论文结构 研究背景,基于当前天线通信的应用基础进行分析,为了适应更多的应用环境和更复杂的通信信号提出宽波束圆极化的天线设计要求,圆极化天线可以接收到任意极化的电磁波且其辐射波也可以由其他任意极化天线接收到圆极化天线的特性&#…...
【java】基本数据类型和引用数据类型
在 Java 中,数据类型分为 基本数据类型 和 引用数据类型。它们的本质区别在于存储方式和操作方式。下面我会详细解释这两种数据类型,并用通俗易懂的语言帮助你理解。 1. 基本数据类型(Primitive Data Types) 基本数据类型是 Java…...
基于角色访问控制的UML 表示02
一个用户可以成为很多角色的成员,一个角色可以有许多用户。类似地,一个角色可以有多个权限,同一个权限可以被指派给多个角色。每个会话把一个用户和可能的许多角色联系起来。一个用户在激发他或她所属角色的某些子集时,建立了一个…...
CEF132 编译指南 Linux 篇 - 获取 CEF 源代码:源码同步详解(五)
1. 引言 在完成所有必要工具的安装和配置之后,我们来到了整个 CEF 编译流程中至关重要的环节:获取 CEF 源代码。CEF 源码的获取过程需要我们特别关注同步策略和版本管理,以确保获取的代码版本正确且完整。本篇将详细指导你在 Linux 系统上获…...
Golang关于结构体组合赋值的问题
现在有一个结构体,其中一个属性组合了另外一个结构体,如下所示: type User struct {Id int64Name stringAge int64UserInfo }type UserInfo struct {Phone stringAddress string }如果要给 User 结构体的 Phone 和 Address 赋值的话&am…...
django上传文件
1、settings.py配置 # 静态文件配置 STATIC_URL /static/ STATICFILES_DIRS [BASE_DIR /static, ]上传文件 # 定义一个视图函数,该函数接收一个 request 参数 from django.shortcuts import render # 必备引入 import json from django.views.decorators.http i…...
Springboot核心:统一异常处理
概述 统一异常处理机制在 Spring Boot 应用中是非常重要的核心点,因为它带来了多个方面的优势,能够显著提升应用的质量和开发效率。 为什么要优雅的处理异常 在后端发生异常或者是请求出错时,前端通常直接显示异常信息,而且对于…...
【银河麒麟高级服务器操作系统】服务器卡死后恢复系统日志丢失-分析及处理全过程
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://document.kylinos.cn 服务器环境以及配置 【机型】 处理器ÿ…...
【deepseek api 第三方平台使用参考】
1.硅基流动 1.1硅基流动网页版使用 打开硅基流动的官网 https://siliconflow.cn/zh-cn/ 点右上角登陆 在模型广场这里找到这个deepseek的r1 注意,一定选择下面标记【671B】的,这个是满血版 这个满血版收费标准是 4块钱/百万token输入 16块钱/百万token…...
通过 VBA 在 Excel 中自动提取拼音首字母
在excel里面把表格里的中文提取拼音大写缩写怎么弄 在Excel中,如果你想提取表格中的中文字符并转换为拼音大写缩写(即每个汉字的拼音首字母的大写形式),可以通过以下步骤来实现。这项工作可以分为两个主要部分: 提取拼…...
动态规划dp_4
一.背包 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 如果求排列数就是外层for遍历背包,内层for循环遍历物品。 二.题 1. 思路:dp五部曲,思路在注释 /* dp[i]表示:到达第 i 个台阶有dp[i]种方法 状态转…...
对贵司需求的PLC触摸的远程调试的解决方案
远程监控技术解决方案 一、需求痛点分析 全球设备运维响应滞后(平均故障处理周期>72小时)客户定制化需求频繁(每月PLC程序修改需求超50次)人力成本高企(单次跨国差旅成本约$5000)多品牌PLC兼容需求&am…...
Python用PyMC3马尔可夫链蒙特卡罗MCMC对疾病症状数据贝叶斯推断
全文链接:https://tecdat.cn/?p39937 本文聚焦于马尔可夫链蒙特卡罗(MCMC)方法在贝叶斯推断中的Python实现。通过介绍MCMC的基础原理、在贝叶斯推断中的应用步骤,展示了其在解决复杂分布采样问题上的强大能力。同时,借…...
网络工程师 (39)常见广域网技术
一、HDLC 前言 HDLC(High-level Data Link Control,高级数据链路控制)是一种面向比特的链路层协议。 (一)定义与历史背景 HDLC是由国际电信联盟(ITU)标准化的,它基于IBM公司早期的同…...
每日Attention学习23——KAN-Block
模块出处 [SPL 25] [link] [code] KAN See In the Dark 模块名称 Kolmogorov-Arnold Network Block (KAN-Block) 模块作用 用于vision的KAN结构 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as F import mathclass Swish(nn.Module)…...
基于Python的Optimal Interpolation (OI) 方法实现
前言 Optimal Interpolation (OI) 方法概述与实现 Optimal Interpolation (OI) 是一种广泛应用于气象学、海洋学等领域的空间数据插值方法。该方法通过结合观测数据与模型预测数据,最小化误差方差,从而实现对空间数据的最优插值。以下是OI方法的一般步骤…...
学习数据结构(10)栈和队列下+二叉树(堆)上
1.关于栈和队列的算法题 (1)用队列实现栈 解法一:(参考代码) 题目要求实现六个函数,分别是栈初始化,入栈,移除并返回栈顶元素,返回栈顶元素,判空࿰…...
.NET版Word处理控件Aspose.Words教程:使用 C# 删除 Word 中的空白页
Word 文档中的空白页会使其看起来不专业并扰乱流程。用户会遇到需要删除 Word 中的空白页的情况,但手动删除它们需要时间和精力。在这篇博文中,我们将探讨如何使用 C# 删除 Word 中的空白页。 本文涵盖以下主题: C# 库用于删除 Word 中的空…...
《代码随想录》刷题笔记——回溯篇【java实现】
文章目录 组合组合总和 III电话号码的字母组合组合总和组合总和II思路代码实现 分割回文串※思路字符串分割回文串判断效率优化※ 复原 IP 地址优化版本 子集子集 II使用usedArr辅助去重不使用usedArr辅助去重 递增子序列※全排列全排列 II重新安排行程题意代码 N 皇后解数独直…...
【JavaEE进阶】验证码案例
目 🌲实现说明 🎄Hutool介绍 🌳准备工作 🌴约定前后端交互接口 🚩接口定义 🚩实现服务器后端代码 🚩前端代码 🚩整体测试 🌲实现说明 随着安全性的要求越来越⾼…...
TCP/UDP 简介,三次握手与四次挥手
一、TCP 三次握手 目的:为了解决在不可靠的信道上建立可靠的网络连接 三次握手是连接请求的过程: A 发送连接请求的数据给 B(发送 SYN 包) B 同意连接,返回数据给 A(返回 SYNACK 包) A 收到后回…...
C++之线程池(Thread Pool)
1.介绍 线程池是一种并发编程的设计模式,用于管理和复用多个线程。以避免频繁创建和销毁线程的开销。线程池的核心思想是预先创建一组线程,并将任务分配给这些线程执行,从而提高程序的性能和资源利用率。 2.线程池的核心组件 一个经典的线程…...
Django中实现简单易用的分页工具
如何在Django中实现简单易用的分页工具?📚 嗨,小伙伴们!今天我们来看看如何在 Django 中实现一个超简单的分页工具。无论你是在处理博客文章、产品列表,还是用户评论,当数据量一大时,分页显得尤…...
