|
@@ -37,14 +37,14 @@ bool Sub::sport_init()
|
|
last_roll = 0;
|
|
last_roll = 0;
|
|
last_pitch = 0;
|
|
last_pitch = 0;
|
|
|
|
|
|
|
|
+ updowmgain =0.5;
|
|
|
|
|
|
last_yaw = ahrs.yaw_sensor;
|
|
last_yaw = ahrs.yaw_sensor;
|
|
last_input_ms = AP_HAL::millis();
|
|
last_input_ms = AP_HAL::millis();
|
|
last_input_ms_stable = AP_HAL::millis();
|
|
last_input_ms_stable = AP_HAL::millis();
|
|
|
|
|
|
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " init Z target %f %f",(float)pos_control.get_pos_target().z,barometer.get_altitude()*100);
|
|
|
|
-
|
|
|
|
|
|
+
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -75,9 +75,11 @@ void Sub::handle_attitude_sport(){
|
|
// If we don't have a mavlink attitude target, we use the pilot's input instead
|
|
// If we don't have a mavlink attitude target, we use the pilot's input instead
|
|
//get_pilot_desired_lean_angles(channel_roll->get_control_in(), channel_pitch->get_control_in(), target_roll, target_pitch, attitude_control.get_althold_lean_angle_max());
|
|
//get_pilot_desired_lean_angles(channel_roll->get_control_in(), channel_pitch->get_control_in(), target_roll, target_pitch, attitude_control.get_althold_lean_angle_max());
|
|
//get_pilot_desired_lean_angles((int16_t)(channel_lateral->norm_input()*5700), (int16_t)((0.5-channel_throttle->norm_input())*5700*2), target_roll, target_pitch, attitude_control.get_althold_lean_angle_max());
|
|
//get_pilot_desired_lean_angles((int16_t)(channel_lateral->norm_input()*5700), (int16_t)((0.5-channel_throttle->norm_input())*5700*2), target_roll, target_pitch, attitude_control.get_althold_lean_angle_max());
|
|
- get_pilot_desired_lean_angles(0, (int16_t)((0.5-channel_throttle->norm_input())*5700*2), target_roll, target_pitch, attitude_control.get_althold_lean_angle_max());
|
|
|
|
|
|
+ //get_pilot_desired_lean_angles(0, (int16_t)((0.5-channel_throttle->norm_input())*5700*2), target_roll, target_pitch, attitude_control.get_althold_lean_angle_max());
|
|
|
|
+ get_pilot_desired_lean_angles(0, (int16_t)((0.5-channel_throttle->norm_input())*5700), target_roll, target_pitch, attitude_control.get_althold_lean_angle_max());
|
|
|
|
|
|
- target_yaw = get_pilot_desired_yaw_rate(channel_yaw->get_control_in());
|
|
|
|
|
|
+ target_yaw = get_pilot_desired_yaw_rate(channel_yaw->get_control_in()*0.3);//*0.6 变慢
|
|
|
|
+
|
|
if (abs(target_roll) > 300 || abs(target_pitch) > 300) {
|
|
if (abs(target_roll) > 300 || abs(target_pitch) > 300) {
|
|
//last_roll = ahrs.roll_sensor;
|
|
//last_roll = ahrs.roll_sensor;
|
|
//last_pitch = ahrs.pitch_sensor;
|
|
//last_pitch = ahrs.pitch_sensor;
|
|
@@ -111,15 +113,12 @@ void Sub::handle_attitude_sport(){
|
|
// should be called at 100hz or more
|
|
// should be called at 100hz or more
|
|
void Sub::sport_run()
|
|
void Sub::sport_run()
|
|
{
|
|
{
|
|
- static int f2 = 201;
|
|
|
|
- static int f3 = 201;
|
|
|
|
|
|
+
|
|
|
|
|
|
|
|
|
|
// When unarmed, disable motors and stabilization
|
|
// When unarmed, disable motors and stabilization
|
|
if (!motors.armed()) {
|
|
if (!motors.armed()) {
|
|
- f2 = 201;
|
|
|
|
- f3 = 201;
|
|
|
|
-
|
|
|
|
|
|
+
|
|
motors.set_desired_spool_state(AP_Motors::DesiredSpoolState::GROUND_IDLE);
|
|
motors.set_desired_spool_state(AP_Motors::DesiredSpoolState::GROUND_IDLE);
|
|
// Sub vehicles do not stabilize roll/pitch/yaw when not auto-armed (i.e. on the ground, pilot has never raised throttle)
|
|
// Sub vehicles do not stabilize roll/pitch/yaw when not auto-armed (i.e. on the ground, pilot has never raised throttle)
|
|
attitude_control.set_throttle_out(0.5 ,true, g.throttle_filt);
|
|
attitude_control.set_throttle_out(0.5 ,true, g.throttle_filt);
|
|
@@ -127,21 +126,14 @@ void Sub::sport_run()
|
|
pos_control.relax_alt_hold_controllers();
|
|
pos_control.relax_alt_hold_controllers();
|
|
|
|
|
|
//pos_control.set_alt_target(barometer.get_altitude()*100);//当前深度
|
|
//pos_control.set_alt_target(barometer.get_altitude()*100);//当前深度
|
|
-
|
|
|
|
|
|
+ updowmgain =0.5;
|
|
last_roll = 0;
|
|
last_roll = 0;
|
|
last_pitch = 0;
|
|
last_pitch = 0;
|
|
last_yaw = ahrs.yaw_sensor;
|
|
last_yaw = ahrs.yaw_sensor;
|
|
holding_depth = false;
|
|
holding_depth = false;
|
|
ahrs.get_quat_body_to_ned(attitude_desired_quat_);//12.19
|
|
ahrs.get_quat_body_to_ned(attitude_desired_quat_);//12.19
|
|
|
|
|
|
- static int f = 0;
|
|
|
|
- f++;
|
|
|
|
- if(f>800)
|
|
|
|
- {
|
|
|
|
-
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " disarm Z target %f %f",(float)pos_control.get_pos_target().z,barometer.get_altitude()*100);
|
|
|
|
- f=0;
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -161,14 +153,17 @@ void Sub::sport_run()
|
|
|
|
|
|
//TODO: scale throttle with the ammount of thrusters in the given direction
|
|
//TODO: scale throttle with the ammount of thrusters in the given direction
|
|
// motors.set_throttle(0.5+throttle_vehicle_frame.z + channel_throttle->norm_input()-0.5);
|
|
// motors.set_throttle(0.5+throttle_vehicle_frame.z + channel_throttle->norm_input()-0.5);
|
|
- motors.set_throttle(throttle_vehicle_frame.z + 1.0-(float)PressLevel_f*0.1);
|
|
|
|
|
|
+ // motors.set_throttle(throttle_vehicle_frame.z + 1.0-(float)PressLevel_f*0.1);
|
|
|
|
+
|
|
|
|
+ motors.set_throttle(throttle_vehicle_frame.z + gaindelay(1.0-(float)PressLevel_f*0.1,updowmgain));
|
|
rov_message.pressure_level = int(PressLevel);
|
|
rov_message.pressure_level = int(PressLevel);
|
|
- motors.set_forward(-throttle_vehicle_frame.x + channel_forward->norm_input());
|
|
|
|
- motors.set_lateral(-throttle_vehicle_frame.y + channel_lateral->norm_input());
|
|
|
|
|
|
+ motors.set_forward(constrain_float(-throttle_vehicle_frame.x + getgainf(channel_forward->norm_input()),-0.8,0.8));//*0.6 变慢
|
|
|
|
+ motors.set_lateral(constrain_float(-throttle_vehicle_frame.y + getgainf(channel_lateral->norm_input()),-0.8,0.8));//*0.6 变慢
|
|
|
|
|
|
// We rotate the RC inputs to the earth frame to check if the user is giving an input that would change the depth.
|
|
// We rotate the RC inputs to the earth frame to check if the user is giving an input that would change the depth.
|
|
//Vector3f earth_frame_rc_inputs = ahrs.get_rotation_body_to_ned() * Vector3f(channel_forward->norm_input(), channel_lateral->norm_input(), (2.0f*(-0.5f+channel_throttle->norm_input())));
|
|
//Vector3f earth_frame_rc_inputs = ahrs.get_rotation_body_to_ned() * Vector3f(channel_forward->norm_input(), channel_lateral->norm_input(), (2.0f*(-0.5f+channel_throttle->norm_input())));
|
|
- Vector3f earth_frame_rc_inputs = ahrs.get_rotation_body_to_ned() * Vector3f(channel_forward->norm_input(), channel_lateral->norm_input(), (2.0*(0.5-PressLevel_f*0.1)));
|
|
|
|
|
|
+ //Vector3f earth_frame_rc_inputs = ahrs.get_rotation_body_to_ned() * Vector3f(channel_forward->norm_input(), channel_lateral->norm_input(), (2.0*(0.5-PressLevel_f*0.1)));
|
|
|
|
+ Vector3f earth_frame_rc_inputs = ahrs.get_rotation_body_to_ned() * Vector3f(channel_forward->norm_input(), 0.0, (2.0*(0.5-PressLevel_f*0.1)));//去掉侧移影响
|
|
|
|
|
|
if (fabsf(earth_frame_rc_inputs.z) > 0.05f) { // Throttle input above 5%
|
|
if (fabsf(earth_frame_rc_inputs.z) > 0.05f) { // Throttle input above 5%
|
|
// reset z targets to current values
|
|
// reset z targets to current values
|
|
@@ -176,65 +171,59 @@ void Sub::sport_run()
|
|
pos_control.relax_alt_hold_controllers();
|
|
pos_control.relax_alt_hold_controllers();
|
|
//pos_control.set_alt_target(barometer.get_altitude()*100);//当前深度
|
|
//pos_control.set_alt_target(barometer.get_altitude()*100);//当前深度
|
|
|
|
|
|
- static int f = 0;
|
|
|
|
- f2 = 201;
|
|
|
|
- f3 = 201;
|
|
|
|
- f++;
|
|
|
|
- if(f>400)
|
|
|
|
- {
|
|
|
|
-
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " Z1 target %f %f ",(float)pos_control.get_pos_target().z,barometer.get_altitude()*100);
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " surface %d at_bottom %d ",ap.at_surface,ap.at_bottom);
|
|
|
|
- f=0;
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
} else { // hold z
|
|
} else { // hold z
|
|
if (ap.at_surface) { //最大油门不能向上动
|
|
if (ap.at_surface) { //最大油门不能向上动
|
|
pos_control.set_alt_target(g.surface_depth - 10.0f); // set target to 5cm below surface level
|
|
pos_control.set_alt_target(g.surface_depth - 10.0f); // set target to 5cm below surface level
|
|
holding_depth = true;
|
|
holding_depth = true;
|
|
|
|
|
|
- f2++;
|
|
|
|
- if(f2>200)
|
|
|
|
- {
|
|
|
|
-
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " Zsurface target %f %f ",(float)pos_control.get_pos_target().z,barometer.get_altitude()*100);
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " surface %d at_bottom %d ",ap.at_surface,ap.at_bottom);
|
|
|
|
- f2=0;
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
} else if (ap.at_bottom) {//最大油门不能向下动
|
|
} else if (ap.at_bottom) {//最大油门不能向下动
|
|
//pos_control.set_alt_target(inertial_nav.get_altitude() + 20.0f); // set target to 10 cm above bottom
|
|
//pos_control.set_alt_target(inertial_nav.get_altitude() + 20.0f); // set target to 10 cm above bottom
|
|
pos_control.set_alt_target(barometer.get_altitude()*100 +20);//cm
|
|
pos_control.set_alt_target(barometer.get_altitude()*100 +20);//cm
|
|
holding_depth = true;
|
|
holding_depth = true;
|
|
|
|
|
|
- f3++;
|
|
|
|
- if(f3>200)
|
|
|
|
- {
|
|
|
|
-
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " Zbottom target %f %f ",(float)pos_control.get_pos_target().z,barometer.get_altitude()*100);
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " surface %d at_bottom %d ",ap.at_surface,ap.at_bottom);
|
|
|
|
- f3=0;
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
} else if (!holding_depth) {
|
|
} else if (!holding_depth) {
|
|
//pos_control.set_target_to_stopping_point_z();//有对位置的付值
|
|
//pos_control.set_target_to_stopping_point_z();//有对位置的付值
|
|
pos_control.calc_leash_length_z();//刹车长度 12.19
|
|
pos_control.calc_leash_length_z();//刹车长度 12.19
|
|
pos_control.set_alt_target(barometer.get_altitude()*100);//cm 当前深度
|
|
pos_control.set_alt_target(barometer.get_altitude()*100);//cm 当前深度
|
|
- f2 = 201;
|
|
|
|
- f3 = 201;
|
|
|
|
|
|
+
|
|
holding_depth = true;
|
|
holding_depth = true;
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " Z4 target %f %f ",(float)pos_control.get_pos_target().z,barometer.get_altitude()*100);
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " surface %d at_bottom %d ",ap.at_surface,ap.at_bottom);
|
|
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- static int f5 = 0;
|
|
|
|
- f5++;
|
|
|
|
- if(f5>500)
|
|
|
|
- {
|
|
|
|
-
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " Z00 target %f %f ",(float)pos_control.get_pos_target().z,barometer.get_altitude()*100);
|
|
|
|
|
|
|
|
- gcs().send_text(MAV_SEVERITY_INFO, " surface %d at_bottom %d ",ap.at_surface,ap.at_bottom);
|
|
|
|
- f5=0;
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
+/*
|
|
|
|
+float rmpforward(float _gain){
|
|
|
|
+ static uint16_t rmpcounter = 0;
|
|
|
|
+ float get_forward_gain = motors.get_forward();
|
|
|
|
+ float temp=0;
|
|
|
|
+ rmpcounter++;
|
|
|
|
+ if (rmpcounter>20)
|
|
|
|
+ {
|
|
|
|
+ rmpcounter =0;
|
|
|
|
+ if(get_forward_gain - _gain>0.01){
|
|
|
|
+ temp = get_forward_gain-0.01;
|
|
|
|
+
|
|
|
|
+ }else if(get_forward_gain- _gain<-0.01){
|
|
|
|
+ temp = get_forward_gain+0.01;
|
|
|
|
+ }
|
|
|
|
+ else{
|
|
|
|
+ temp = _gain;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (_gain>0.3)
|
|
|
|
+ {
|
|
|
|
+ temp =constrain_float(temp,0.4,1.0);
|
|
|
|
+ }else if(temp<-0.3){
|
|
|
|
+ temp = constrain_float(temp,-1.0,-0.4);
|
|
|
|
+ }else{
|
|
|
|
+ temp=0.0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+}*/
|