autoware 之 op_behavior_selector行为选择器状态机代码分析

news2025/2/12 3:57:45

autoware 1 op_behavior_selector行为选择器状态机代码分析

/这里是整个状态机运行时的结构:/

    //停止状态:[#停止状态]
    //任务完成状态:[#任务完成状态]
    //转向状态:[*前进状态,#转向状态]
    //停止信号停止状态:[*停止信号等待状态,#停止信号停止状态]
    //前进状态 :[*目标状态, #前进状态, 转向状态, 停止信号停止状态, 交通灯停止状态, 跟随状态, ]
    //目标状态 :[*任务完成状态,#目标状态, 前进状态]
    //停止信号等待状态:[*前进状态,#停止信号等待状态,停止信号停止状态, 目标状态]
    //交通灯停止状态:[*前进状态, #交通灯停止状态, 交通灯等待状态]
    //交通灯等待状态:[*前进状态, #交通灯等待状态, 交通灯停止状态, 目标状态]
    //跟随状态:[*前进状态, #跟随状态, 转向状态, 停止信号停止状态, 交通灯停止状态, 目标状态]
    //初始状态:[*前进状态, #初始状态]

autoware 1 op行为选择器状态机代码分析

/*
有几个问题
1、等待状态 没有用到的地方
2、停止状态 除了初始化作用之外,其他没有用到的地方
3、任务完成状态 只有 目标状态能切换到位,但是,一旦切入就切换不出去了。这块儿,会不会导致状态机停滞?????待查
待深入
*/

上码(做了部分注释)


//-------------------------------------------------------------------------------------------------
/*
/r2ware.ai/src/autoware/core_planning/op_local_planner/nodes/op_behavior_selector
op_behavior_selector.cpp

*/

/*
如果 新位置 有全局路径
    如果新灯状态
        如果新信号灯
            检测灯设为当前灯
        更新 检测灯状态
*/        
    //当前行为 设为=刷新行为(间隔时间,当前位置,车辆状态,1, 检测灯,轨迹最佳代价,0,m_loop)
    m_CurrentBehavior = m_BehaviorGenerator.DoOneStep(dt, m_CurrentPos, m_VehicleStatus, 1, m_PrevTrafficLight, m_TrajectoryBestCost, 0 , m_Loop);


//void BehaviorGen::MainLoop()中循环判断执行:

if(bNewCurrentPos && m_GlobalPaths.size()>0)
		{
			if(bNewLightStatus)
			{
			        if(bNewLightSignal)
			        {
			    	        m_PrevTrafficLight = m_CurrTrafficLight;
				        bNewLightSignal = false;
			        }
				bNewLightStatus = false;
//				std::cout << "m_PrevTrafficLight.size(): " << m_PrevTrafficLight.size() << std::endl;
				for(unsigned int itls = 0 ; itls < m_PrevTrafficLight.size() ; itls++){
					m_PrevTrafficLight.at(itls).lightState = m_CurrLightStatus;
//					std::cout << "itls: " << itls << " lightState: " << m_CurrLightStatus << std::endl;
			        }
			}

			m_CurrentBehavior = m_BehaviorGenerator.DoOneStep(dt, m_CurrentPos, m_VehicleStatus, 1, m_PrevTrafficLight, m_TrajectoryBestCost, 0 , m_Loop);

			SendLocalPlanningTopics();
			VisualizeLocalPlanner();
			LogLocalPlanningInfo(dt);
		}
		else
			sub_GlobalPlannerPaths = nh.subscribe("/lane_waypoints_array", 	1,		&BehaviorGen::callbackGetGlobalPlannerPath, 	this);


//m_CurrentBehavior
//m_BehaviorGenerator
//定义

//-------------------------------------------------------------------------------------------------
/*~/r2ware.ai/src/autoware/core_planning/op_local_planner/include
op_behavior_selector_core.h
*/
//85行
	PlannerHNS::DecisionMaker m_BehaviorGenerator;
	PlannerHNS::BehaviorState m_CurrentBehavior;


/*可见执行
m_CurrentBehavior返回的是  PlannerHNS::BehaviorState beh;
*/


//PlannerHNS::BehaviorState DecisionMaker::DoOneStep()定义
//-------------------------------------------------------------------------------------------------
/*~/r2ware.ai/src/autoware/common/op_planner/src
DecisionMaker.cpp
*/


PlannerHNS::BehaviorState DecisionMaker::DoOneStep 中有
	 PlannerHNS::BehaviorState beh;
        //。。。
	if(m_TotalPath.size()==0) return beh;

	UpdateCurrentLane(m_MaxLaneSearchDistance);
	CalculateImportantParameterForDecisionMaking(vehicleState, goalID, bEmergencyStop, trafficLight, tc, loop);
	beh = GenerateBehaviorState(vehicleState);
	beh.bNewPlan = SelectSafeTrajectory();
	beh.maxVelocity = UpdateVelocityDirectlyToTrajectory(beh, vehicleState, dt);
	return beh;


PlannerHNS::BehaviorState DecisionMaker::GenerateBehaviorState(const PlannerHNS::VehicleState& vehicleState)
 
  m_pCurrentBehaviorState = m_pCurrentBehaviorState->GetNextState();//===================跳转状态
  if(m_pCurrentBehaviorState==0)
    m_pCurrentBehaviorState = m_pInitState;



