Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WaveStatus中的SWING_ALL有什么用?同时在State_Trotting.cpp文件中的exit()函数中,为什么要设置_ctrlComp->setAllSwing()? #79

Open
xliu0105 opened this issue Jun 12, 2024 · 4 comments

Comments

@xliu0105
Copy link

我不太明白,在现有的代码及实现的功能中,SWING_ALL这个WaveStatus有什么用,这个应该是代表所有的足端都悬空吧,也许如果之后实现后空翻可能会用到这种状态?现有的代码这个有什么用。

在State_Trotting.cpp文件中的exit()函数的最后一行,代码设置了:_ctrlComp->setAllSwing(),请问这里是为什么?经过我测试,有这一行代码和没有这一行代码其实效果完全一样,而且我认为这一行代码其实是没啥用的。

@xiaoliangstd
Copy link
Collaborator

你好,_ctrlComp->setAllSwing() 这条语句是有作用的,但可能不是很直观,说起来可能有点长。在 FSM::run() 函数中,在_currentState->run();函数前会首先运行两条语句 _ctrlComp->runWaveGen();
_ctrlComp->estimator->run();,,这两条语句中的第一条是要进行一次步态规划器迭代(即计算出下一时刻那条腿要触地,那条腿要摆动),然后第二条是要进行一次估计器迭代。 可以看出步态规划器迭代和估计器迭代都是独立于状态机迭代的。而估计器会根据腿部的接触状态进行一个计算迭代,这就依赖于步态规划器的结果,,然后我们的状态机不是每一个状态机都是有关运动控制的,即在 State_FixedStand 状态机中,我们四条腿都是触地的, 在 State_Trotting 状态机中,我们是对角腿部交替触地,前面提到 步态规划器的结果会影响到 估计器迭代结果,如果我们在退出 State_Trotting 状态机(比如下一个切换到 State_FixedStand )的时候没有通过_ctrlComp->setAllSwing()语句设置我们将要四腿悬空, 那么在State_FixedStand状态机运行时,估计器还会以为我们在以对角步态在运动,这我们实际情况不一致,会导致估计器的结果偏移,故要这么设置。

@xliu0105
Copy link
Author

您好,感谢您的回答,但我还是有一些不理解。
在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了,所以我还是感觉这里那一行代码是多余的。

@xiaoliangstd
Copy link
Collaborator

您好,感谢您的回答,但我还是有一些不理解。 在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 里事先设置好,有一份保险。但从理性上看,确实是没有机会执行。

@xiaoliangstd
Copy link
Collaborator

您好,感谢您的回答,但我还是有一些不理解。 在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了,所以我还是感觉这里那一行代码是多余的。

那您这里可以直接去掉也行,应该问题不大

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

No branches or pull requests

2 participants