123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #include "SIM_Gripper_EPM.h"
- #include "AP_HAL/AP_HAL.h"
- #include <stdio.h>
- #include <AP_Math/AP_Math.h>
- using namespace SITL;
- const AP_Param::GroupInfo Gripper_EPM::var_info[] = {
-
-
-
-
-
- AP_GROUPINFO("ENABLE", 0, Gripper_EPM, gripper_emp_enable, 0),
-
-
-
-
-
- AP_GROUPINFO("PIN", 1, Gripper_EPM, gripper_emp_servo_pin, -1),
- AP_GROUPEND
- };
- void Gripper_EPM::update_servobased(int16_t gripper_pwm)
- {
- if (!servo_based) {
- return;
- }
- if (gripper_pwm >= 0) {
- demand = (gripper_pwm - 1000) * 0.001f;
- if (is_negative(demand)) {
- demand = 0.0f;
- }
- }
- }
- void Gripper_EPM::update_from_demand()
- {
- const uint64_t now = AP_HAL::micros64();
- const float dt = (now - last_update_us) * 1.0e-6f;
-
- field_strength = field_strength * (100.0f - field_decay_rate * dt) / 100.0f;
-
-
- if (demand > 0.6f) {
-
- field_strength = field_strength + (100.0f - field_strength) * field_strength_slew_rate / 100.0f * dt;
- } else if (demand < 0.4f) {
-
- field_strength = field_strength * (100.0f - field_degauss_rate * dt) / 100.0f;
- } else {
-
- }
- if (should_report()) {
- ::fprintf(stderr, "demand=%f\n", demand);
- printf("Field strength: %f%%\n", field_strength);
- printf("Field strength: %f Tesla\n", tesla());
- last_report_us = now;
- reported_field_strength = field_strength;
- }
- last_update_us = now;
- }
- void Gripper_EPM::update(const struct sitl_input &input)
- {
- const int16_t gripper_pwm = gripper_emp_servo_pin >= 1 ? input.servos[gripper_emp_servo_pin-1] : -1;
- update_servobased(gripper_pwm);
- update_from_demand();
- }
- bool Gripper_EPM::should_report()
- {
- if (AP_HAL::micros64() - last_report_us < report_interval) {
- return false;
- }
- if (fabsf(reported_field_strength - field_strength) > 10.0) {
- return true;
- }
- return false;
- }
- float Gripper_EPM::tesla()
- {
-
-
- const float percentage_to_tesla = 0.25f;
- return static_cast<float>(percentage_to_tesla * field_strength / 100.0f);
- }
|