//m_pCurrentBehaviorState定义
//BehaviorStateMachine* 行为状态机 指针
//-------------------------------------------------------------------------------------------------
/*~/r2ware.ai/src/autoware/common/op_planner/include/op_planner
DecisionMaker.h

*/
namespace PlannerHNS
{

class DecisionMaker

	BehaviorStateMachine* 		m_pCurrentBehaviorState;//------------------基类指针
        //以下为BehaviorStateMachine子类实例指针 12个
	StopState* 					m_pStopState;//
	WaitState* 					m_pWaitState;//-------     没有实例
	SwerveStateII*				m_pAvoidObstacleState;
	TrafficLightStopStateII*	m_pTrafficLightStopState;
	TrafficLightWaitStateII*	m_pTrafficLightWaitState;

	ForwardStateII * 			m_pGoToGoalState;;
	InitStateII* 				m_pInitState;
	MissionAccomplishedStateII*	m_pMissionCompleteState;
	GoalStateII*				m_pGoalState;
	FollowStateII*				m_pFollowState;
	StopSignStopStateII* 			m_pStopSignStopState;
	StopSignWaitStateII* 			m_pStopSignWaitState;





void DecisionMaker::InitBehaviorStates()
{
        //这里初始化,开始组织出整个状态机的结构
	m_pStopState 		= new StopState(&m_params, 0, 0);
	m_pMissionCompleteState = new MissionAccomplishedStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), 0);
	m_pGoalState		= new GoalStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), m_pMissionCompleteState);
	m_pGoToGoalState 	= new ForwardStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), m_pGoalState);
	m_pInitState 		= new InitStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), m_pGoToGoalState);

	m_pFollowState		= new FollowStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), m_pGoToGoalState);
	m_pAvoidObstacleState	= new SwerveStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), m_pGoToGoalState);
	m_pStopSignWaitState	= new StopSignWaitStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), m_pGoToGoalState);
	m_pStopSignStopState	= new StopSignStopStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), m_pStopSignWaitState);

	m_pTrafficLightWaitState= new TrafficLightWaitStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), m_pGoToGoalState);
	m_pTrafficLightStopState= new TrafficLightStopStateII(m_pStopState->m_pParams, m_pStopState->GetCalcParams(), m_pGoToGoalState);
        //停止状态:[#停止状态]
        //任务完成状态:[#任务完成状态]
        //转向状态:[*前进状态,#转向状态]
        //停止信号停止状态:[*停止信号等待状态,#停止信号停止状态]
/*
1.前进状态
2.任务完成状态
3.跟随状态
4.转向状态
5.停止状态
6.交通灯停止状态
7.交通灯等待状态
8.停止信号停止状态
9.停止信号等待状态
10.等待状态
11.初始状态
12.目标状态
*/
        //前进状态 :[*目标状态, #前进状态, 转向状态, 停止信号停止状态, 交通灯停止状态, 跟随状态, ]
	m_pGoToGoalState->InsertNextState(m_pAvoidObstacleState);
	m_pGoToGoalState->InsertNextState(m_pStopSignStopState);
	m_pGoToGoalState->InsertNextState(m_pTrafficLightStopState);
	m_pGoToGoalState->InsertNextState(m_pFollowState);
	m_pGoToGoalState->decisionMakingCount = 0;//m_params.nReliableCount;
        //目标状态 :[*任务完成状态,#目标状态, 前进状态]
	m_pGoalState->InsertNextState(m_pGoToGoalState);
        //停止信号等待状态:[*前进状态,#停止信号等待状态,停止信号停止状态, 目标状态]
	m_pStopSignWaitState->decisionMakingTime = m_params.stopSignStopTime;
	m_pStopSignWaitState->InsertNextState(m_pStopSignStopState);
	m_pStopSignWaitState->InsertNextState(m_pGoalState);

        //交通灯停止状态:[*前进状态, #交通灯停止状态, 交通灯等待状态]
	m_pTrafficLightStopState->InsertNextState(m_pTrafficLightWaitState);
        //交通灯等待状态:[*前进状态, #交通灯等待状态, 交通灯停止状态, 目标状态]
	m_pTrafficLightWaitState->InsertNextState(m_pTrafficLightStopState);
	m_pTrafficLightWaitState->InsertNextState(m_pGoalState);
        //跟随状态:[*前进状态, #跟随状态, 转向状态, 停止信号停止状态, 交通灯停止状态, 目标状态]
	m_pFollowState->InsertNextState(m_pAvoidObstacleState);
	m_pFollowState->InsertNextState(m_pStopSignStopState);
	m_pFollowState->InsertNextState(m_pTrafficLightStopState);
	m_pFollowState->InsertNextState(m_pGoalState);
	m_pFollowState->decisionMakingCount = 0;//m_params.nReliableCount;
        //初始状态:[*前进状态, #初始状态]
	m_pInitState->decisionMakingCount = 0;//m_params.nReliableCount;

	m_pCurrentBehaviorState = m_pInitState;
}

       /*整个状态机运行时的结构:*/

        //停止状态:[#停止状态]
        //任务完成状态:[#任务完成状态]
        //转向状态:[*前进状态,#转向状态]
        //停止信号停止状态:[*停止信号等待状态,#停止信号停止状态]
        //前进状态 :[*目标状态, #前进状态, 转向状态, 停止信号停止状态, 交通灯停止状态, 跟随状态, ]
        //目标状态 :[*任务完成状态,#目标状态, 前进状态]
        //停止信号等待状态:[*前进状态,#停止信号等待状态,停止信号停止状态, 目标状态]
        //交通灯停止状态:[*前进状态, #交通灯停止状态, 交通灯等待状态]
        //交通灯等待状态:[*前进状态, #交通灯等待状态, 交通灯停止状态, 目标状态]
        //跟随状态:[*前进状态, #跟随状态, 转向状态, 停止信号停止状态, 交通灯停止状态, 目标状态]
        //初始状态:[*前进状态, #初始状态]



