V2V

概述

两个设备,经过测试两个模组设备中间的通信速率延迟,最优为4毫秒发像呈锯齿状。先发送送。由此构成了一条工控机数据发送模组中间要发送4次到5次。因此判断锯齿状延迟图像的构成应该由第2次3次4次的相同时间数据减去后续接收的时间戳导致的。因此在第2个模组中就要将重复收到的数据信息变为最开始收到的那一个去掉多余时间戳。后再将它发送给工控机。因此就要想一个办法别这个信息,不然这个延迟将会增大整个数据延迟图的数据信息中,每一条都有ID信息的标记,因此提出ID信息进行比较最为关键。在模组接收线程中不一样ID信息的数据发出。一样ID信息的数据不要。 工控机发送的数据是一个结构体,但是这个结构体的变量是ros独有的,所以不能在工控机的程序中写一个一样的结构体,将数据进行解析。所以我修改了工控机的程序,将ID信息放在了数据结构首位。那c语言强制转换的办法提取了这个数据的ID信息,通过这个数据的ID判别出最新数据,后放入TCP发送线程中发给下一个工控机。
程序自启动,修改yocto文件系统中,添加中间层里添加自启动服务文件。

线程同步

死锁产生四个条件

orin搭载ros控制汽车底盘

概述

在orin上编译英伟达的内核和驱动,烧录镜像到orin中,配置ros在arm架构上的源,更新后安装ros,使用socket编写can协议传输信息,将底盘上的报文协议,编写接收发送线程,接收线程接收底盘反馈的数据帧,发送线程数据帧,话题订阅反馈的数据,发布发送的数据帧。

底盘报文协议(可能是指一种特定的通信协议或数据格式)转换为数据帧

  1. 理解底盘报文协议格式: 首先要明确底盘报文协议的结构和规范
  2. 确定数据帧格式: 确定目标数据帧的格式和标准。
  3. 解析底盘报文: 将接收到的底盘报文按照协议规范进行解析。
  4. 构建数据帧: 将报文头信息转换为帧头,将数据内容放入帧的数据字段中,添加适当的帧尾和校验位。
  5. 数据帧发送: 发送构建好的数据帧到目标设备或系统,确保发送过程中保持数据的完整性和正确性。
  6. 错误处理和校验: 在整个转换过程中,需要实现错误处理机制和校验机制,以确保转换的准确性和报文的完整性。

ros1和ros2的区别

stm32hal控制步兵机器人底盘

概述

stm32控制麦轮的全向移动以及云台的转向,摩擦轮的旋转。

stm32写一个串口的协议,前两位数据为底盘运动模式选择,后两位为云台偏转的两个偏差角度(上位机模式)

debus发送遥控命令数据

麦轮移动算法

运动学正向分解是指根据给定的底盘运动参数,计算每个麦克纳姆轮的理想速度(通常是线速度),

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void moveMecanum(float vx, float vy, float omega)//x轴方向速度,y轴方向速度,omega方向速度,
{
// 计算四个轮子的速度
float motor1_speed = vx - vy - omega;
float motor2_speed = vx + vy + omega;
float motor3_speed = vx + vy - omega;
float motor4_speed = vx - vy + omega;

// 将速度映射到PWM输出
uint16_t pwm_value1 = (uint16_t)(motor1_speed * TIM_PERIOD);
uint16_t pwm_value2 = (uint16_t)(motor2_speed * TIM_PERIOD);
uint16_t pwm_value3 = (uint16_t)(motor3_speed * TIM_PERIOD);
uint16_t pwm_value4 = (uint16_t)(motor4_speed * TIM_PERIOD);
}

云台pid偏转

需要初始化两个PID控制器,每个控制器都有自己的比例、积分和微分系数,以及设定的目标角度和当前角度。

PID的比例积分微分

比例:增大比例减小静态误差,上升时间减小,加快响应,当比例过大会出现超调

积分:积分增大,减小振荡,积分过大,超调量增加

微分:引入微分,减小超调量,提高响应速度,稳定性增加,消除静态误差。