Open xliu0105 opened 5 months ago
你好,_ctrlComp->setAllSwing() 这条语句是有作用的,但可能不是很直观,说起来可能有点长。在 FSM::run() 函数中,在_currentState->run();函数前会首先运行两条语句 _ctrlComp->runWaveGen(); _ctrlComp->estimator->run();,,这两条语句中的第一条是要进行一次步态规划器迭代(即计算出下一时刻那条腿要触地,那条腿要摆动),然后第二条是要进行一次估计器迭代。 可以看出步态规划器迭代和估计器迭代都是独立于状态机迭代的。而估计器会根据腿部的接触状态进行一个计算迭代,这就依赖于步态规划器的结果,,然后我们的状态机不是每一个状态机都是有关运动控制的,即在 State_FixedStand 状态机中,我们四条腿都是触地的, 在 State_Trotting 状态机中,我们是对角腿部交替触地,前面提到 步态规划器的结果会影响到 估计器迭代结果,如果我们在退出 State_Trotting 状态机(比如下一个切换到 State_FixedStand )的时候没有通过_ctrlComp->setAllSwing()语句设置我们将要四腿悬空, 那么在State_FixedStand状态机运行时,估计器还会以为我们在以对角步态在运动,这我们实际情况不一致,会导致估计器的结果偏移,故要这么设置。
您好,感谢您的回答,但我还是有一些不理解。 在FSM::run()函数中,如果_mode == FSMMode::CHANGE,这时就会进行state切换,以从State_Trotting切换到State_FixedStand为例,首先运行State_Trotting的exit()函数,在这个exit()函数中最后一行执行了_ctrlComp->setAllSwing();之后在FSM::run中继续执行_currentState = _nextState,即将State_FixedStand设为当前的State,然后执行State_FixedStand的enter()函数,在这个enter()函数中最后一行执行了_ctrlComp->setAllStance()。 在整个过程中,并没有执行runWaveGen()和estimator->run()啊,WaveStatus就已经换到STANCE_ALL了,所以我还是感觉这里那一行代码是多余的。
您好,感谢您的回答,但我还是有一些不理解。 在FSM::run()函数中,如果_mode == FSMMode::CHANGE,这时就会进行state切换,以从State_Trotting切换到State_FixedStand为例,首先运行State_Trotting的exit()函数,在这个exit()函数中最后一行执行了_ctrlComp->setAllSwing();之后在FSM::run中继续执行_currentState = _nextState,即将State_FixedStand设为当前的State,然后执行State_FixedStand的enter()函数,在这个enter()函数中最后一行执行了_ctrlComp->setAllStance()。 在整个过程中,并没有执行runWaveGen()和estimator->run()啊,WaveStatus就已经换到STANCE_ALL了,所以我还是感觉这里那一行代码是多余的。
听你这么一说确实是的,但我认为这里之所以加上是因为,万一在 别的状态机里没有或者忘了设置,在 State_Trotting 里事先设置好,有一份保险。但从理性上看,确实是没有机会执行。
您好,感谢您的回答,但我还是有一些不理解。 在FSM::run()函数中,如果_mode == FSMMode::CHANGE,这时就会进行state切换,以从State_Trotting切换到State_FixedStand为例,首先运行State_Trotting的exit()函数,在这个exit()函数中最后一行执行了_ctrlComp->setAllSwing();之后在FSM::run中继续执行_currentState = _nextState,即将State_FixedStand设为当前的State,然后执行State_FixedStand的enter()函数,在这个enter()函数中最后一行执行了_ctrlComp->setAllStance()。 在整个过程中,并没有执行runWaveGen()和estimator->run()啊,WaveStatus就已经换到STANCE_ALL了,所以我还是感觉这里那一行代码是多余的。
那您这里可以直接去掉也行,应该问题不大
我不太明白,在现有的代码及实现的功能中,SWING_ALL这个WaveStatus有什么用,这个应该是代表所有的足端都悬空吧,也许如果之后实现后空翻可能会用到这种状态?现有的代码这个有什么用。
在State_Trotting.cpp文件中的exit()函数的最后一行,代码设置了:_ctrlComp->setAllSwing(),请问这里是为什么?经过我测试,有这一行代码和没有这一行代码其实效果完全一样,而且我认为这一行代码其实是没啥用的。