//-------------------------------------------------------------------------------------------------
/*~/r2ware.ai/src/autoware/common/op_planner/src
BehaviorStateMachine.cpp
*/



//-------------------------------------------------------------------------------------------------
/*/r2ware.ai/src/autoware/common/op_planner/include/op_planner
RoadNetwork.h
*/
//路网工作头文件中枚举定义


namespace PlannerHNS
{


enum DIRECTION_TYPE {	FORWARD_DIR, FORWARD_LEFT_DIR, FORWARD_RIGHT_DIR,
	BACKWARD_DIR, BACKWARD_LEFT_DIR, BACKWARD_RIGHT_DIR, STANDSTILL_DIR};

enum OBSTACLE_TYPE {SIDEWALK, TREE, CAR, TRUCK, HOUSE, PEDESTRIAN, CYCLIST, GENERAL_OBSTACLE};

enum DRIVABLE_TYPE {DIRT, TARMAC, PARKINGAREA, INDOOR, GENERAL_AREA};

enum GLOBAL_STATE_TYPE {G_WAITING_STATE, G_PLANING_STATE, G_FORWARD_STATE, G_BRANCHING_STATE, G_FINISH_STATE};
//状态类型枚举
enum STATE_TYPE {INITIAL_STATE, WAITING_STATE, FORWARD_STATE, STOPPING_STATE, EMERGENCY_STATE,
	TRAFFIC_LIGHT_STOP_STATE,TRAFFIC_LIGHT_WAIT_STATE, STOP_SIGN_STOP_STATE, STOP_SIGN_WAIT_STATE, FOLLOW_STATE, LANE_CHANGE_STATE, OBSTACLE_AVOIDANCE_STATE, GOAL_STATE, FINISH_STATE, YIELDING_STATE, BRANCH_LEFT_STATE, BRANCH_RIGHT_STATE};

enum LIGHT_INDICATOR {INDICATOR_LEFT, INDICATOR_RIGHT, INDICATOR_BOTH , INDICATOR_NONE};

enum SHIFT_POS {SHIFT_POS_PP = 0x60, SHIFT_POS_RR = 0x40, SHIFT_POS_NN = 0x20,
	SHIFT_POS_DD = 0x10, SHIFT_POS_BB = 0xA0, SHIFT_POS_SS = 0x0f, SHIFT_POS_UU = 0xff };


//动作类型枚举
enum ACTION_TYPE {FORWARD_ACTION, BACKWARD_ACTION, STOP_ACTION, LEFT_TURN_ACTION,
	RIGHT_TURN_ACTION, U_TURN_ACTION, SWERVE_ACTION, OVERTACK_ACTION, START_ACTION, SLOWDOWN_ACTION, CHANGE_DESTINATION, WAITING_ACTION, DESTINATION_REACHED,  UNKOWN_ACTION};


//行为状态类型枚举
enum BEH_STATE_TYPE {BEH_FORWARD_STATE=0,BEH_STOPPING_STATE=1, BEH_BRANCH_LEFT_STATE=2, BEH_BRANCH_RIGHT_STATE=3, BEH_YIELDING_STATE=4, BEH_ACCELERATING_STATE=5, BEH_SLOWDOWN_STATE=6};

enum SEGMENT_TYPE {NORMAL_ROAD_SEG, INTERSECTION_ROAD_SEG, UTURN_ROAD_SEG, EXIT_ROAD_SEG, MERGE_ROAD_SEG, HIGHWAY_ROAD_SEG};
enum RoadSegmentType {NORMAL_ROAD, INTERSECTION_ROAD, UTURN_ROAD, EXIT_ROAD, MERGE_ROAD, HIGHWAY_ROAD};

enum MARKING_TYPE {UNKNOWN_MARK, TEXT_MARK, AF_MARK, AL_MARK, AR_MARK, AFL_MARK, AFR_MARK, ALR_MARK, UTURN_MARK, NOUTURN_MARK};

enum TrafficSignTypes {UNKNOWN_SIGN, STOP_SIGN, MAX_SPEED_SIGN, MIN_SPEED_SIGN};


//-------------------------------------------------------------------------------------------------
/*/r2ware.ai/src/autoware/common/op_planner/include/op_planner
BehaviorStateMachine.h

*/
//行为状态机

//定义基类 


namespace PlannerHNS
{
class BehaviorStateMachine
	virtual BehaviorStateMachine* GetNextState() = 0;//子类实现功能,切换下一个状态
	virtual void Init();
	virtual void ResetTimer();
	virtual void InsertNextState(BehaviorStateMachine* nextState);//插入下一个状态
	BehaviorStateMachine(PlanningParams* pParams, PreCalculatedConditions* pPreCalcVal, BehaviorStateMachine* nextState);
	virtual ~BehaviorStateMachine() ;
	STATE_TYPE m_Behavior;//状态类型--------------------------------------
	。。。
	。。。
	std::vector<BehaviorStateMachine*> pNextStates;//下一个状态列表

