Skip to content

Conversation

@Naoki-Hiraoka
Copy link
Contributor

@Naoki-Hiraoka Naoki-Hiraoka commented Sep 13, 2022

RobotHardwareからemergencySignalとしてEMG_SERVO_ERRORが出ていて、このif文によって全身がservo offするにも関わらず、

if (reason == robot::EMG_SERVO_ERROR || reason == robot::EMG_POWER_OFF){
m_robot->servo("all", false);

実際にはEMG_SERVO_ALARMが発生していて、EMG_SERVO_ERRORは発生していない、というバグがあります。

原因は、変数reasonはenumの初期値としてEMG_SERVO_ERRORが入っていて、

typedef enum {EMG_SERVO_ERROR, EMG_FZ, EMG_SERVO_ALARM, EMG_POWER_OFF} emg_reason;

SS_EMERGENCYが発生していてm_reportedEmergencytrueの場合には変数reasonが初期値のまま変更されずに返るためでした。

for (unsigned int i=0; i<numJoints(); i++){
if (!read_servo_alarm(i, &alarm)) continue;
if (alarm & SS_EMERGENCY) {
if (!m_reportedEmergency) {
m_reportedEmergency = true;
o_reason = EMG_SERVO_ALARM;
o_id = i;
}
return true;
}

このバグがあるとemergencyの原因をデバッグすることが困難になってしまうので、変数reasonEMG_SERVO_ALARMを入れてから返るように修正しました。

(関連)
2d088ad
#556
#564

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant