TEST(TfListenerSingleton, testLookupTransformWithDuration){
  boost::mutex mutex;
  tf::TransformListener* tf_listener;

  mutex.lock();
  tf_listener = new tf::TransformListener(ros::Duration(30.0));
  mutex.unlock();

  std::string from_frame("base");
  std::string to_frame("head");
  tf::StampedTransform transform;
  transform = jsk_recognition_utils::lookupTransformWithDuration(
    /*listener=*/tf_listener,
    /*to_frame=*/to_frame,
    /*from_frame=*/from_frame,
    /*time=*/ros::Time(),
    /*duration=*/ros::Duration(1.0));
  ASSERT_STREQ("base", transform.frame_id_.c_str());
  ASSERT_STREQ("head", transform.child_frame_id_.c_str());
  ASSERT_EQ(0, transform.getOrigin().getX());
  ASSERT_EQ(0, transform.getOrigin().getY());
  ASSERT_EQ(1, transform.getOrigin().getZ());
  ASSERT_EQ(0, transform.getRotation().getX());
  ASSERT_EQ(0, transform.getRotation().getY());
  ASSERT_EQ(0, transform.getRotation().getZ());
  ASSERT_EQ(1, transform.getRotation().getW());
}
Beispiel #2
0
void
debug_save_image( const image_buf &i, const std::string &fn, int64_t sampNum, const std::vector<std::string> &chans, const std::string &type, const media::metadata &options )
{
	std::vector<media::track_description> tds;

	tds.push_back( media::TRACK_VIDEO );
	tds.back().rate( media::sample_rate( 1, 1 ) );
	tds.back().offset( sampNum );
	tds.back().duration( 1 );
	for ( auto &o: options )
		tds.back().set_option( o.first, o.second );

	base::uri fnU( fn );
	if ( ! fnU )
		fnU.set_scheme( "file" );
	
	media::container oc = media::writer::open( fnU, tds, options );
	oc.video_tracks()[0]->store( sampNum, to_frame( i, chans, type ) );
	std::cout << "Saved debug image to '" << fn << "', frame " << sampNum << std::endl;
}
Beispiel #3
0
void Game::mouse_released(sf::Vector2f coord) {
    if (mouse_down) {
        mouse_down = false;
        int group, column, row;
        int status = locate_card(coord, group, column, row);
        if (valid_placement(status, group, column, row)) { //move cards to new location if valid
            anim_move_card();
            for (int i = 0; i < cursor.size(); i++) {
                Position p = cursor[i].get_position_data();
                p.loc.second = sf::Vector3i(group, column, row + i + 1);
                p.coord.second = field_rect[group][column].getPosition();
                if (group != HOME) {
                    p.coord.second.y += VERT_CARD_SPACING * (row + i + 1);
                }
                cursor[i].init_animation(STATE_ANIMATION_MOVING_CARD, p, to_frame(0.1f));
                transit.push_back(cursor[i]);
            }
            cursor.clear();
        } else {
            anim_return_card();
        }
    }
}
Beispiel #4
0
void Game::mouse_pressed(sf::Vector2f coord) {
    if (master_state == STATE_ANIMATION) {
        skip = true;
        while (master_state != STATE_PLAYING) {
            update();
        }
        skip = false;
        if (detailed_state != STATE_ANIMATION_FLIP_CARD && detailed_state != STATE_ANIMATION_MOVING_CARD) {
            return;
        }
    }
    int group, column, row;
    int status = locate_card(coord, group, column, row);
    if (status >= HOME && status <= PLAY_FIELD || status == DECK && column == 1) { //clicked some valid location on field
        //check if clicking on flipped deck
        if (status == DECK && row != field[DECK][1].size() - 1) {
            return;
        }
        //click on a face up card
        if (field[group][column][row].get_flip_state() == CARD_FACE_UP) { //add card(s) to cursor
            mouse_down = true;
            for (int i = row; i < field[group][column].size(); i++) {
                Card c = field[group][column][i];
                Position p = c.get_position_data();
                p.coord.first = field[group][column][i].get_center();
                p.loc.first = sf::Vector3i(group, column, i);
                c.set_position_data(p);
                cursor.push_back(c);
                field[group][column].erase(field[group][column].begin() + i--);
                mouse_moved(coord);
            }
            //check if ace is moved out of home area
            if (cursor.size() == 1 && cursor.front().get_value() == 1) {
                for (int i = 0; i < ace_locations.size(); i++) {
                    if (ace_locations[i] == cursor.front().get_suit()) {
                        ace_locations[i] = -1;
                        break;
                    }
                }
            }
        } else { //card is face down, see if its at the front of the pile
            if (field[group][column].size() - 1 == row) {
                anim_flip_card();
                field[group][column][row].init_animation(STATE_ANIMATION_FLIP_CARD, to_frame(0.3f));
                transit.push_back(field[group][column][row]);
                field[group][column].pop_back();
            }
        }
    } else if (status == DECK || status == EMPTY_SPOT && group == DECK) { //if deck group was clicked
        if (field[DECK][0].empty()) { //deck is empty, return deck contents
            if (!field[DECK][1].empty()) {
                anim_flip_deck();
                for (int i = 0; i < field[DECK][1].size(); i++) {
                    field[DECK][1][i].set_flip_state(CARD_FACE_DOWN);
                }
            }
        } else if (status == DECK) { //move and flip card
            anim_move_card();
            //recorrect the position of all previous cards
            int flipped_counter = 1;
            if (three_card_rule) {
                flipped_counter = field[DECK][0].size() >= 3 ? field[DECK][1].size() - 3 : 0;
            }
            for (int i = flipped_counter; i < field[DECK][1].size(); i++) {
                Card c = field[DECK][1][i];
                if (c.get_center() == field_rect[DECK][1].getPosition()) continue;
                Position p = c.get_position_data();
                p.coord.second = field_rect[DECK][1].getPosition();
                c.init_animation(STATE_ANIMATION_MOVING_CARD, p, to_frame(0.25f));
                transit.push_back(c);
                field[DECK][1].erase(field[DECK][1].begin() + i--);
            }
            //launch animation for moving card
            flipped_counter = 1;
            if (three_card_rule) {
                flipped_counter = field[DECK][0].size() >= 3 ? 3 : field[DECK][0].size();
            }
            for (int i = 0; i < flipped_counter; i++) {
                Card c = field[DECK][0].back();
                c.set_flip_state(CARD_FACE_UP);
                Position p = c.get_position_data();
                p.coord.second = field_rect[DECK][1].getPosition();
                p.coord.second.x += HORZ_CARD_SPACING * i;
                p.loc.second = sf::Vector3i(DECK, 1, field[DECK][1].size());
                c.init_animation(STATE_ANIMATION_MOVING_CARD, p, to_frame(0.25f));
                transit.push_back(c);
                field[DECK][0].pop_back();
            }
        }
    }
}
Beispiel #5
0
void Game::update() {
    if (master_state == STATE_ANIMATION) {
        frame_counter++;
        if (skip || frame_counter >= to_frame(frame_delay)) {
            frame_counter = 0;
            if (detailed_state == STATE_ANIMATION_INITIALIZING_DECK) {
                if (card_counter <= 27) {
                    //destination of card
                    int col = col_tracker.x;
                    sf::Vector2f destination = field_rect[PLAY_FIELD][col].getPosition();
                    destination.y += VERT_CARD_SPACING * col_tracker.y;
                    int animation_type = STATE_ANIMATION_MOVING_CARD;
                    if (col == col_tracker.y) {
                        animation_type = STATE_ANIMATION_MOVE_AND_FLIP_CARD;
                    }
                    Position p(destination, sf::Vector3i(DECK, 0, field[DECK][0].size()), sf::Vector3i(PLAY_FIELD, col, col_tracker.y));
                    field[DECK][0].back().init_animation(animation_type, p, to_frame(0.3f));
                    transit.push_back(field[DECK][0].back());
                    field[DECK][0].pop_back();
                    card_counter++;
                    col_tracker.y++;
                    if (col_tracker.y > col_tracker.x) {
                        col_tracker.x++;
                        col_tracker.y = 0;
                    }
                }
            } else if (detailed_state == STATE_ANIMATION_RETURN_CARD) {
                if (!cursor.empty()) {
                    Card c = cursor.front();
                    Position p = c.get_position_data();
                    p.coord.second = p.coord.first;
                    p.loc.second = p.loc.first;
                    c.init_animation(STATE_ANIMATION_MOVING_CARD, p, to_frame(0.2f));
                    transit.push_back(c);
                    cursor.erase(cursor.begin());
                }
            } else if (detailed_state == STATE_ANIMATION_FLIP_DECK) {
                if (!field[DECK][1].empty()) {
                    Card c = field[DECK][1].back();
                    Position p = c.get_position_data();
                    p.coord.second = field_rect[DECK][0].getPosition();
                    p.loc.second = sf::Vector3i(DECK, 0, field[DECK][0].size());
                    c.init_animation(STATE_ANIMATION_MOVING_CARD, p, to_frame(0.3f));
                    transit.push_back(c);
                    field[DECK][1].pop_back();
                }
            } else if (detailed_state == STATE_ANIMATION_SOLVE_DECK) {
                //locate card with lowest value on left most position
                Position p(sf::Vector3i(-1, -1, -1));
                int min_card_val = -1;
                for (int i = 0; i < field[PLAY_FIELD].size(); i++) {
                    if (field[PLAY_FIELD][i].empty()) continue;
                    if (min_card_val == -1 || field[PLAY_FIELD][i].back().get_value() < min_card_val) {
                        p.loc.first = sf::Vector3i(PLAY_FIELD, i, field[PLAY_FIELD][i].size() - 1);
                        p.coord.first = field[PLAY_FIELD][i].back().get_center();
                        min_card_val = field[PLAY_FIELD][i].back().get_value();
                    }
                }
                //possibility that there are no cards on field
                //check if we found a card
                if (p.loc.first.x != -1) {
                    //card to move
                    Card c = field[PLAY_FIELD][p.loc.first.y].back();
                    //locate home location to move it
                    int col;
                    for (col = 0; col < field[HOME].size(); col++) {
                        //check if the column is empty
                        if (field[HOME][col].empty() && ace_locations[col] == -1) {
                            if (c.get_value() == 1) { //if we have an ace, place it
                                ace_locations[col] = c.get_suit();
                                break;
                            }
                        } else if (ace_locations[col] == c.get_suit()) {
                            //found pile of same suit
                            break;
                        }
                    }
                    //launch moving animation
                    p.loc.second = sf::Vector3i(HOME, col, field[HOME][col].size() - 1);
                    p.coord.second = field_rect[HOME][col].getPosition();
                    c.init_animation(STATE_ANIMATION_MOVING_CARD, p, to_frame(0.5f));
                    transit.push_back(c);
                    field[PLAY_FIELD][p.loc.first.y].pop_back();
                }
            }
        }
        //update aimations
        for (int i = 0; i < transit.size(); i++) {
            //check if we should skip the animation or not
            if (skip) {
                transit[i].finish();
            } else {
                transit[i].next();
            }
            //removed animations that are finished, add it to its new location
            if (transit[i].animation_finish()) {
                Position p = transit[i].get_position_data();
                sf::Vector3i loc = p.loc.second;
                field[loc.x][loc.y].push_back(transit[i]);
                transit.erase(transit.begin() + i--);
                //check if the animation sequence is over
                if (transit.empty()) {
                    if (detailed_state == STATE_ANIMATION_INITIALIZING_DECK) {
                        if (card_counter > 27) {
                            master_state = STATE_PLAYING;
                        }
                    } else if (detailed_state == STATE_ANIMATION_FLIP_DECK) {
                        if (field[DECK][1].empty()) {
                            master_state = STATE_PLAYING;
                        }
                    } else if (detailed_state == STATE_ANIMATION_SOLVE_DECK) {
                        if (has_won()) {
                            master_state = STATE_PLAYING;
                        }
                    } else if (cursor.empty()) {
                        master_state = STATE_PLAYING;
                    }
                    //this is here because any card moving action requires animation
                    //during transition, cards are not all present on the field
                    if (!solvable && is_solvable()) {
                        solvable = true;
                    }
                }
            }
        }
    }
    if (!won && has_won()) {
        won = true;
    }
}