	BehaviorStateMachine* FindBehaviorState(const STATE_TYPE& behavior);//查找状态
        //遍历 pNextStates 每个元素为 pState 
        //   若pState && behavior == pState->m_Behavior
        //                if(pState == 0) return this;          -------------容错???

	//		m_BehaviorsLog.clear();
	//		pState->ResetTimer();
	//		return pState;
        // pNextStates为空返回空指针

	void UpdateLogCount(BehaviorStateMachine* pState);//-------------------------注释了???!!!
        //从 m_BehaviorsLog查找 pState相关 行为,找到提升对中的数字
        //找不到则插入 默认组对数字为1


	BehaviorStateMachine* FindBestState(int nMinCount);//查找最好状态
        //从 m_BehaviorsLog查找 对数字大于nMinCount 的行为
        //找不到返回空指针

	std::vector<std::pair<BehaviorStateMachine*, int> > m_BehaviorsLog;//
        //行为实例 与数字 构成一对,存入列表
        
/*
1.ForwardState
  ForwardStateII
2.MissionAccomplishedState
  MissionAccomplishedStateII
3.FollowState
  FollowStateII
4.SwerveState
  SwerveStateII
5.StopState

6.TrafficLightStopState
  TrafficLightStopStateII
7.TrafficLightWaitState
  TrafficLightWaitStateII
8.StopSignStopState
  StopSignStopStateII
9.StopSignWaitState
  StopSignWaitStateII
10.WaitState

11.InitState
  InitStateII
12.GoalState
  GoalStateII

1.前进状态
2.任务完成状态
3.跟随状态
4.转向状态
5.停止状态
6.交通灯停止状态
7.交通灯等待状态
8.停止信号停止状态
9.停止信号等待状态
10.等待状态
11.初始状态
12.目标状态

*/
//------------------------------------------------------------------
/*
以下是各个状态类的实现扼要
有关切换条件做了简要注释

*/

class ForwardState : public BehaviorStateMachine
m_Behavior = FORWARD_STATE;

class ForwardStateII : public BehaviorStateMachine
m_Behavior = FORWARD_STATE;

class MissionAccomplishedState : public BehaviorStateMachine
m_Behavior = FINISH_STATE;

class MissionAccomplishedStateII : public BehaviorStateMachine
m_Behavior = FINISH_STATE;

class FollowState : public BehaviorStateMachine
m_Behavior = FOLLOW_STATE;

class FollowStateII : public BehaviorStateMachine
m_Behavior = FOLLOW_STATE;

class SwerveState : public BehaviorStateMachine
m_Behavior = OBSTACLE_AVOIDANCE_STATE;

class SwerveStateII : public BehaviorStateMachine
m_Behavior = OBSTACLE_AVOIDANCE_STATE;

class StopState : public BehaviorStateMachine
m_Behavior = STOPPING_STATE;

class TrafficLightStopState : public BehaviorStateMachine
m_Behavior = TRAFFIC_LIGHT_STOP_STATE;

class TrafficLightWaitState : public BehaviorStateMachine
m_Behavior = TRAFFIC_LIGHT_WAIT_STATE;

class StopSignStopState : public BehaviorStateMachine
m_Behavior = STOP_SIGN_STOP_STATE;

class StopSignStopStateII : public BehaviorStateMachine
m_Behavior = STOP_SIGN_STOP_STATE;

class StopSignWaitState : public BehaviorStateMachine
m_Behavior = STOP_SIGN_WAIT_STATE;

class StopSignWaitStateII : public BehaviorStateMachine
m_Behavior = STOP_SIGN_WAIT_STATE;

class WaitState : public BehaviorStateMachine
m_Behavior = WAITING_STATE;

class InitState : public BehaviorStateMachine
m_Behavior = INITIAL_STATE;

class InitStateII : public BehaviorStateMachine
m_Behavior = INITIAL_STATE;

class GoalState : public BehaviorStateMachine
m_Behavior = GOAL_STATE;

class GoalStateII : public BehaviorStateMachine
m_Behavior = GOAL_STATE;

class TrafficLightStopStateII : public BehaviorStateMachine
m_Behavior = TRAFFIC_LIGHT_STOP_STATE;

class TrafficLightWaitStateII : public BehaviorStateMachine
m_Behavior = TRAFFIC_LIGHT_WAIT_STATE;





BehaviorStateMachine* ForwardState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this; //return this behavior only , without reset

	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->currentGoalID != pCParams->prevGoalID)
		return FindBehaviorState(GOAL_STATE);

	else if(m_pParams->enableSwerving
			&& pCParams->distanceToNext <= m_pParams->minDistanceToAvoid
			&& !pCParams->bFullyBlock
			&& (pCParams->iCurrSafeTrajectory != pCParams->iPrevSafeTrajectory || pCParams->iCurrSafeLane != pCParams->iPrevSafeLane)
			)
		return FindBehaviorState(OBSTACLE_AVOIDANCE_STATE);

	else if(m_pParams->enableTrafficLightBehavior
			&& pCParams->currentTrafficLightID > 0
			&& pCParams->bTrafficIsRed
			&& pCParams->currentTrafficLightID != pCParams->prevTrafficLightID)
		return FindBehaviorState(TRAFFIC_LIGHT_STOP_STATE);

	else if(m_pParams->enableStopSignBehavior
			&& pCParams->currentStopSignID > 0
			&& pCParams->currentStopSignID != pCParams->prevStopSignID)
			return FindBehaviorState(STOP_SIGN_STOP_STATE);

