예제 #1
0
void RoboClaw::printStatus(char *string, size_t n)
{
	snprintf(string, n,
		 "pos1,spd1,pos2,spd2: %10.2f %10.2f %10.2f %10.2f\n",
		 double(getMotorPosition(MOTOR_1)),
		 double(getMotorSpeed(MOTOR_1)),
		 double(getMotorPosition(MOTOR_2)),
		 double(getMotorSpeed(MOTOR_2)));
}
예제 #2
0
void motion_SpeedControlLR(RobotCommand *out_cmd, float spLeft, float distLeft,
		float accLeft, float spRight, float distRight, float accRight) {
	out_cmd->cmdType = SPEED_COMMAND;
	out_cmd->mcType = LEFT_RIGHT;

	//LEFT
	ComputeSpeedCommand(&(out_cmd->cmd.speedCmd[LEFT_MOTOR]),
			getMotorSpeed(&motors[LEFT_RIGHT][LEFT_MOTOR]),
			convertSpeedTovTopsPerPeriod(spLeft), convertDistTovTops(distLeft),
			convertAccelTovTopsPerPeriodSqd(accLeft));

	//RIGHT
	ComputeSpeedCommand(&(out_cmd->cmd.speedCmd[RIGHT_MOTOR]),
			getMotorSpeed(&motors[LEFT_RIGHT][RIGHT_MOTOR]),
			convertSpeedTovTopsPerPeriod(spRight),
			convertDistTovTops(distRight),
			convertAccelTovTopsPerPeriodSqd(accRight));
}
예제 #3
0
void motion_SpeedControlADMaxTime(RobotCommand *out_cmd, float spAlpha,
		float accAlpha, float spDelta, float accDelta, int duringMs) {
	int32 time;

	out_cmd->cmdType = SPEED_COMMAND;
	out_cmd->mcType = ALPHA_DELTA;

	time = (DEFAULT_SAMPLING_FREQ * duringMs) / 1000;

	ComputeSpeedCommandMaxTime(&(out_cmd->cmd.speedCmd[ALPHA_MOTOR]),
			getMotorSpeed(&motors[ALPHA_DELTA][ALPHA_MOTOR]),
			convertSpeedTovTopsPerPeriod(spAlpha),
			convertAccelTovTopsPerPeriodSqd(accAlpha), time);

	ComputeSpeedCommandMaxTime(&(out_cmd->cmd.speedCmd[DELTA_MOTOR]),
			getMotorSpeed(&motors[ALPHA_DELTA][DELTA_MOTOR]),
			convertSpeedTovTopsPerPeriod(spDelta),
			convertAccelTovTopsPerPeriodSqd(accDelta), time);
}
예제 #4
0
void motion_SpeedControlAD(RobotCommand *out_cmd, float spAlpha,
		float distAlpha, float accAlpha, float spDelta, float distDelta,
		float accDelta) {
	out_cmd->cmdType = SPEED_COMMAND;
	out_cmd->mcType = ALPHA_DELTA;

	//ALPHA
	ComputeSpeedCommand(&(out_cmd->cmd.speedCmd[ALPHA_MOTOR]),
			getMotorSpeed(&motors[ALPHA_DELTA][ALPHA_MOTOR]),
			convertSpeedTovTopsPerPeriod(spAlpha),
			convertDistTovTops(distAlpha),
			convertAccelTovTopsPerPeriodSqd(accAlpha));

	//DELTA
	ComputeSpeedCommand(&(out_cmd->cmd.speedCmd[DELTA_MOTOR]),
			getMotorSpeed(&motors[ALPHA_DELTA][DELTA_MOTOR]),
			convertSpeedTovTopsPerPeriod(spDelta),
			convertDistTovTops(distDelta),
			convertAccelTovTopsPerPeriodSqd(accDelta));
}
예제 #5
0
void motion_SpeedControlLRDecel(RobotCommand *out_cmd, float spLeft,
		float distLeft, float accLeft, float decLeft, float spRight,
		float distRight, float accRight, float decRight) {
	int32 motorSpeed;
	int32 goalSpeed;

	out_cmd->cmdType = SPEED_COMMAND;
	out_cmd->mcType = LEFT_RIGHT;

	motorSpeed = getMotorSpeed(&motors[LEFT_RIGHT][LEFT_MOTOR]);
	goalSpeed = convertSpeedTovTopsPerPeriod(spLeft);

	if (((motorSpeed < goalSpeed) && motorSpeed > 0)
			|| ((motorSpeed > goalSpeed) && motorSpeed < 0)) {
		//LEFT
		ComputeSpeedCommand(&(out_cmd->cmd.speedCmd[LEFT_MOTOR]), motorSpeed,
				goalSpeed, convertDistTovTops(distLeft),
				convertAccelTovTopsPerPeriodSqd(accLeft));
	} else {
		//LEFT
		ComputeSpeedCommand(&(out_cmd->cmd.speedCmd[LEFT_MOTOR]), motorSpeed,
				goalSpeed, convertDistTovTops(distLeft),
				convertAccelTovTopsPerPeriodSqd(decLeft));
	}

	motorSpeed = getMotorSpeed(&motors[LEFT_RIGHT][RIGHT_MOTOR]);
	goalSpeed = convertSpeedTovTopsPerPeriod(spRight);

	if (((motorSpeed < goalSpeed) && motorSpeed > 0)
			|| ((motorSpeed > goalSpeed) && motorSpeed < 0)) {
		//RIGHT
		ComputeSpeedCommand(&(out_cmd->cmd.speedCmd[RIGHT_MOTOR]), motorSpeed,
				goalSpeed, convertDistTovTops(distRight),
				convertAccelTovTopsPerPeriodSqd(accRight));
	} else {
		//RIGHT
		ComputeSpeedCommand(&(out_cmd->cmd.speedCmd[RIGHT_MOTOR]), motorSpeed,
				goalSpeed, convertDistTovTops(distRight),
				convertAccelTovTopsPerPeriodSqd(decRight));
	}
}
		bool ChassicCommandInterpreter::handle(const Command& command)
		{
			if(command.compareModule("CH"))
			{
				// CHASSIC
				if(command.compareAction("MV"))
				{
					// MOVE
					if(command.compareArgument1("FW"))
					{
						// FORWARD
						_platform.move(rover::chassic::MOVE_FORWARD, getMotorSpeed(command, rover::chassic::SPEED_75));
						return true;
					}

					if(command.compareArgument1("BW"))
					{
						// FORWARD
						_platform.move(rover::chassic::MOVE_BACKWARD, getMotorSpeed(command, rover::chassic::SPEED_75));
						return true;
					}

					rover::telemetry::Logger::debug("Wrong CHASSIC MOVE command");
				}
				else if(command.compareAction("RT"))
				{
					// ROTATE
					if(command.compareArgument1("TL"))
					{
						// LEFT
						_platform.rotate(rover::chassic::ROTATE_LEFT, getMotorSpeed(command, rover::chassic::SPEED_75));
						return true;
					}

					if(command.compareArgument1("TR"))
					{
						// FORWARD
						_platform.rotate(rover::chassic::ROTATE_RIGHT, getMotorSpeed(command, rover::chassic::SPEED_75));
						return true;
					}

					rover::telemetry::Logger::debug("Wrong CHASSIC ROTATE command");
				}
				else if(command.compareAction("ST"))
				{
					// STOP
					_platform.stop();
					return true;
				}
				else if(command.compareAction("BR"))
				{
					// BRAKE
					_platform.brake();
					return true;
				}
				else
				{
					rover::telemetry::Logger::debug("Wrong CHASSIC command");					
				}

				return false;
			}
		}