예제 #1
0
void ToasterHumanReader::humanJointStateCallBack(const toaster_msgs::HumanList::ConstPtr& msg) {
    //std::cout << "[area_manager][DEBUG] new data for human received with time " << msg->humanList[0].meAgent.meEntity.time  << std::endl;
    Human * curHuman;
    for (unsigned int i = 0; i < msg->humanList.size(); i++) {

        // If this human is not assigned we have to allocate data.
        if (lastConfig_.find(msg->humanList[i].meAgent.meEntity.id) == lastConfig_.end()) {
            curHuman = new Human(msg->humanList[i].meAgent.meEntity.id);
        } else
            curHuman = lastConfig_[msg->humanList[i].meAgent.meEntity.id];

        std::vector<double> humanOrientation;
        bg::model::point<double, 3, bg::cs::cartesian> humanPosition;

        Mobility curHumanMobility = FULL;
        curHuman->setId(msg->humanList[i].meAgent.meEntity.id);
        curHuman->setName(msg->humanList[i].meAgent.meEntity.name);

        curHuman->setMobility(curHumanMobility);
        curHuman->setTime(msg->humanList[i].meAgent.meEntity.time);
        curHuman->busyHands_ = msg->humanList[i].meAgent.busyHands;

        humanPosition.set<0>(msg->humanList[i].meAgent.meEntity.positionX);
        humanPosition.set<1>(msg->humanList[i].meAgent.meEntity.positionY);
        humanPosition.set<2>(msg->humanList[i].meAgent.meEntity.positionZ);
        curHuman->setPosition(humanPosition);

        humanOrientation.push_back(msg->humanList[i].meAgent.meEntity.orientationRoll);
        humanOrientation.push_back(msg->humanList[i].meAgent.meEntity.orientationPitch);
        humanOrientation.push_back(msg->humanList[i].meAgent.meEntity.orientationYaw);
        curHuman->setOrientation(humanOrientation);

        lastConfig_[curHuman->getId()] = curHuman;

        //TODO: fullHuman
        if (fullHuman_) {
            Joint * curJnt;
            for (unsigned int i_jnt = 0; i_jnt < msg->humanList[i].meAgent.skeletonNames.size(); i_jnt++) {

                // If this joint is not assigned we have to allocate data.
                if (lastConfig_[curHuman->getId()]->skeleton_[msg->humanList[i].meAgent.skeletonNames[i_jnt] ] == NULL) {
                    curJnt = new Joint(msg->humanList[i].meAgent.skeletonJoint[i_jnt].meEntity.id, msg->humanList[i].meAgent.meEntity.id);
                } else
                    curJnt = lastConfig_[curHuman->getId()]->skeleton_[msg->humanList[i].meAgent.skeletonNames[i_jnt] ];

                std::vector<double> jointOrientation;
                bg::model::point<double, 3, bg::cs::cartesian> jointPosition;

                curJnt->setName(msg->humanList[i].meAgent.skeletonNames[i_jnt]);
                curJnt->setAgentId(curHuman->getId());
                curJnt->setTime(msg->humanList[i].meAgent.skeletonJoint[i_jnt].meEntity.time);

                jointPosition.set<0>(msg->humanList[i].meAgent.skeletonJoint[i_jnt].meEntity.positionX);
                jointPosition.set<1>(msg->humanList[i].meAgent.skeletonJoint[i_jnt].meEntity.positionY);
                jointPosition.set<2>(msg->humanList[i].meAgent.skeletonJoint[i_jnt].meEntity.positionZ);
                curJnt->setPosition(jointPosition);

                jointOrientation.push_back(msg->humanList[i].meAgent.skeletonJoint[i_jnt].meEntity.orientationRoll);
                jointOrientation.push_back(msg->humanList[i].meAgent.skeletonJoint[i_jnt].meEntity.orientationPitch);
                jointOrientation.push_back(msg->humanList[i].meAgent.skeletonJoint[i_jnt].meEntity.orientationYaw);
                curJnt->setOrientation(jointOrientation);

                lastConfig_[curHuman->getId()]->skeleton_[curJnt->getName()] = curJnt;
            }
        }
    }
}
예제 #2
0
파일: WorldModel.cpp 프로젝트: RGB-RSL/rgb
void WorldModel::updatePositions()
{
    for (int i = 0; i < (int) ambulanceTeams.size(); i++)
    {
        Human *human = ambulanceTeams[i];
        if (human->getMotionlessObject() == NULL || human->getMotionlessObject()->getId() != human->getPosition())
        {
            human->setMotionlessObject((MotionlessObject*) objects[human->getPosition()]);
            LOG(Main, 1) << "update position of " << human->getId() << " : " << human->getMotionlessObject()->getId() << endl;
        }
    }
    for (int i = 0; i < (int) humans.size(); i++)
    {
        Human *human = humans[i];
        if (!human->isAmbulanceTeam())
        {
            bool flag = false;
            for (int j = 0; j < (int) ambulanceTeams.size(); j++)
                if (ambulanceTeams[j]->getId() == human->getPosition())
                {
                    human->setMotionlessObject((MotionlessObject*) objects[ambulanceTeams[j]->getPosition()]);
                    LOG(Main, 1) << "update position of (loaded in ambulance) " << human->getId() << " : " << human->getMotionlessObject()->getId() << endl;
                    flag = true;
                    break;
                }
            if (human->getMotionlessObject() == NULL || (human->getMotionlessObject()->getId() != human->getPosition() && !flag))
            {
                human->setMotionlessObject((MotionlessObject*) objects[human->getPosition()]);
                LOG(Main, 1) << "update position of " << human->getId() << " : " << human->getMotionlessObject()->getId() << endl;
            }
        }
        if (human->getLastCycleUpdatedBySense() != world->getTime())
        {
            human->setX(human->getMotionlessObject()->getX());
            human->setY(human->getMotionlessObject()->getY());
        }
    }
    if (self->isPlatoon())
    {
        for (int i = 0; i < civilians.size(); i++)
        {
            if (((Platoon*) self)->getMotionlessObject()->motionlessIndex == civilians[i]->getMotionlessObject()->motionlessIndex && getTime() - civilians[i]->getLastCycleUpdated() > 1)
                civilians[i]->isAvailable = false;
        }
    }
    //set civilians to buildingBlocks
    if (self->isPoliceForce())
    {
        for (int i = 0; i < buildingBlocks.size(); i++)
            buildingBlocks[i]->civilians.clear();
        for (int i = 0; i < civilians.size(); i++)
        {
            if (civilians[i]->getMotionlessObject()->isBuilding())
            {
                LOG(Main, 4) << "civ: " << civilians[i]->getId() << endl;
                LOG(Main, 4) << "((Building*)civilians[i]->getMotionlessObject())->blockNum = " << ((Building*) civilians[i]->getMotionlessObject())->blockNum << endl;
                buildingBlocks[((Building*) civilians[i]->getMotionlessObject())->blockNum]->civilians.push_back(civilians[i]);
            }
        }
    }
    if (self->isPlatoon())
        ((Platoon*) self)->getMotionlessObject()->iHaveBeenHere = true;
}
예제 #3
0
bool AmbulanceTeamAgent::simpleDecision()
{
    LOG(Main, 1) << "Simple Decision begins" << endl;
    //    for (int i = 0; i < neededHelpHumans.size(); i++)
    //        setValue(neededHelpHumans[i]);
    sort(neededHelpHumans.begin(), neededHelpHumans.end(), humanComparator);
    Human* myTarget;
    set<int> busyAgents;
    for (int i = 0; i < neededHelpHumans.size(); i++)
    {
        int neededAmbulances = getNumOfNeededAmbulances(neededHelpHumans[i]);
        LOG(Main, 1) << "neededAmbulances for " << neededHelpHumans[i]->getId() << " is " << neededAmbulances << endl;
        for (int j = 0; j < neededAmbulances; j++)
        {
            int minDist = MAX_INT;
            AmbulanceTeam* at = NULL;
            for (int k = 0; k < world->ambulanceTeams.size(); k++)
            {
                if (busyAgents.find(world->ambulanceTeams[k]->ambulanceTeamIndex) == busyAgents.end() && worldGraph->isReachable(world->ambulanceTeams[k]->getRepresentiveNodeIndex(), neededHelpHumans[i]->getRepresentiveNodeIndex(), GM_DEFAULT_NOT_BLOCKED))
                {
                    int dist = worldGraph->getDistance(world->ambulanceTeams[k]->getRepresentiveNodeIndex(), neededHelpHumans[i]->getRepresentiveNodeIndex(), GM_DEFAULT_NOT_BLOCKED);
                    //                    LOG(Main, 1) << "dist  " << world->ambulanceTeams[k]->getId() << " from civ is " << dist << endl;
                    if (dist < minDist)
                    {
                        //                        LOG(Main, 1) << "in if" << endl;
                        minDist = dist;
                        at = world->ambulanceTeams[k];
                        //                        LOG(Main, 1) << "at->getId " << at->getId() << endl;
                    }
                }
            }
            if (at != NULL)
            {
                if (at->ambulanceTeamIndex == self()->ambulanceTeamIndex)
                {
                    myTarget = neededHelpHumans[i];
                    break;
                }
                else
                {
                    LOG(Main, 1) << "ambulance " << at->getId() << " goes to " << neededHelpHumans[i]->getId() << endl;
                    busyAgents.insert(at->ambulanceTeamIndex);
                }
            }
        }
        if (myTarget != NULL)
            break;
    }

    if (myTarget != NULL)
    {
        LOG(Main, 1) << "my Target: " << myTarget->getId() << " its postion is " << myTarget->getMotionlessObject()->getId() << endl;
        if (self()->getMotionlessObject() != myTarget->getMotionlessObject())
        {
            LOG(Main, 1) << "move to myTarget " << myTarget->getId() << endl;
            command->moveToMotionless(myTarget->getMotionlessObject()->motionlessIndex, GM_DEFAULT_NOT_BLOCKED);
            return true;
        }
        else if (myTarget->getBuriedness() > 0)
        {
            LOG(Main, 1) << "I am rescuing my target " << endl;
            command->rescue(*myTarget);
            return true;
        }
        else
        {
            if (myTarget->isCivilian())
            {
                int minId = self()->getId();
                for (int i = 0; i < world->ambulanceTeams.size(); i++)
                    if (world->ambulanceTeams[i]->getMotionlessObject() == myTarget->getMotionlessObject() && world->ambulanceTeams[i]->getId() < minId)
                        minId = world->ambulanceTeams[i]->getId();
                if (minId == self()->getId())
                {
                    LOG(Main, 1) << "I am loading my target" << endl;
                    command->load(*myTarget);
                    return true;
                }
                else
                {
                    myTarget->isAvailable = false;
                }
            }
        }
    }
    return false;
}