	else if(m_pParams->enableFollowing
			&& pCParams->bFullyBlock)
			return FindBehaviorState(FOLLOW_STATE);

//	else if(pCParams->distanceToNext <= m_pParams->maxDistanceToAvoid)
//		return FindBehaviorState(STOPPING_STATE);

	else
	{
		if(pCParams->iCurrSafeTrajectory == pCParams->iCentralTrajectory
				&& pCParams->iPrevSafeTrajectory != pCParams->iCurrSafeTrajectory)
			pCParams->bRePlan = true;

		return FindBehaviorState(this->m_Behavior); // return and reset
	}
}

BehaviorStateMachine* ForwardStateII::GetNextState()
{
	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->currentGoalID != pCParams->prevGoalID)//当前目标 不是 上个目标  
		return FindBehaviorState(GOAL_STATE);      //切换为 目标状态

	else if(m_pParams->enableTrafficLightBehavior                                              //使能红绿灯行为
				&& pCParams->currentTrafficLightID > 0                             //红绿灯ID >0
				&& pCParams->bTrafficIsRed                                         //红灯
				&& pCParams->currentTrafficLightID != pCParams->prevTrafficLightID)//灯ID 不是上个灯ID
			return FindBehaviorState(TRAFFIC_LIGHT_STOP_STATE);                        //切换到 红绿灯停车

	else if(m_pParams->enableStopSignBehavior                                    //使能停止信号行为
			&& pCParams->currentStopSignID > 0                           //停止信号ID >0
			&& pCParams->currentStopSignID != pCParams->prevStopSignID)  //停止信号ID不是上个信号ID
		return FindBehaviorState(STOP_SIGN_STOP_STATE);                      //切换到 停止信号停车

	else if(m_pParams->enableFollowing && pCParams->bFullyBlock) //使能跟随 并且 FullyBlock??
		return FindBehaviorState(FOLLOW_STATE);              //切换到 跟随状态

	else if(m_pParams->enableSwerving                                                     //使能急转弯行为
			&& pCParams->distanceToNext <= m_pParams->minDistanceToAvoid          //下个距离 小于 最小避障距离
			&& !pCParams->bFullyBlock                                             //
			&& pCParams->iCurrSafeTrajectory != pCParams->iPrevSafeTrajectory)    //安全轨迹 不是 前一个安全轨迹
		return FindBehaviorState(OBSTACLE_AVOIDANCE_STATE);                           //切换到 障碍回避状态

	else
		return FindBehaviorState(this->m_Behavior);          //继续当前状态
}




BehaviorStateMachine* MissionAccomplishedState::GetNextState()
{
	return FindBehaviorState(this->m_Behavior); // return and reset
}

BehaviorStateMachine* MissionAccomplishedStateII::GetNextState()
{
	return FindBehaviorState(this->m_Behavior);          //继续当前状态
}




BehaviorStateMachine* StopState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)//时间 小于 决策时间
		return this;                                           //继续当前状态   

	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->distanceToNext > m_pParams->maxDistanceToAvoid)          //下个距离 大于最大避障距离
		return FindBehaviorState(FORWARD_STATE);                      //切换到 前进状态

	else
		return FindBehaviorState(this->m_Behavior); // return and reset          //继续当前状态
}






BehaviorStateMachine* TrafficLightStopState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this;

	PreCalculatedConditions* pCParams = GetCalcParams();

	if(!pCParams->bTrafficIsRed)
	{
		pCParams->prevTrafficLightID = pCParams->currentTrafficLightID;
		return FindBehaviorState(FORWARD_STATE);
	}

	else if(pCParams->bTrafficIsRed && pCParams->currentVelocity <= m_zero_velocity)
			return FindBehaviorState(TRAFFIC_LIGHT_WAIT_STATE);
	else
		return FindBehaviorState(this->m_Behavior); // return and reset
}

BehaviorStateMachine* TrafficLightStopStateII::GetNextState()
{
	PreCalculatedConditions* pCParams = GetCalcParams();

	//std::cout << "Stopping for trafficLight "  << std::endl;
	if(!pCParams->bTrafficIsRed)                                                      //不是红灯  
	{
		//std::cout << "Color Changed Stopping for trafficLight "  << std::endl;
		pCParams->prevTrafficLightID = pCParams->currentTrafficLightID;
		return FindBehaviorState(FORWARD_STATE);                                  //切换到 前进状态
	}

	else if(pCParams->bTrafficIsRed && pCParams->currentVelocity <= m_zero_velocity)  //红灯 并且 速度 小于m_zero_velocity
	{
		//std::cout << "Velocity Changed Stopping for trafficLight ("  <<pCParams->currentVelocity << ", " << m_zero_velocity << ")" <<  std::endl;
		return FindBehaviorState(TRAFFIC_LIGHT_WAIT_STATE);                        //切换到 红绿灯待状态
	}

	else
	{
		return FindBehaviorState(this->m_Behavior); // return and reset      //继续当前状态
	}
}








BehaviorStateMachine* TrafficLightWaitState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this;

	PreCalculatedConditions* pCParams = GetCalcParams();

	if(!pCParams->bTrafficIsRed)                                             //不是红灯  
	{
		pCParams->prevTrafficLightID = pCParams->currentTrafficLightID;
		return FindBehaviorState(FORWARD_STATE);                         //切换到 前进状态
	}

	else if(pCParams->currentVelocity > m_zero_velocity)        //红灯   速度 大于m_zero_velocity
		return FindBehaviorState(TRAFFIC_LIGHT_STOP_STATE); //切换到 红绿灯停止状态

	else
		return FindBehaviorState(this->m_Behavior); // return and reset

}


