电子说
小车转向的调试与实现
怎么实现小车的90度转向?
首先,在09_国产IMU移植及姿态解算.md里面我们可以获取到小车的姿态信息,对应的转向信息就是Yaw(偏航角)。
而在08_直流减速电机PID速度环与位置环调试中我们也可以准确控制小车轮子的转速和转多少个脉冲(也就是转几圈)了。
这样实现小车的转向就有了两种方案了。一种是用Yaw(偏航角)作为测量值,想要转的角度作为目标值,用PID驱动小车以一定的速度去旋转来达到目标值。
第二种是在实现小车轮子位置环的基础上,控制两边轮子同时向不同的方向旋转一定的圈数(编码器脉冲),在小车轮子不打滑的情况下转过的角度就是一个确定的值,在送药小车的地图中,旋转基本都是90度的,所以这种实现方法会很简单也容易调试。
用角度环实现90度转向
在pid_thread.c中实现:
创建相应的PID控制参数的结构体:
positional_pid_params_t car_angle_ring_pid;
初始化控制结构体并修改kp ki kd:
//角度环配置 //角度环 pid 参数初始化 positional_pid_init(&car_angle_ring_pid, 0.015, 0, 0, 0.1, 2, -2); //修改 角度环 kp ki kd car_angle_ring_pid.positional_pid_set_value(&car_angle_ring_pid, 0.015, 0, 0);
在PID的软件定时器回调函数中计算两个轮子需要的速度:
// 小车角度环 if (car_angle_ring_enable_flag == 1) { static float error = 0; error = turn_target - fusion_data.euler.euler.yaw; // 处理角度突变 if (error > 180.0f) error -= 360.0f; else if (error < -180.0f) error += 360.0f; angle_ring_speed_target = positional_pid_compute( &car_angle_ring_pid, error, fusion_data.euler.euler.yaw); } else { turn_target = fusion_data.euler.euler.yaw; angle_ring_speed_target = 0; }
打开角度环后他就会保持Yaw为0,如下面这个图一样:
下面是设定他靠角度换旋转90度的效果:
用位置环实现90度转向
还是在pid_thread.c中实现:
在08_直流减速电机PID速度环与位置环调试已经可以让轮子转固定的脉冲(圈数)了,直接把对应的目标值加给电机1和电机2的位置目标就可以了。
// 位置式旋转,负数左转,正数右转。 void car_spin_position(int32_t _position_target) { motor1_position_target += -_position_target; motor2_position_target -= _position_target; }
在实际实现中,如下面的gif图所示:
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !