【分享帖】底盘跟随原理详解
![Ezio](https://hz-rm-bbs-web-prod.oss-cn-hangzhou.aliyuncs.com/avatar/pre/v1/000036621_avatar_big.jpg)
底盘跟随原理详解(infantry)
步兵机器人是由云台和底盘组成的。操作手操作时,第一视角是由图传系统反馈的,当操作手发出向前移动的指令时,机器人需要以操作手视角的前进方向前进,但底盘运动是按照底盘的前后左右移动,所以当云台左右转动后,云台的前方向和底盘的前方向不是同一方向的。当操作手发出前进指令时,机器人会按照底盘的前进方向移动,而不是操作手的视野前方。操作手第一视角得到的反馈效果就是:我TM怎么在平移?这里就要用到随动系统:底盘跟随云台的旋转而旋转。
设以操作手角度控制步兵,在云台相对坐标系下的速度为gimbal_view_Vx,gimbal_view_Vy,底盘相对坐标系下的速度为Vx,Vy。底盘相对坐标系和云台相对坐标系的相对角度差为angle_diff。
底盘跟随一整套流程可分为
1.云台转动(通过遥控器赋予目标值以及双环控制的外环)
2.底盘转动(相对坐标系下Vx,Vy的计算以及双环控制的输出量进行麦轮解算发给电调)
3.云台回转(双环控制的内环)
遥控器通道值赋予yaw轴电机目标角度:
yaw_motor.target_position = rc.channel3;
相对角度差是yaw轴电机目标位置和yaw轴电机电调返回位置之差:
angle_diff = yaw_motor.target_position - yaw_motor.esc_back_position;
遥控器通道值赋予云台相对坐标系下的速度值(相关处理略过):
gimbal_view_Vx = rc.channel1;
gimbal_view_Vy = rc.channel0;
此时底盘对于速度通过对相对坐标系的分解为:
Vx = gimbal_view_Vx * cos(angle_diff) - gimbal_view_Vy * sin(angle_diff);
Vy = gimbal_view_Vx * sin(angle_diff) - gimbal_view_Vy * cos(angle_diff);
对底盘跟随进行双环控制,外环为位置环,目标值为相对角度差,实际值为0:
chassis_follow_position_pid.error = angle_diff - 0;
PID_AbsoluteMode(&chassis_follow_position_pid);
内环为速度环,目标值为外环输出量,实际值为底盘陀螺仪返回的角速度值:
chassis_follow_speed_pid.error = chassis_follow_position_pid.ctrOut - chassi.gyro_back_angle_speed;
PID_AbsoluteMode(&chassis_follow_speed_pid);
内环输出量赋给底盘旋转角度:
Wz = chassis_follow_speed_pid.ctrOut;
通过麦轮解算将Vx,Vy,Wz三个值解算出底盘四个电机的电流值,再进行一次单环控制,将输出量通过can发送给底盘四个电机的电调,至此底盘跟随完成。
步兵机器人是由云台和底盘组成的。操作手操作时,第一视角是由图传系统反馈的,当操作手发出向前移动的指令时,机器人需要以操作手视角的前进方向前进,但底盘运动是按照底盘的前后左右移动,所以当云台左右转动后,云台的前方向和底盘的前方向不是同一方向的。当操作手发出前进指令时,机器人会按照底盘的前进方向移动,而不是操作手的视野前方。操作手第一视角得到的反馈效果就是:我TM怎么在平移?这里就要用到随动系统:底盘跟随云台的旋转而旋转。
设以操作手角度控制步兵,在云台相对坐标系下的速度为gimbal_view_Vx,gimbal_view_Vy,底盘相对坐标系下的速度为Vx,Vy。底盘相对坐标系和云台相对坐标系的相对角度差为angle_diff。
底盘跟随一整套流程可分为
1.云台转动(通过遥控器赋予目标值以及双环控制的外环)
2.底盘转动(相对坐标系下Vx,Vy的计算以及双环控制的输出量进行麦轮解算发给电调)
3.云台回转(双环控制的内环)
遥控器通道值赋予yaw轴电机目标角度:
yaw_motor.target_position = rc.channel3;
相对角度差是yaw轴电机目标位置和yaw轴电机电调返回位置之差:
angle_diff = yaw_motor.target_position - yaw_motor.esc_back_position;
遥控器通道值赋予云台相对坐标系下的速度值(相关处理略过):
gimbal_view_Vx = rc.channel1;
gimbal_view_Vy = rc.channel0;
此时底盘对于速度通过对相对坐标系的分解为:
Vx = gimbal_view_Vx * cos(angle_diff) - gimbal_view_Vy * sin(angle_diff);
Vy = gimbal_view_Vx * sin(angle_diff) - gimbal_view_Vy * cos(angle_diff);
对底盘跟随进行双环控制,外环为位置环,目标值为相对角度差,实际值为0:
chassis_follow_position_pid.error = angle_diff - 0;
PID_AbsoluteMode(&chassis_follow_position_pid);
内环为速度环,目标值为外环输出量,实际值为底盘陀螺仪返回的角速度值:
chassis_follow_speed_pid.error = chassis_follow_position_pid.ctrOut - chassi.gyro_back_angle_speed;
PID_AbsoluteMode(&chassis_follow_speed_pid);
内环输出量赋给底盘旋转角度:
Wz = chassis_follow_speed_pid.ctrOut;
通过麦轮解算将Vx,Vy,Wz三个值解算出底盘四个电机的电流值,再进行一次单环控制,将输出量通过can发送给底盘四个电机的电调,至此底盘跟随完成。
请问这篇文章对你有用吗?
【分享帖】底盘跟随原理详解