BehaviorStateMachine* TrafficLightWaitStateII::GetNextState()
{
	PreCalculatedConditions* pCParams = GetCalcParams();

	//std::cout << "Wait for trafficLight "  << std::endl;

	if(!pCParams->bTrafficIsRed)                                            //不是红灯 
	{
		pCParams->prevTrafficLightID = pCParams->currentTrafficLightID;
		return FindBehaviorState(FORWARD_STATE);                        //切换到 前进状态
	}

//	else if(pCParams->currentVelocity > m_zero_velocity)
//		return FindBehaviorState(TRAFFIC_LIGHT_STOP_STATE);

	else
		return FindBehaviorState(this->m_Behavior); // return and reset

}



BehaviorStateMachine* StopSignStopState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this;

	PreCalculatedConditions* pCParams = GetCalcParams();

	//std::cout << "From Stop Beh D: " << pCParams->distanceToStop() << ", Prev LineID: " << pCParams->prevStopSignID << ", Curr SignID: " << pCParams->currentStopSignID << std::endl;

	if(pCParams->currentVelocity < m_zero_velocity)
		return FindBehaviorState(STOP_SIGN_WAIT_STATE);

	else
		return FindBehaviorState(this->m_Behavior); // return and reset
}


BehaviorStateMachine* StopSignStopStateII::GetNextState()
{
	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->currentGoalID != pCParams->prevGoalID)      //当前目标ID不是上个目标ID
		return FindBehaviorState(GOAL_STATE);            //切换 目标状态

	else if(pCParams->currentVelocity < m_zero_velocity)     //目标没变 速度 小于m_zero_velocity
		return FindBehaviorState(STOP_SIGN_WAIT_STATE);  //切换 停止信号等待状态

	else
		return FindBehaviorState(this->m_Behavior); // return and reset
}








BehaviorStateMachine* StopSignWaitState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this;

	PreCalculatedConditions* pCParams = GetCalcParams();

	//std::cout << "From Wait Beh D: " << pCParams->distanceToStop() << ", Prev LineID: " << pCParams->prevStopSignID << ", Curr SignID: " << pCParams->currentStopSignID << std::endl;

	pCParams->prevStopSignID = pCParams->currentStopSignID;

	return FindBehaviorState(FORWARD_STATE);
}


BehaviorStateMachine* StopSignWaitStateII::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this;

	PreCalculatedConditions* pCParams = GetCalcParams();

	pCParams->prevStopSignID = pCParams->currentStopSignID;

	return FindBehaviorState(FORWARD_STATE);               //切换 前进状态
}







BehaviorStateMachine* WaitState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this;

	//PreCalculatedConditions* pCParams = GetCalcParams();

	return FindBehaviorState(FORWARD_STATE);               //切换 前进状态
}





BehaviorStateMachine* InitState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this;

	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->bOutsideControl == 1)
	{
		pCParams->prevGoalID = pCParams->currentGoalID;
		return FindBehaviorState(FORWARD_STATE);     
	}

	else
		return FindBehaviorState(this->m_Behavior); // return and reset
}

BehaviorStateMachine* InitStateII::GetNextState()
{
	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->currentGoalID > 0)
		return FindBehaviorState(FORWARD_STATE);            //切换 前进状态
	else
		return FindBehaviorState(this->m_Behavior);
}




BehaviorStateMachine* FollowState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
			return this;

	PreCalculatedConditions* pCParams = GetCalcParams();

	//std::cout << "Following State >> followDistance: " << pCParams->distanceToNext << ", followSpeed: " << pCParams->velocityOfNext << std::endl;

	if(m_pParams->enableTrafficLightBehavior
				&& pCParams->currentTrafficLightID > 0
				&& pCParams->bTrafficIsRed
				&& pCParams->currentTrafficLightID != pCParams->prevTrafficLightID)
			return FindBehaviorState(TRAFFIC_LIGHT_STOP_STATE);

	else if(m_pParams->enableStopSignBehavior
			&& pCParams->currentStopSignID > 0
			&& pCParams->currentStopSignID != pCParams->prevStopSignID)
			return FindBehaviorState(STOP_SIGN_STOP_STATE);

	else if(pCParams->currentGoalID != pCParams->prevGoalID
			|| !pCParams->bFullyBlock)
		return FindBehaviorState(FORWARD_STATE);

	else
		return FindBehaviorState(this->m_Behavior); // return and reset
}

