小车跑一个正方形后回到原点

这段代码展示了如何编程让小车沿着正方形路径行驶并返回原点。通过定义Move函数控制小车的前进和转向,结合延迟函数实现不同方向的移动。小车依次向前行进3秒,然后左转90度,重复此过程完成正方形轨迹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/***********************************
功能:小车跑一个正方形后回到原地(测试成功)
说明:机器人的移动(将移动函数集成在参数中)
时间:2012.12.12
附录:脉冲数量:3/0.023=130个(3S)
***********************************/
#include<BoeBot.h>
#include<uart.h>

void Move(int count,int pulse1,int pulse2)  //count代表运行时间,pulse1,pulse2,分别代表小车的左右伺服电机速度(1300~1700之间,1500为静止)
{
  int i;
  for(i=0;i<count;i++)
  {
     P1_1=1;
  delay_nus(pulse1);
  P1_1=0;

  P1_0=1;
  delay_nus(pulse2);
  P1_0=0;
  delay_nms(20);
  }
}

int main()
{
  uart_Init();
  printf("Program Running!!\n");
   Move(130,1700,1300);    //向前前进3S
 delay_nms(50);
 Move(16,1300,1300);     //向左转90度
 delay_nms(20);
 Move(130,1700,1300);    //向前前进3S
&nb

// 全局变量:存储惯导相关数据(初始位置设为原点) float currentX = 0.0f; // 当前X坐标(厘米) float currentY = 0.0f; // 当前Y坐标(厘米) float lastYaw = 0.0f; // 上一时刻的偏航角(度) float totalDistance = 0.0f; // 累计行驶距离(厘米) // 新增:编码器距离校准系数(核心新增变量) // 用法:若实际行驶距离是测量值的N倍,就设为N(例如少一半则设为2.0f) float encoderScale = 0.92f; // 函数声明 void updatePosition(float distanceDelta, float currentYaw); /** * @brief 更新小车位置(仅添加编码器校准) * @param distanceDelta:本次周期内行驶的距离(厘米,来自编码器) * @param currentYaw:当前偏航角(度,来自JY901S陀螺仪) */ void updatePosition(float distanceDelta, float currentYaw) { // 1. 应用编码器校准(仅新增这一步,修正距离偏差) float correctedDelta = distanceDelta * encoderScale; totalDistance += correctedDelta; // 累计距离也用校准后的值 // 2. 计算偏航角的平均值(原始逻辑不变) float avgYaw = (lastYaw + currentYaw) / 2.0f; // 3. 将角度转换为弧度(原始逻辑不变) float radYaw = avgYaw * 3.1415926f / 180.0f; // 4. 计算X、Y方向的位移增量(使用校准后的距离) float deltaX = correctedDelta * sin(radYaw); // X方向位移 float deltaY = correctedDelta * cos(radYaw); // Y方向位移 // 5. 更新当前坐标(原始逻辑不变) currentX += deltaX; currentY += deltaY; // 6. 保存当前偏航角(原始逻辑不变) lastYaw = currentYaw; } /** * @brief 主循环中调用的惯导更新函数(完全保留原始逻辑) */ void inertialNavigationUpdate() { static float lastDistance = 0.0f; float distanceDelta = distance - lastDistance; lastDistance = distance; updatePosition(distanceDelta, Yaw); // 调用更新函数 } 根据这个惯导代码,写一个导航,创建一个坐标数组,让我在里面传入坐标就可以去到对应的坐标,比如说一个八十厘米乘八十厘米的正方形,不要使用状态机,宏定义和结构体,尽量简单,特别是转弯,转弯这一块你只需要判断当前角度和目标角度的关系,当当前角度和目标角度相差在可容忍范围内时退出,然后继续调用我的pid前进函数controlCarStraight()就可以了,一定要简单知道吗,我的pid控制函数只能前进而且不能在外面赋值决定前进的速度,具体的差速实现要用 Set_Duty1(pwmLeft, 0); // 左轮正PWM Set_Duty0(pwmRight, 1); // 右轮正PWM,偏航角Yaw自动更新,不需要写函数,你只需要用就行了,给出完整代码和在主函数循环中如何调用,用c语言实现icm4在m0g3507芯片,ccs环境,driverlib库环境中 转弯参考下面这个函数 void turnleft(void) { while(Yaw<79.5) { Set_Duty1(100, 1); // 左轮负PWM Set_Duty0(150, 1); // 右轮正PWM } }
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值