コード例 #1
0
static waypoint_follower::lane rule_stopline(const waypoint_follower::lane& msg, double acceleration, size_t fixed_cnt)
{
	waypoint_follower::lane computations = msg;

	std::vector<size_t> indexes = search_stopline_index(msg);
	if (indexes.empty())
		return computations;

	for (const size_t& i : indexes)
		computations = apply_acceleration(computations, acceleration, i, 1, 0);

	std::reverse(computations.waypoints.begin(), computations.waypoints.end());

	std::vector<size_t> reverse_indexes;
	for (const size_t& i : indexes)
		reverse_indexes.push_back(msg.waypoints.size() - i - 1);
	std::reverse(reverse_indexes.begin(), reverse_indexes.end());

	for (const size_t& i : reverse_indexes)
		computations = apply_acceleration(computations, acceleration, i, fixed_cnt, 0);

	std::reverse(computations.waypoints.begin(), computations.waypoints.end());

	return computations;
}
コード例 #2
0
static waypoint_follower::lane rule_crossroad(const waypoint_follower::lane& msg, double acceleration)
{
	waypoint_follower::lane computations = msg;

	bool crossroad;
	std::vector<size_t> start_indexes;
	std::vector<size_t> end_indexes;
	for (size_t i = 0; i < msg.waypoints.size(); ++i) {
		map_file::DTLane dtlane;
		dtlane.r = msg.waypoints[i].dtlane.r;
		if (i == 0) {
			crossroad = is_crossroad(dtlane);
			continue;
		}
		if (!crossroad && is_crossroad(dtlane)) {
			start_indexes.push_back(i);
			crossroad = true;
			continue;
		}
		if (crossroad && !is_crossroad(dtlane)) {
			end_indexes.push_back(i - 1);
			crossroad = false;
		}
	}

	for (const size_t& i : end_indexes)
		computations = apply_acceleration(computations, acceleration, i, 1,
						  computations.waypoints[i].twist.twist.linear.x);

	std::reverse(computations.waypoints.begin(), computations.waypoints.end());

	std::vector<size_t> reverse_start_indexes;
	for (const size_t& i : start_indexes)
		reverse_start_indexes.push_back(msg.waypoints.size() - i - 1);
	std::reverse(reverse_start_indexes.begin(), reverse_start_indexes.end());

	for (const size_t& i : reverse_start_indexes)
		computations = apply_acceleration(computations, acceleration, i, 1,
						  computations.waypoints[i].twist.twist.linear.x);

	std::reverse(computations.waypoints.begin(), computations.waypoints.end());

	return computations;
}
コード例 #3
0
ファイル: CPhys.hpp プロジェクト: AcnodeLabs/Athenaeum
	void Step(float dt) {

		if (impulse[0]) force[0]+=impulse[0];
		if (impulse[1]) force[1]+=impulse[1];
		if (impulse[2]) force[2]+=impulse[2];


		float weight;
		weight = mass * gravity[1];

		impulse[0] = impulse[0] * 0.9f; if (abs(impulse[0])<0.001f) impulse[0] = 0.0f;
		impulse[1] = impulse[1] * 0.9f; if (abs(impulse[1])<0.001f) impulse[1] = 0.0f;
		impulse[2] = impulse[2] * 0.9f; if (abs(impulse[2])<0.001f) impulse[2] = 0.0f;

		if (!active) {
			return;
		}

		apply_force(&accel[0], &force[0], mass);

		if (active) accel[0] += gravity[0];
		if (active) accel[1] += gravity[1];
		if (active) accel[2] += gravity[2];

		apply_acceleration(&vel[0], &accel[0], dt); 

		vel[0]*= friction;
		vel[1]*= friction;
		vel[2]*= friction;

		apply_velocity(&pos[0], &vel[0], dt);

		momentum[0] = mass * vel[0];
		momentum[1] = mass * vel[1];
		momentum[2] = mass * vel[2];

	}