BehaviorStateMachine* FollowStateII::GetNextState()
{
	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->currentGoalID != pCParams->prevGoalID)      //当前目标ID不是上个目标ID
		return FindBehaviorState(GOAL_STATE);            //切换 目标状态

	else if(m_pParams->enableTrafficLightBehavior                                              //使能红绿灯行为
				&& pCParams->currentTrafficLightID > 0                             //红绿灯ID >0
				&& pCParams->bTrafficIsRed                                         //红灯
				&& pCParams->currentTrafficLightID != pCParams->prevTrafficLightID)//灯ID 不是上个灯ID
			return FindBehaviorState(TRAFFIC_LIGHT_STOP_STATE);                        //切换到 红绿灯停车

	else if(m_pParams->enableStopSignBehavior                                    //使能停止信号行为
			&& pCParams->currentStopSignID > 0                           //停止信号ID >0
			&& pCParams->currentStopSignID != pCParams->prevStopSignID)  //停止信号ID不是上个信号ID
		return FindBehaviorState(STOP_SIGN_STOP_STATE);                      //切换到 停止信号停车

	else if(m_pParams->enableSwerving                                                     //使能急转弯行为
			&& pCParams->distanceToNext <= m_pParams->minDistanceToAvoid          //下个距离 小于 最小避障距离
			&& !pCParams->bFullyBlock                                             //
			&& pCParams->iCurrSafeTrajectory != pCParams->iPrevSafeTrajectory)    //安全轨迹 不是 前一个安全轨迹
		return FindBehaviorState(OBSTACLE_AVOIDANCE_STATE);                           //切换到 障碍回避状态

	else if(!pCParams->bFullyBlock)                   //使能跟随 并且 FullyBlock??
		return FindBehaviorState(FORWARD_STATE);  //切换到 前进状态

	else
		return FindBehaviorState(this->m_Behavior); // return and reset
}






BehaviorStateMachine* SwerveState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this;

	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->distanceToNext > 0                                                           //下一个距离 大于0
				&& pCParams->distanceToNext < m_pParams->minDistanceToAvoid       //下个距离 小于 最小避障距离
				&& !pCParams->bFullyBlock                                         //
				&& pCParams->iCurrSafeTrajectory != pCParams->iPrevSafeTrajectory)//安全轨迹 不是 前一个安全轨迹
		return FindBehaviorState(this->m_Behavior);                                       //

	else
		return FindBehaviorState(FORWARD_STATE);               //切换到 前进状态
}
BehaviorStateMachine* SwerveStateII::GetNextState()
{
	PreCalculatedConditions* pCParams = GetCalcParams();

	pCParams->iPrevSafeTrajectory = pCParams->iCurrSafeTrajectory;
	pCParams->bRePlan = true;

	return FindBehaviorState(FORWARD_STATE);               //切换到 前进状态
}





BehaviorStateMachine* GoalState::GetNextState()
{
	if(UtilityH::GetTimeDiffNow(m_StateTimer) < decisionMakingTime)
		return this;

	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->currentGoalID == -1)
		return FindBehaviorState(FINISH_STATE);

	else if(pCParams->currentGoalID != pCParams->prevGoalID)
	{
		pCParams->prevGoalID = pCParams->currentGoalID;
		return FindBehaviorState(FORWARD_STATE);
	}

	else
		return FindBehaviorState(this->m_Behavior); // return and reset
}


