mirror of
https://gitee.com/dlmu-cone/bf_original_balance_chassis
synced 2026-07-23 19:25:09 +08:00
修改文档文件夹位置,添加部分文档
This commit is contained in:
@@ -6,7 +6,6 @@
|
||||
>
|
||||
> 1. 对`CANCommGet()`进行修改,使得其可以返回数据是否更新的相关信息。
|
||||
|
||||
|
||||
## 重要提醒
|
||||
|
||||
如果传输过程中出现多次丢包或长度校验不通过,尤其是传输长度较大的时候,请开启CAN的Auto Retransmission,并尝试修改CANComm实例的发送和接受ID(以提高在总线仲裁中的优先级)。
|
||||
@@ -40,12 +39,12 @@ typedef struct
|
||||
} CANComm_Init_Config_s;
|
||||
|
||||
CANComm_Init_Config_s cconfig = {
|
||||
.can_config = {
|
||||
.can_config = {
|
||||
.can_handle=&hcan1,
|
||||
.tx_id=0x02,
|
||||
.rx_id=0x03},
|
||||
.send_data_len = sizeof(your_data_structure),
|
||||
.recv_data_len = sizeof(recv_data_structure)
|
||||
.send_data_len = sizeof(your_data_structure),
|
||||
.recv_data_len = sizeof(recv_data_structure)
|
||||
};
|
||||
```
|
||||
|
||||
@@ -65,7 +64,7 @@ typedef struct
|
||||
|
||||
只有这样,这个结构体才不会进行padding扩充字节实现字节对齐。你可以尝试一下,如果不使用pack处理,上面的结构体将会占据18个字节以上的空间;开启pack后,会降低至15。更多关于字节对齐的内容,自行查询。
|
||||
|
||||
> 后期可能更新字节对齐和内存访问相关的教程。
|
||||
> 后期可能更新字节对齐和内存访问相关的教程。
|
||||
|
||||
`CANCommGet()`是获取来自CANComm接收到的数据的接口,返回值为一个void类型指针,你需要通过**强制类型转换**将其变为你设定的接收类型指针,然后就可以访问其数据了。
|
||||
|
||||
@@ -92,10 +91,10 @@ static void CANCommRxCallback(can_instance *_instance);
|
||||
#pragma pack(1)
|
||||
struct test
|
||||
{
|
||||
float aa;
|
||||
float bb;
|
||||
float cc;
|
||||
uint16_t dd;
|
||||
float aa;
|
||||
float bb;
|
||||
float cc;
|
||||
uint16_t dd;
|
||||
};
|
||||
#pragma pack()
|
||||
```
|
||||
@@ -104,12 +103,12 @@ struct test
|
||||
|
||||
```c
|
||||
CANComm_Init_Config_s cconfig = {
|
||||
.can_config = {
|
||||
.can_config = {
|
||||
.can_handle=&hcan1,
|
||||
.tx_id=0x02,
|
||||
.rx_id=0x03},
|
||||
.send_data_len = sizeof(float),
|
||||
.recv_data_len = sizeof(struct test)
|
||||
.send_data_len = sizeof(float),
|
||||
.recv_data_len = sizeof(struct test)
|
||||
};
|
||||
CANCommInstance* ins = CANCommInit(&cconfig);
|
||||
```
|
||||
@@ -138,5 +137,4 @@ CAN comm的通信协议如下:
|
||||
|
||||
接收的流程见代码注释。
|
||||
|
||||
流程图如下:
|
||||
|
||||
流程图如下:
|
||||
|
||||
@@ -4,13 +4,15 @@
|
||||
|
||||
## 硬触发流程
|
||||
|
||||

|
||||

|
||||
|
||||
`times%10` 是固定相机的采集频率为100hz,请根据视觉算法实际能达到的最大帧率调整。
|
||||
|
||||
## 算法解析
|
||||
|
||||
介绍EKF四元数姿态解算的教程在:[四元数EKF姿态更新算法](https://zhuanlan.zhihu.com/p/454155643)
|
||||
|
||||
|
||||
## 模块移植
|
||||
|
||||
由于历史遗留问题,IMU模块耦合程度高.后续实现BSP_SPI,将bmi088 middleware删除.仅保留BMI088读取的协议和寄存器定义等,单独实现IMU模块.
|
||||
> 移植已经完成,请转而使用module/BMI088的模块. 当前文件夹将在beta1.2停止支持, 1.5之后删除. INS_Task届时会被放到algorithm中,以提供对不同IMU的兼容.
|
||||
> 移植已经完成,请转而使用module/BMI088的模块. 当前文件夹将在beta1.2停止支持, 1.5之后删除. INS_Task届时会被放到algorithm中,以提供对不同IMU的兼容.
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
>
|
||||
> 支持自定义队列长度,使得订阅者可以自行确定需要的队列长度,适应不同的需求
|
||||
|
||||
|
||||
|
||||
## 总览和封装说明
|
||||
|
||||
**重要定义:**
|
||||
@@ -24,14 +22,10 @@ Message Center不同应用间进行消息传递的中介,它的存在可以在
|
||||
|
||||
Message Center对外提供了四个接口,所有原本要进行信息交互的应用都应该包含`message_center.h`,并在初始化的时候进行注册。
|
||||
|
||||
|
||||
|
||||
## 代码结构
|
||||
|
||||
.h 文件中包含了外部接口和类型定义,.c中包含了各个接口的具体实现。
|
||||
|
||||
|
||||
|
||||
## 外部接口
|
||||
|
||||
**在代码实现上,话题名实际上就是通过一个字符串体现的。**
|
||||
@@ -74,8 +68,6 @@ my_sub=SubRegister("event_name",sizeof(float));
|
||||
|
||||
修改第一个可以扩大话题名长度,第二个确定消息队列的长度,数量越大可以保存的消息越多。
|
||||
|
||||
|
||||
|
||||
## 私有函数和定义
|
||||
|
||||
```c
|
||||
@@ -99,13 +91,11 @@ static void CheckName(char* name)
|
||||
|
||||
> 四个外部接口的实现都有详细的注释,有兴趣的同学可以自行阅读。下方也提供了流程图。
|
||||
|
||||
|
||||
|
||||
## 注册、发布、获取消息流程
|
||||
|
||||
包含一个结构图和四个流程图。
|
||||
|
||||
### Message Center的结构
|
||||
### Message Center的结构
|
||||
|
||||
<center>建议打开原图查看</center>
|
||||
|
||||
@@ -121,19 +111,19 @@ static void CheckName(char* name)
|
||||
|
||||
遍历发布者的话题结点,如果发现相同的话题,直接返回指针即可;遍历完成后发现尚未创建则创建新的话题。
|
||||
|
||||
<img src="../../assets/image-20221201152530558.png" alt="image-20221201152530558" style="zoom: 80%;" />
|
||||
<img src="../../.assets/image-20221201152530558.png" alt="image-20221201152530558" style="zoom: 80%;" />
|
||||
|
||||
- **订阅者:**
|
||||
|
||||
需要注意,由于不同应用/模块的初始化顺序不同,可能出现订阅者先于发布者订阅某一消息的情况,所以要进行发布者链表的遍历,判断是否已经存在相同话题名的发布者,不存在则要先创建发布者结点再将新建订阅者结点并挂载到前者上。
|
||||
|
||||
<img src="../../assets/image-20221201152904044.png" alt="image-20221201152904044" style="zoom:80%;" />
|
||||
<img src="../../.assets/image-20221201152904044.png" alt="image-20221201152904044" style="zoom:80%;" />
|
||||
|
||||
### 推送/获取消息的流程
|
||||
|
||||
- **数组+头尾索引模拟队列**
|
||||
|
||||
<img src="../../assets/image-20221201155228196.png" alt="image-20221201155228196" style="zoom: 71%;" />
|
||||
<img src="../../.assets/image-20221201155228196.png" alt="image-20221201155228196" style="zoom: 71%;" />
|
||||
|
||||
front指向队列头,即最早入队的数据;back指向队列尾,即最新的数据。队列是first in first out(FIFO,先进先出)的结构。back指向的位置是入队数据被写入的位置,front指向的是读取时会出队的位置。当有数据入队,back++;出队则front++。若碰到数组边界,则返回数组头,可以通过取模实现:
|
||||
|
||||
@@ -150,8 +140,6 @@ queue[front]=new_data;
|
||||
front=(front+1)%SIZE_OF_ARRAY;
|
||||
```
|
||||
|
||||
|
||||
|
||||
- **发布者推送消息到指定话题**
|
||||
|
||||
通过发布者指针,将订阅了该话题的所有订阅者遍历,将新数据入队。
|
||||
@@ -160,8 +148,6 @@ front=(front+1)%SIZE_OF_ARRAY;
|
||||
|
||||
从订阅者指针访问消息队列,取出最先进入队列的数据。注意判断队列是否为空,如果为空则返回0。
|
||||
|
||||
|
||||
|
||||
## 示例代码
|
||||
|
||||
```c
|
||||
@@ -191,4 +177,4 @@ d=SubGetMessage(s,&g1);
|
||||
d=SubGetMessage(s,&g1);
|
||||
d=SubGetMessage(s,&g1); // 此时d等于0
|
||||
d=SubGetMessage(ss,&g2);
|
||||
```
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user