2023-04-19 23:54:02 +08:00
|
|
|
|
|
|
|
|
|
#include "Arduino.h"
|
|
|
|
|
#include "motocontrol.h"
|
|
|
|
|
#include "moto.h"
|
2023-04-22 16:59:32 +08:00
|
|
|
|
#include <ESP32Servo.h>
|
2023-04-24 13:20:49 +08:00
|
|
|
|
#include "config.h"
|
2023-04-19 23:54:02 +08:00
|
|
|
|
|
|
|
|
|
#define DEBUG_OUT false
|
|
|
|
|
Motocontrol::Motocontrol()
|
|
|
|
|
{
|
|
|
|
|
_controlstatus.is_instore = false;
|
|
|
|
|
_controlstatus.is_setzero = false;
|
2023-04-24 13:20:49 +08:00
|
|
|
|
_controlstatus.is_overweight = false;
|
2023-04-19 23:54:02 +08:00
|
|
|
|
_controlstatus.zero_cnt = 0;
|
|
|
|
|
_controlstatus.motostatus = MotoStatus::MS_Stop;
|
2023-04-24 13:20:49 +08:00
|
|
|
|
_controlstatus.speed_targe = SPEED_BTN_SLOW;
|
2023-04-19 23:54:02 +08:00
|
|
|
|
_check_targetlength = false;
|
2023-04-24 13:20:49 +08:00
|
|
|
|
_pullweight = 0;
|
|
|
|
|
_curr_length = 0.0;
|
|
|
|
|
_hooksstatus = HS_UnInit;
|
|
|
|
|
_weightalign = false;
|
|
|
|
|
_overweightcount = 0;
|
2023-04-25 22:13:04 +08:00
|
|
|
|
_notweightcount = 0;
|
|
|
|
|
_autogoodsdown = false;
|
2023-05-07 02:56:19 +08:00
|
|
|
|
_servotatus = SS_ServoUnLocked; // 停止状态,为了防止舵机堵转,和延时关闭电机需要一个停止状态机
|
|
|
|
|
_unblocktimes = 0;
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|
|
|
|
|
Motocontrol::~Motocontrol()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-22 16:59:32 +08:00
|
|
|
|
bool Motocontrol::init(Servo *lockservo) // 初始化
|
2023-04-19 23:54:02 +08:00
|
|
|
|
{
|
2023-04-24 13:20:49 +08:00
|
|
|
|
_lockservo = lockservo;
|
2023-05-07 02:56:19 +08:00
|
|
|
|
// 不管堵转问题,马上会执行其他初始化让舵机介绍
|
|
|
|
|
_lockservo->write(SERVO_LOCKPOS);
|
|
|
|
|
_servotatus = SS_ServoLocked;
|
|
|
|
|
|
2023-04-19 23:54:02 +08:00
|
|
|
|
return _moto_dji.init();
|
|
|
|
|
}
|
2023-05-10 01:54:38 +08:00
|
|
|
|
void Motocontrol::setspeed(float motospeed, float acctime) // 设置速度
|
2023-04-19 23:54:02 +08:00
|
|
|
|
{
|
|
|
|
|
_controlstatus.speed_targe = motospeed;
|
2023-05-09 15:25:31 +08:00
|
|
|
|
_moto_dji.settime_acc(acctime);
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|
2023-04-22 16:59:32 +08:00
|
|
|
|
|
2023-04-24 13:20:49 +08:00
|
|
|
|
void Motocontrol::setweight(int pullweight) // 设置重量
|
|
|
|
|
{
|
|
|
|
|
_pullweight = pullweight;
|
2023-04-25 22:13:04 +08:00
|
|
|
|
checkgoods();
|
2023-04-24 13:20:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-25 22:13:04 +08:00
|
|
|
|
void Motocontrol::checkgoods() // 检测是否超重
|
2023-04-24 13:20:49 +08:00
|
|
|
|
{
|
|
|
|
|
// 到顶部锁定状态,有向上的压力,重量不准,不能检测
|
|
|
|
|
if (_controlstatus.is_toplocked)
|
|
|
|
|
return;
|
2023-04-25 22:13:04 +08:00
|
|
|
|
|
|
|
|
|
// 检查是否超重
|
2023-04-24 13:20:49 +08:00
|
|
|
|
if (_pullweight > HOOK_WEIHT_MAX)
|
|
|
|
|
{
|
|
|
|
|
// 防止毛刺
|
|
|
|
|
_overweightcount++;
|
2023-04-25 22:13:04 +08:00
|
|
|
|
if (_overweightcount > 40)
|
2023-04-24 13:20:49 +08:00
|
|
|
|
_controlstatus.is_overweight = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_controlstatus.is_overweight = false;
|
|
|
|
|
_overweightcount = 0;
|
|
|
|
|
}
|
2023-04-25 22:13:04 +08:00
|
|
|
|
|
|
|
|
|
// 检查是否有货物
|
|
|
|
|
if (_pullweight < HOOK_WEIHT_MIN)
|
|
|
|
|
{
|
|
|
|
|
// 防止毛刺
|
|
|
|
|
_notweightcount++;
|
|
|
|
|
if (_notweightcount > 40)
|
|
|
|
|
{
|
|
|
|
|
// printf("goods weight<min 40 times :%d \n", _pullweight);
|
|
|
|
|
_controlstatus.is_havegoods = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_controlstatus.is_havegoods = true;
|
|
|
|
|
_notweightcount = 0;
|
|
|
|
|
}
|
2023-04-24 13:20:49 +08:00
|
|
|
|
}
|
2023-05-07 02:56:19 +08:00
|
|
|
|
void Motocontrol::lockservo() // 锁定舵机
|
|
|
|
|
{
|
|
|
|
|
printf("start_lockservo\n");
|
|
|
|
|
_servotatus = SS_WaitMotoStop;
|
|
|
|
|
_tm_servotatus = millis();
|
|
|
|
|
}
|
|
|
|
|
void Motocontrol::unlockservo() // 解锁舵机
|
|
|
|
|
{
|
|
|
|
|
printf("unlockservo\n");
|
|
|
|
|
// 解锁操作
|
|
|
|
|
_lockservo->write(SERVO_UNLOCKPOS);
|
2023-05-10 01:54:38 +08:00
|
|
|
|
_moto_dji.setspeedtarget(-1.0f); // 解锁时逆向慢速转动
|
2023-05-07 02:56:19 +08:00
|
|
|
|
_servotatus = SS_WaitUnLock;
|
|
|
|
|
_tm_servotatus = millis();
|
|
|
|
|
_unblocktimes = 0;
|
|
|
|
|
}
|
2023-05-09 22:41:01 +08:00
|
|
|
|
void Motocontrol::stop(float acctime) // 停止
|
2023-04-19 23:54:02 +08:00
|
|
|
|
{
|
2023-05-07 02:56:19 +08:00
|
|
|
|
printf("stop \n");
|
2023-05-09 22:41:01 +08:00
|
|
|
|
_moto_dji.settime_acc(acctime);
|
|
|
|
|
_moto_dji.setspeedtarget(0.0f);
|
2023-04-19 23:54:02 +08:00
|
|
|
|
_controlstatus.motostatus = MS_Stop;
|
2023-05-12 00:12:07 +08:00
|
|
|
|
if ((_hooksstatus != HS_UnInit) || (_hooksstatus != HS_Stop))
|
|
|
|
|
{
|
|
|
|
|
_hooksstatus_prv = _hooksstatus;
|
|
|
|
|
_hooksstatus = HS_Stop;
|
|
|
|
|
}
|
2023-05-07 02:56:19 +08:00
|
|
|
|
lockservo();
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|
|
|
|
|
void Motocontrol::setlocked(bool locked)
|
|
|
|
|
{
|
2023-04-24 13:20:49 +08:00
|
|
|
|
if (locked)
|
|
|
|
|
{
|
|
|
|
|
stop();
|
|
|
|
|
setzero();
|
2023-04-25 22:13:04 +08:00
|
|
|
|
_hooksstatus = HS_Locked;
|
|
|
|
|
_autogoodsdown = false;
|
2023-04-24 13:20:49 +08:00
|
|
|
|
}
|
|
|
|
|
_controlstatus.is_toplocked = locked;
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|
|
|
|
|
void Motocontrol::setzero() // 设置0长度位置
|
|
|
|
|
{
|
|
|
|
|
// 记录0长度位置--以后需要保存到falsh里面
|
|
|
|
|
_controlstatus.zero_cnt = getmotoinfo().output_round_cnt;
|
|
|
|
|
_controlstatus.is_setzero = true;
|
|
|
|
|
}
|
|
|
|
|
int16_t Motocontrol::getlength() // 得到长度
|
|
|
|
|
{
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2023-04-24 13:20:49 +08:00
|
|
|
|
|
|
|
|
|
// 检测是否挂有货物
|
|
|
|
|
void Motocontrol::goodsstartup()
|
|
|
|
|
{
|
2023-04-25 22:13:04 +08:00
|
|
|
|
_hooksstatus = HS_WaitUnhook;
|
|
|
|
|
_tm_waitunhook = millis();
|
2023-04-24 13:20:49 +08:00
|
|
|
|
}
|
|
|
|
|
// 重量传感器已经校准
|
|
|
|
|
void Motocontrol::weightalign(bool weightalign)
|
|
|
|
|
{
|
|
|
|
|
_weightalign = weightalign;
|
|
|
|
|
}
|
|
|
|
|
void Motocontrol::checkhookstatus() // 检查挂钩状态
|
2023-04-19 23:54:02 +08:00
|
|
|
|
{
|
2023-04-25 22:13:04 +08:00
|
|
|
|
// 需要在自动放货物中
|
|
|
|
|
if (!_autogoodsdown)
|
|
|
|
|
return;
|
2023-05-10 01:54:38 +08:00
|
|
|
|
moto_measure_t mf = _moto_dji.getmotoinfo();
|
2023-04-24 13:20:49 +08:00
|
|
|
|
_hook_currlen = _curr_length;
|
|
|
|
|
switch (_hooksstatus)
|
|
|
|
|
{
|
|
|
|
|
// 正在下放货物
|
|
|
|
|
case HookStatus::HS_Down:
|
|
|
|
|
{
|
|
|
|
|
// 如果没有货物--开始回收
|
2023-04-25 22:13:04 +08:00
|
|
|
|
if (!_controlstatus.is_havegoods)
|
2023-04-24 13:20:49 +08:00
|
|
|
|
{
|
2023-04-25 22:13:04 +08:00
|
|
|
|
printf("HS_Down not havegoods wait unhook \n");
|
2023-04-24 13:20:49 +08:00
|
|
|
|
goodsstartup();
|
|
|
|
|
break;
|
|
|
|
|
}
|
2023-05-12 00:13:59 +08:00
|
|
|
|
if ((_goods_down_target_cnt != 0) && (mf.output_round_cnt > _goods_down_target_cnt))
|
2023-04-24 13:20:49 +08:00
|
|
|
|
{
|
2023-05-10 01:54:38 +08:00
|
|
|
|
_hooksstatus = HS_DownSlow;
|
|
|
|
|
_moto_dji.settime_acc(500);
|
2023-05-12 00:12:07 +08:00
|
|
|
|
set_hook_speed(SPEED_HOOK_SLOW);
|
2023-04-24 13:20:49 +08:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2023-05-12 00:13:59 +08:00
|
|
|
|
// 开始慢速下放
|
2023-04-24 13:20:49 +08:00
|
|
|
|
case HookStatus::HS_DownSlow:
|
|
|
|
|
{
|
2023-04-25 22:13:04 +08:00
|
|
|
|
if (!_controlstatus.is_havegoods)
|
2023-04-24 13:20:49 +08:00
|
|
|
|
{
|
2023-04-25 22:13:04 +08:00
|
|
|
|
printf("HS_DownSlow not havegoods wait unhook \n");
|
2023-04-24 13:20:49 +08:00
|
|
|
|
goodsstartup();
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2023-05-12 00:13:59 +08:00
|
|
|
|
// 等待脱钩
|
2023-04-25 22:13:04 +08:00
|
|
|
|
case HookStatus::HS_WaitUnhook:
|
|
|
|
|
{
|
|
|
|
|
if ((millis() - _tm_waitunhook) > HOOK_UNHOOK_TIME)
|
|
|
|
|
{
|
|
|
|
|
printf("HS_WaitUnhook ok startup \n");
|
2023-05-12 00:12:07 +08:00
|
|
|
|
_moto_dji.settime_acc(1000);
|
|
|
|
|
set_hook_speed(-SPEED_HOOK_UP);
|
2023-05-10 01:54:38 +08:00
|
|
|
|
_hooksstatus = HS_Up;
|
|
|
|
|
_controlstatus.motostatus = MS_Up;
|
2023-04-25 22:13:04 +08:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
2023-05-12 00:13:59 +08:00
|
|
|
|
// 开始收回
|
2023-04-24 13:20:49 +08:00
|
|
|
|
case HookStatus::HS_Up:
|
|
|
|
|
{
|
2023-05-10 01:54:38 +08:00
|
|
|
|
// 会自动设置HS_Up状态
|
2023-04-24 13:20:49 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case HookStatus::HS_InStore:
|
|
|
|
|
{
|
2023-05-10 01:54:38 +08:00
|
|
|
|
// 会自动设置HS_InStore状态
|
2023-04-25 22:13:04 +08:00
|
|
|
|
// 如果到顶部,会触发setlocked,不用在这里设置
|
2023-04-24 13:20:49 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-05-07 02:56:19 +08:00
|
|
|
|
// 检测舵机堵转---电流大或者角度不够,需要传感器
|
|
|
|
|
bool Motocontrol::checkservoblock()
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2023-04-24 13:20:49 +08:00
|
|
|
|
void Motocontrol::checkmotostatus() // 检查电机状态,比如什么时候停
|
|
|
|
|
{
|
2023-04-19 23:54:02 +08:00
|
|
|
|
moto_measure_t mf = _moto_dji.getmotoinfo();
|
2023-05-07 02:56:19 +08:00
|
|
|
|
|
|
|
|
|
// 停止状态---1防止舵机堵转,2延时关闭电机供电
|
|
|
|
|
switch (_servotatus)
|
|
|
|
|
{
|
2023-05-10 01:54:38 +08:00
|
|
|
|
case SS_WaitUnLock: // 舵机解锁
|
2023-05-07 02:56:19 +08:00
|
|
|
|
{
|
|
|
|
|
if ((millis() - _tm_servotatus) > TM_SERVOLOCK)
|
|
|
|
|
{
|
2023-05-12 00:13:59 +08:00
|
|
|
|
// 入仓时会自动设置速度,原速度不可用
|
2023-05-10 01:54:38 +08:00
|
|
|
|
if (!_controlstatus.is_instore)
|
|
|
|
|
_moto_dji.setspeedtarget(_runspeed);
|
|
|
|
|
_servotatus = SS_ServoUnLocked;
|
2023-05-07 02:56:19 +08:00
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 01:54:38 +08:00
|
|
|
|
// 等待电机停止
|
2023-05-07 02:56:19 +08:00
|
|
|
|
case SS_WaitMotoStop:
|
|
|
|
|
{
|
2023-05-10 01:54:38 +08:00
|
|
|
|
if (abs(mf.speed_rpm) < 3)
|
|
|
|
|
{
|
2023-05-07 02:56:19 +08:00
|
|
|
|
_lockservo->write(SERVO_LOCKPOS);
|
2023-05-10 01:54:38 +08:00
|
|
|
|
_servotatus = SS_WaitServo;
|
2023-05-07 02:56:19 +08:00
|
|
|
|
_tm_servotatus = millis();
|
2023-05-10 01:54:38 +08:00
|
|
|
|
}
|
2023-05-07 02:56:19 +08:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
// 等待舵机执行到位---------防止堵转,功能没有使用,采用硬件防堵转舵机
|
|
|
|
|
case SS_WaitServo:
|
|
|
|
|
{
|
|
|
|
|
// 舵机执行时间
|
|
|
|
|
if ((millis() - _tm_servotatus) > TM_SERVOLOCK)
|
|
|
|
|
{
|
2023-05-10 01:54:38 +08:00
|
|
|
|
// 检测堵转,没堵转直接关闭电机,否则打开舵机,让电机旋转一点再锁定--最多重复3次
|
2023-05-07 02:56:19 +08:00
|
|
|
|
if (!checkservoblock() || (_unblocktimes > 2))
|
|
|
|
|
{
|
|
|
|
|
printf("SS not servoblock close moto \n");
|
|
|
|
|
_moto_dji.close();
|
|
|
|
|
_servotatus = SS_ServoLocked;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
// 堵转
|
|
|
|
|
{
|
|
|
|
|
printf("SS servoblock unlock servo and turn moto \n");
|
|
|
|
|
_tm_servotatus = millis();
|
|
|
|
|
_servotatus = SS_WaitUnBlock;
|
|
|
|
|
// 写一个不会堵转的位置
|
|
|
|
|
_lockservo->write(SERVO_BLOCKUNLOCKPOS);
|
|
|
|
|
// 转一点电机角度
|
2023-05-09 22:41:01 +08:00
|
|
|
|
_moto_dji.setspeedtarget(SPEED_UNBLOCK);
|
2023-05-07 02:56:19 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case SS_WaitUnBlock:
|
|
|
|
|
{
|
|
|
|
|
if ((millis() - _tm_servotatus) > TM_UNBLOCK)
|
|
|
|
|
{
|
|
|
|
|
printf("SS lock servo \n");
|
|
|
|
|
// 继续锁定等待舵机检测
|
|
|
|
|
_lockservo->write(SERVO_LOCKPOS);
|
|
|
|
|
_servotatus = SS_WaitServo;
|
|
|
|
|
_tm_servotatus = millis();
|
|
|
|
|
_unblocktimes++;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-19 23:54:02 +08:00
|
|
|
|
// 已设置零点
|
|
|
|
|
if (_controlstatus.is_setzero)
|
|
|
|
|
{
|
|
|
|
|
// 总放线长度
|
2023-04-24 13:20:49 +08:00
|
|
|
|
_curr_length = abs(mf.output_round_cnt - _controlstatus.zero_cnt) * WHEEL_PERIMETER;
|
2023-04-19 23:54:02 +08:00
|
|
|
|
// 不能超ROPE_MAXLENGTH
|
2023-04-24 13:20:49 +08:00
|
|
|
|
if ((_curr_length > ROPE_MAXLENGTH) && (_controlstatus.motostatus == MS_Down))
|
2023-04-19 23:54:02 +08:00
|
|
|
|
stop();
|
2023-05-10 01:54:38 +08:00
|
|
|
|
// 开始入仓
|
2023-05-12 00:13:59 +08:00
|
|
|
|
// if ((_curr_length < (INSTORE_LENGTH_MIN + (mf.output_speed_rpm * mf.output_speed_rpm) * INSTORE_LENGTH_SPEED)) && (_controlstatus.motostatus == MotoStatus::MS_Up))
|
2023-05-10 01:54:38 +08:00
|
|
|
|
float instlen;
|
|
|
|
|
if (_controlstatus.is_havegoods)
|
2023-05-12 00:13:59 +08:00
|
|
|
|
instlen = INSTORE_LENGTH_MIN_GOODS + abs(mf.output_speed_rpm) * INSTORE_LENGTH_SPEED;
|
|
|
|
|
else
|
|
|
|
|
instlen = INSTORE_LENGTH_MIN_NONE + abs(mf.output_speed_rpm) * INSTORE_LENGTH_SPEED;
|
2023-05-10 01:54:38 +08:00
|
|
|
|
if ((_curr_length < instlen) && (_controlstatus.motostatus == MotoStatus::MS_Up))
|
2023-04-19 23:54:02 +08:00
|
|
|
|
{
|
2023-04-25 22:13:04 +08:00
|
|
|
|
if (!_controlstatus.is_instore)
|
|
|
|
|
{
|
2023-05-10 01:54:38 +08:00
|
|
|
|
_moto_dji.settime_acc(500);
|
2023-05-12 00:12:07 +08:00
|
|
|
|
set_hook_speed(-SPEED_INSTORE);
|
2023-04-25 22:13:04 +08:00
|
|
|
|
_controlstatus.is_instore = true;
|
|
|
|
|
_hooksstatus = HS_InStore;
|
2023-05-12 00:12:07 +08:00
|
|
|
|
printf("begin instore currlen:%.2f,instorelen:%.2f,speed:%.2f \n", _curr_length, instlen, mf.output_speed_rpm);
|
2023-04-25 22:13:04 +08:00
|
|
|
|
}
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
_controlstatus.is_instore = false;
|
|
|
|
|
}
|
|
|
|
|
if (_check_targetlength) // 有目标长度
|
|
|
|
|
{
|
|
|
|
|
if (_controlstatus.motostatus == MS_Down)
|
|
|
|
|
{
|
|
|
|
|
if (mf.output_round_cnt > _target_cnt)
|
|
|
|
|
{
|
2023-05-09 22:41:01 +08:00
|
|
|
|
printf("stop--cnt:%.2f ,tar:%.2f\n", mf.output_round_cnt, _target_cnt);
|
2023-05-10 01:54:38 +08:00
|
|
|
|
stop(1000); // 缓慢停止
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (_controlstatus.motostatus == MS_Up)
|
|
|
|
|
{
|
|
|
|
|
if (mf.output_round_cnt < _target_cnt)
|
|
|
|
|
{
|
|
|
|
|
printf("cnt:%.2f ,tar:%.2f\n", mf.output_round_cnt, _target_cnt);
|
2023-05-10 01:54:38 +08:00
|
|
|
|
stop(1000); // 缓慢停止
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-12 00:12:07 +08:00
|
|
|
|
void Motocontrol::set_hook_speed(float hooksspeed)
|
|
|
|
|
{
|
|
|
|
|
_goods_speed = hooksspeed;
|
|
|
|
|
_runspeed = hooksspeed;
|
|
|
|
|
_moto_dji.setspeedtarget(hooksspeed);
|
|
|
|
|
}
|
2023-04-19 23:54:02 +08:00
|
|
|
|
void Motocontrol::update() // 更新
|
|
|
|
|
{
|
|
|
|
|
_moto_dji.update();
|
2023-04-24 13:20:49 +08:00
|
|
|
|
checkmotostatus();
|
|
|
|
|
checkhookstatus();
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|
|
|
|
|
void Motocontrol::direct_speed(float motospeed) // 直接控制电机--测试用
|
|
|
|
|
{
|
2023-05-09 22:41:01 +08:00
|
|
|
|
_moto_dji.setspeedtarget(motospeed);
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
moto_measure_t Motocontrol::getmotoinfo()
|
|
|
|
|
{
|
|
|
|
|
return _moto_dji.getmotoinfo();
|
|
|
|
|
}
|
|
|
|
|
control_status_t Motocontrol::getcontrolstatus() // 得到控制信息
|
|
|
|
|
{
|
|
|
|
|
return _controlstatus;
|
|
|
|
|
}
|
2023-04-24 13:20:49 +08:00
|
|
|
|
|
2023-05-12 00:12:07 +08:00
|
|
|
|
void Motocontrol::moto_goodsdownresume()
|
|
|
|
|
{
|
|
|
|
|
if (_hooksstatus == HS_Stop)
|
|
|
|
|
{
|
|
|
|
|
_runspeed = _goods_speed;
|
|
|
|
|
if (_hooksstatus_prv == HS_Up)
|
|
|
|
|
_controlstatus.motostatus = MS_Up;
|
|
|
|
|
if (_hooksstatus_prv == HS_InStore)
|
|
|
|
|
{
|
|
|
|
|
_controlstatus.motostatus = MS_Up;
|
|
|
|
|
_runspeed = -SPEED_INSTORE;
|
|
|
|
|
}
|
|
|
|
|
_hooksstatus = _hooksstatus_prv;
|
|
|
|
|
_moto_dji.settime_acc(1000);
|
|
|
|
|
unlockservo(); // 打开舵机
|
|
|
|
|
// _moto_dji.setspeedtarget(_goods_speed);
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-04-24 13:20:49 +08:00
|
|
|
|
void Motocontrol::moto_goodsdown(float length)
|
|
|
|
|
{
|
2023-04-25 22:13:04 +08:00
|
|
|
|
if (length < 0.0)
|
|
|
|
|
{
|
|
|
|
|
printf("length<0 fault\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2023-04-24 13:20:49 +08:00
|
|
|
|
// 没设置零点
|
|
|
|
|
if (!_controlstatus.is_setzero)
|
|
|
|
|
{
|
|
|
|
|
printf("not lengthzero fault\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2023-04-25 22:13:04 +08:00
|
|
|
|
if (!_weightalign)
|
2023-04-24 13:20:49 +08:00
|
|
|
|
{
|
|
|
|
|
printf("weight not align fault\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2023-04-25 22:13:04 +08:00
|
|
|
|
// 没挂东西
|
2023-05-07 02:56:19 +08:00
|
|
|
|
if (!_controlstatus.is_havegoods)
|
2023-04-24 13:20:49 +08:00
|
|
|
|
{
|
2023-04-25 22:13:04 +08:00
|
|
|
|
printf("goods min fault:%d \n", _pullweight);
|
2023-04-24 13:20:49 +08:00
|
|
|
|
return;
|
|
|
|
|
}
|
2023-04-25 22:13:04 +08:00
|
|
|
|
|
|
|
|
|
// 开始自动放货物状态
|
|
|
|
|
_autogoodsdown = true;
|
|
|
|
|
// 长度=0,直接中慢速下降,
|
2023-04-24 13:20:49 +08:00
|
|
|
|
if (length == 0.0)
|
2023-05-12 00:13:59 +08:00
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
_goods_down_target_cnt = 0;
|
2023-04-24 13:20:49 +08:00
|
|
|
|
setspeed(SPEED_HOOK_CHECK);
|
2023-05-12 00:12:07 +08:00
|
|
|
|
_goods_speed = SPEED_HOOK_CHECK;
|
2023-04-25 22:13:04 +08:00
|
|
|
|
}
|
2023-04-24 13:20:49 +08:00
|
|
|
|
else
|
2023-05-12 00:13:59 +08:00
|
|
|
|
{
|
2023-05-10 01:54:38 +08:00
|
|
|
|
_goods_down_start_cnt = _moto_dji.getmotoinfo().output_round_cnt;
|
|
|
|
|
_goods_down_target_cnt = _goods_down_start_cnt + length / WHEEL_PERIMETER;
|
2023-05-12 00:13:59 +08:00
|
|
|
|
setspeed(SPEED_HOOK_FAST, TM_ACC_HS);
|
2023-05-12 00:12:07 +08:00
|
|
|
|
_goods_speed = SPEED_HOOK_FAST;
|
2023-04-25 22:13:04 +08:00
|
|
|
|
}
|
2023-05-10 01:54:38 +08:00
|
|
|
|
moto_run(MS_Down);
|
2023-04-24 13:20:49 +08:00
|
|
|
|
}
|
2023-04-25 22:13:04 +08:00
|
|
|
|
|
2023-04-19 23:54:02 +08:00
|
|
|
|
// 按指定速度收放线 放线为+,收线为- 单位cm
|
|
|
|
|
void Motocontrol::moto_run(MotoStatus updown, float length)
|
|
|
|
|
{
|
|
|
|
|
// 传入要stop,直接停
|
|
|
|
|
if (updown == MS_Stop)
|
|
|
|
|
{
|
|
|
|
|
stop();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 运动中暂时不管
|
|
|
|
|
if ((_controlstatus.motostatus == MS_Down) || (_controlstatus.motostatus == MS_Up))
|
2023-04-24 13:20:49 +08:00
|
|
|
|
{
|
|
|
|
|
printf("motostatus is MS_Down\\MS_Up \n");
|
2023-04-19 23:54:02 +08:00
|
|
|
|
return;
|
2023-04-24 13:20:49 +08:00
|
|
|
|
}
|
2023-04-19 23:54:02 +08:00
|
|
|
|
// 没设置速度不转
|
|
|
|
|
if (_controlstatus.speed_targe == 0)
|
2023-04-24 13:20:49 +08:00
|
|
|
|
{
|
|
|
|
|
printf("not set speed_targe \n");
|
2023-04-19 23:54:02 +08:00
|
|
|
|
return;
|
2023-04-24 13:20:49 +08:00
|
|
|
|
}
|
|
|
|
|
if (updown == MS_Up)
|
|
|
|
|
{
|
2023-04-25 22:13:04 +08:00
|
|
|
|
if (_controlstatus.is_toplocked)
|
|
|
|
|
{
|
|
|
|
|
printf("is_toplocked return\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2023-04-24 13:20:49 +08:00
|
|
|
|
if (_controlstatus.is_overweight)
|
|
|
|
|
{
|
|
|
|
|
printf("overweight fault :%d \n", _pullweight);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2023-04-25 22:13:04 +08:00
|
|
|
|
_hooksstatus = HS_Up;
|
2023-04-24 13:20:49 +08:00
|
|
|
|
}
|
2023-04-25 22:13:04 +08:00
|
|
|
|
else
|
|
|
|
|
_hooksstatus = HS_Down;
|
2023-04-19 23:54:02 +08:00
|
|
|
|
|
2023-05-07 02:56:19 +08:00
|
|
|
|
unlockservo();
|
2023-04-22 16:59:32 +08:00
|
|
|
|
|
2023-04-19 23:54:02 +08:00
|
|
|
|
_controlstatus.motostatus = updown;
|
|
|
|
|
// 有长度限制
|
|
|
|
|
if (length != 0)
|
|
|
|
|
{
|
|
|
|
|
// 收需要负
|
|
|
|
|
if (updown == MotoStatus::MS_Up)
|
|
|
|
|
length = -length;
|
|
|
|
|
// 记录开始位置
|
|
|
|
|
_start_cnt = _moto_dji.getmotoinfo().output_round_cnt;
|
|
|
|
|
_target_cnt = _start_cnt + length / WHEEL_PERIMETER;
|
|
|
|
|
_check_targetlength = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
_check_targetlength = false;
|
|
|
|
|
|
|
|
|
|
// 记录开始位置
|
|
|
|
|
float runspeed;
|
|
|
|
|
if (updown == MotoStatus::MS_Down)
|
|
|
|
|
runspeed = _controlstatus.speed_targe;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// 如果没有设置零点,不能快速收线
|
|
|
|
|
if (!_controlstatus.is_setzero)
|
2023-04-24 13:20:49 +08:00
|
|
|
|
_controlstatus.speed_targe = SPEED_BTN_SLOW;
|
2023-04-19 23:54:02 +08:00
|
|
|
|
runspeed = -_controlstatus.speed_targe;
|
|
|
|
|
}
|
|
|
|
|
// 开始转
|
|
|
|
|
printf("run speed:%.0f,tarcnt:%.2f\n", runspeed, _target_cnt);
|
2023-05-10 01:54:38 +08:00
|
|
|
|
_runspeed = runspeed;
|
|
|
|
|
// _moto_dji.setspeedtarget(runspeed);
|
2023-04-19 23:54:02 +08:00
|
|
|
|
}
|