BehaviorStateMachine* GoalStateII::GetNextState()
{
	PreCalculatedConditions* pCParams = GetCalcParams();

	if(pCParams->currentGoalID == -1)               //无目标 
		return FindBehaviorState(FINISH_STATE); //切换到 完成状态

	else
	{
		pCParams->prevGoalID = pCParams->currentGoalID;//有目标 
		return FindBehaviorState(FORWARD_STATE);       //切换到 前进状态
	}
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/864333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言学习系列-->看淡指针(1)

文章目录 一、概述二、指针变量和地址2.1 取地址操作符2.2 指针变量和解引用操作符2.2.1 指针变量2.2.2 拆解指针类型2.2.4 解引用操作符 2.3 指针变量的大小 三、指针变量的意义3.1 指针的解引用指针-整数 四、 const修饰指针五、指针运算5.1 指针- 整数5.2 指针-指针5.3 指针…

OpenText 企业安全 调查 产品简介

关于OpenText OpenText是一家信息软件公司&#xff0c;使企业能够通过市场领先的信息管理解决方案&#xff08;内部或云中&#xff09;获得洞察力。 全球面临的数字风险 市场合力驱动的信息管理 处于风暴中心的信息 →安全漏洞和数据保护 • 防止威胁并将破坏影响降至最低 …

通过PostMan监视提交文件,验证web文件传输

切换文件流,传输文件 找到图片地址 发送请求然后接受 再来一张 哈&#xff0c;谢谢各位同志的阅读&#xff0c;然后呢如果觉得本文对您有所帮助的话&#xff0c;还给个免费的赞捏 Thanks♪(&#xff65;ω&#xff65;)&#xff89;

【二】数据库系统

数据库系统的分层抽象DBMS 数据的三个层次从 数据 到 数据的结构----模式数据库系统的三级模式&#xff08;三级视图&#xff09;数据库系统的两层映像数据库系统的两个独立性数据库系统的标准结构 数据模型从 模式 到 模式的结构----数据模型三大经典数据模型 数据库的演变与发…

给大家推荐9个Linux高效运维命令技巧!

文章目录 前言一、实用的 xargs 命令二、命令或脚本后台运行三、找出当前系统内存使用量较高的进程四、找出当前系统CPU使用量较高的进程五、同时查看多个日志或数据文件六、持续ping并将结果记录到日志七、查看tcp连接状态八、查找80端口请求数最高的前20个IP九、ssh实现端口转…

构建高性能的MongoDB数据迁移工具:Java的开发实践

随着大数据时代的到来&#xff0c;数据迁移成为许多企业和组织必须面对的挑战之一。作为一种非关系型数据库&#xff0c;MongoDB在应用开发中得到了广泛的应用。为了满足数据迁移的需求&#xff0c;我们需要一个高性能、稳定可靠的MongoDB数据迁移工具。下面将分享使用Java开发…

【华秋推荐】新能源汽车中的T-BOX系统,你了解多少?

近几年&#xff0c;新能源汽车产业进入了加速发展的阶段。我国的新能源汽车产业&#xff0c;经过多年的持续努力&#xff0c;技术水平显著提升、产业体系日趋完善、企业竞争力大幅增强&#xff0c;呈现市场规模、发展质量“双提升”的良好局面。同时&#xff0c;通过国家多年来…

【碎碎念】在CSDN 512天创作纪念日

‍‍&#x1f3e1;博客主页&#xff1a; virobotics的CSDN博客&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『碎碎念』 &#x1f37b;上篇纪念文&#xff1a; 我的创作纪念日 文章目录 &#x1f4e9;&#x1f4e9;&#x1f4e9;前言&#x1f…

thinkphp中分页paginate和group by一起使用时 代码异常的解决办法

1. paginate和group by报错&#xff0c;代码如下&#xff0c;月份分组 $page intval($where[page]);$limit intval($where[limit]);$start_time $where[start_time];$end_time $where[end_time];$query Db::table(eb_bonuslistlog)->field(DATE_FORMAT(create_time,&qu…

Cookie的详解

Cookie Cookie为什么要用Cookie&#xff1f;Cookie是什么&#xff1f;Cookie怎么用&#xff1f;Cookie常用属性修改与删除&#xff1a;在浏览器查看cookie前端页面读取CookieJava后端读写cookie最典型的cookie--JESSIONID是什么&#xff1f;什么时候种下JSESSIONID&#xff1f;…

2023年京东按摩仪行业数据分析(京东销售数据分析)

近年来&#xff0c;小家电行业凭借功能与颜值&#xff0c;取代黑电和白电&#xff0c;成为家电市场的主要增长点。在这一市场背景下&#xff0c;颜值更高、功能更丰富、品种更齐全的各类按摩仪&#xff0c;借助新消费和电子商务的风潮&#xff0c;陆续被推上市场。今年&#xf…

通达信波段选股公式,使用钱德动量摆动指标(CMO)

钱德动量摆动指标(CMO)是由图莎尔钱德发明的&#xff0c;取值范围在-100到100之间&#xff0c;是捕捉价格动量的技术指标。该指标计算近期涨幅之和与近期跌幅之和的差值&#xff0c;然后将计算结果除以同期所有价格波动的总和。本文的波段选股公式使用均线识别趋势&#xff0c;…

微信小程序上传图片和文件

1.从微信里选择图片或文件上传 使用的vant的上传组件 原生用 wx.chooseMessageFile() html <!-- 从微信上面选择文件 --><van-uploader file-list"{{ file }}" bind:after-read"afterRead" max-count"{{3}}" deletable"{{ true…

GrapeCity Documents for PDF (GcPdf) 6.2 Crack

GrapeCity PDF 文档 (GcPdf) 改进了对由 GcPdf 以外的软件生成的现有 PDF 文档的处理 在新的 v6.2 版本中&#xff0c;GcPdf 增强了 PDF 文档的加载和保存&#xff0c;并提供以下优势&#xff1a; GcPdf 现在可以加载和保存可能不严格符合 PDF 规范的 PDF 文档。GcPdf 现在将…

典籍研读+书法精进 暄桐「见道明心的笔墨」课程开课啦

8月12日&#xff0c;《林曦老师的线上直播书法课》之「见道明心的笔墨」就要开课啦。林曦老师将带我们去往中国文人精神世界的后花园&#xff0c;一起阅读《金刚经》《老子》等典籍。是不是很期待&#xff1f; 在2011年&#xff0c;暄桐成立的最初&#xff0c;课程便是面向零基…

Opencv项目实战:24 手势识别的石头剪刀布

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码展示与部分讲解 pyzjr库 游戏实现思路 4、项目资源 5、项目总结 0、项目介绍 简单的自娱自乐的计算机视觉互动游戏&#xff0c;石头剪刀布&#xff0c;使用random生成随机数&#xff0c;用于模拟AI窗口随机出拳&…

SecureCRT密码破解(实验环境:win10,SecureCRT Version 9.1.0 (x64 build 2579))

实验环境&#xff1a;win10&#xff0c; SecureCRT&#xff1a;Version 9.1.0 (x64 build 2579) 1. SecureCRTCipher.py 文件 #!/usr/bin/env python3 import os from Crypto.Hash import SHA256 from Crypto.Cipher import AES, Blowfishclass SecureCRTCrypto:def __init_…

如何选择适合自己的文件传输工具

随着互联网的发展&#xff0c;人们处理文件的需求也随之增加。不管是工作还是生活中&#xff0c;文件传输都是一个非常常见的问题。因此&#xff0c;如何选择适合自己的文件传输工具也越来越重要。在本文中&#xff0c;我将从以下几个方面进行分析和总结&#xff0c;希望能为大…

springboot文件上传和下载接口的简单思路

springboot文件上传和下载的简单思路 文件上传文件下载 文件上传 在springboot中&#xff0c;上传文件只需要在接口中通过 MultipartFile 对象来获取前端传递的数据&#xff0c;然后将数据存储&#xff0c;并且返回一个对外访问路径即可。一般对于上传文件的文件名&#xff0c…

【立创EDA】【0】基本概念

原理图库设计 符号设计 当在元件库中没有找到需要的元件原理图符号时&#xff0c;需要自己手动绘制点击文件-新建-符号进行新建符号 封装库设计 原理图符号对应焊盘 绘制封装时&#xff0c;可以在立创商城寻找元器件对应的数据手册进行参考 PCB绘制 晶振需要包地&#xf…