* Rename 'isIRDetect*' functions to 'isLightBumper*'

* Documentation / code cleanup
* Add function 'driveRadius'
* Add function 'isVirtualWall'
This commit is contained in:
jacobperron 2016-03-28 19:17:35 -07:00
parent cdc6927e76
commit 75dd293bfd
5 changed files with 157 additions and 84 deletions

View file

@ -72,16 +72,16 @@ int main(int argc, char** argv) {
// If everything is ok, drive forward using IR's to avoid obstacles // If everything is ok, drive forward using IR's to avoid obstacles
if (drive) { if (drive) {
robot->setPowerLED(0); // green robot->setPowerLED(0); // green
if (robot->isIRDetectLeft() || if (robot->isLightBumperLeft() ||
robot->isIRDetectFrontLeft() || robot->isLightBumperFrontLeft() ||
robot->isIRDetectCenterLeft()) { robot->isLightBumperCenterLeft()) {
// turn right // turn right
robot->drive(0.1, -1.0); robot->drive(0.1, -1.0);
robot->setDigitsASCII('-','-','-',']'); robot->setDigitsASCII('-','-','-',']');
} }
else if (robot->isIRDetectRight() || else if (robot->isLightBumperRight() ||
robot->isIRDetectFrontRight() || robot->isLightBumperFrontRight() ||
robot->isIRDetectCenterRight()) { robot->isLightBumperCenterRight()) {
// turn left // turn left
robot->drive(0.1, 1.0); robot->drive(0.1, 1.0);
robot->setDigitsASCII('[','-','-','-'); robot->setDigitsASCII('[','-','-','-');

View file

@ -90,8 +90,12 @@ namespace create {
Create(RobotModel = CREATE_2); Create(RobotModel = CREATE_2);
/* Attempts to establish serial connection to Create. /* Attempts to establish serial connection to Create.
* \param port of your computer that is connected to Create.
* \param baud rate to communicate with Create. Typically,
* 115200 for Create 2 and 57600 for Create 1.
* \param model type of robot.
*/ */
Create(const std::string& port, const int& baud, RobotModel = CREATE_2); Create(const std::string& port, const int& baud, RobotModel model = CREATE_2);
~Create(); ~Create();
@ -107,26 +111,21 @@ namespace create {
*/ */
void disconnect(); void disconnect();
/* Resets as if you have removed the battery.
* Changes mode to MODE_PASSIVE.
*/
// TODO
//void reset();
// TODO
//void setBaud(int baudcode);
/* Change Create mode. /* Change Create mode.
* \param mode to put Create in.
* \return true if successful, false otherwise
*/ */
bool setMode(const create::CreateMode& mode); bool setMode(const create::CreateMode& mode);
/* Starts a cleaning mode. /* Starts a cleaning mode.
* Changes mode to MODE_PASSIVE. * Changes mode to MODE_PASSIVE.
* \return true if successful, false otherwise
*/ */
bool clean(const create::CleanMode& mode = CLEAN_DEFAULT); bool clean(const create::CleanMode& mode = CLEAN_DEFAULT);
/* Starts the docking behaviour. /* Starts the docking behaviour.
* Changes mode to MODE_PASSIVE. * Changes mode to MODE_PASSIVE.
* \return true if successful, false otherwise
*/ */
bool dock() const; bool dock() const;
@ -134,42 +133,49 @@ namespace create {
* \param day in range [0, 6] * \param day in range [0, 6]
* \param hour in range [0, 23] * \param hour in range [0, 23]
* \param min in range [0, 59] * \param min in range [0, 59]
* \return true if successful, false otherwise
*/ */
bool setDate(const create::DayOfWeek& day, const uint8_t& hour, const uint8_t& min) const; bool setDate(const create::DayOfWeek& day, const uint8_t& hour, const uint8_t& min) const;
/* Set the average wheel velocity and turning radius of Create. /* Set the average wheel velocity and turning radius of Create.
* \param vel is in m/s * \param velocity is in m/s bounded between [-0.5, 0.5]
* \param radius in meters. * \param radius in meters.
* Special cases: drive straight = CREATE_2_STRAIGHT_RADIUS,
* turn in place counter-clockwise = CREATE_2_IN_PLACE_RADIUS,
* turn in place clockwise = -CREATE_2_IN_PLACE_RADIUS
* \return true if successful, false otherwise
*/ */
//void driveRadius(const float& vel, const float& radius) const; bool driveRadius(const float& velocity, const float& radius) const;
/* Set the velocities for the left and right wheels (m/s). /* Set the velocities for the left and right wheels.
* \param leftWheel velocity in m/s.
* \param rightWheel veloctiy in m/s.
* \return true if successful, false otherwise
*/ */
bool driveWheels(const float& leftWheel, const float& rightWheel) const; bool driveWheels(const float& leftWheel, const float& rightWheel) const;
/* Set the PWM for each wheel.
*/
// TODO
//void drivePWM(const int16_t& leftWheel, const int16_t& rightWheel) const;
/* Set the forward and angular velocity of Create. /* Set the forward and angular velocity of Create.
* \param xVel in m/s * \param xVel in m/s
* \param angularVel in rads/s * \param angularVel in rads/s
* \return true if successful, false otherwise
*/ */
bool drive(const float& xVel, const float& angularVel) const; bool drive(const float& xVel, const float& angularVel) const;
/* Set the power to the side brush motor. /* Set the power to the side brush motor.
* \param power is in the range [-1, 1] * \param power is in the range [-1, 1]
* \return true if successful, false otherwise
*/ */
bool setSideMotor(const float& power); bool setSideMotor(const float& power);
/* Set the power to the main brush motor. /* Set the power to the main brush motor.
* \param power is in the range [-1, 1] * \param power is in the range [-1, 1]
* \return true if successful, false otherwise
*/ */
bool setMainMotor(const float& power); bool setMainMotor(const float& power);
/* Set the power to the vacuum motor. /* Set the power to the vacuum motor.
* \param power is in the range [0, 1] * \param power is in the range [0, 1]
* \return true if successful, false otherwise
*/ */
bool setVacuumMotor(const float& power); bool setVacuumMotor(const float& power);
@ -177,42 +183,57 @@ namespace create {
* \param mainPower in the range [-1, 1] * \param mainPower in the range [-1, 1]
* \param sidePower in the range [-1, 1] * \param sidePower in the range [-1, 1]
* \param vacuumPower in the range [0, 1] * \param vacuumPower in the range [0, 1]
* \return true if successful, false otherwise
*/ */
bool setAllMotors(const float& mainPower, const float& sidePower, const float& vacuumPower); bool setAllMotors(const float& mainPower, const float& sidePower, const float& vacuumPower);
/* Set the blue "debris" LED on/off. /* Set the blue "debris" LED on/off.
* \param enable
* \return true if successful, false otherwise
*/ */
bool enableDebrisLED(const bool& enable); bool enableDebrisLED(const bool& enable);
/* Set the green "spot" LED on/off. /* Set the green "spot" LED on/off.
* \param enable
* \return true if successful, false otherwise
*/ */
bool enableSpotLED(const bool& enable); bool enableSpotLED(const bool& enable);
/* Set the green "dock" LED on/off. /* Set the green "dock" LED on/off.
* \param enable
* \return true if successful, false otherwise
*/ */
bool enableDockLED(const bool& enable); bool enableDockLED(const bool& enable);
/* Set the orange "check Create" LED on/off. /* Set the orange "check Create" LED on/off.
* \param enable
* \return true if successful, false otherwise
*/ */
bool enableCheckRobotLED(const bool& enable); bool enableCheckRobotLED(const bool& enable);
/* Set the center power LED. /* Set the center power LED.
* \param power in range [0, 255] where 0 = green and 255 = red * \param power in range [0, 255] where 0 = green and 255 = red
* \param intensity in range [0, 255] * \param intensity in range [0, 255]
* \return true if successful, false otherwise
*/ */
bool setPowerLED(const uint8_t& power, const uint8_t& intensity = 255); bool setPowerLED(const uint8_t& power, const uint8_t& intensity = 255);
// TODO
//void setScheduleLED(...);
/* Set the four 7-segment display digits from left to right. /* Set the four 7-segment display digits from left to right.
* \param segments to enable (true) or disable (false).
* The size of segments should be less than 29.
* The ordering of segments is left to right, top to bottom for each digit:
*
* 0 7 14 21
* || || || ||
* 1 |___| 2 8 |___| 9 15 |___| 16 22 |___| 23
* | 3 | | 10| | 17| | 24|
* 4 |___| 5 11|___| 12 18 |___| 19 25 |___| 26
* 6 13 20 27
*
* \return true if successful, false otherwise
*/ */
// TODO //TODO (https://github.com/AutonomyLab/libcreate/issues/7)
//void setDigits(uint8_t digit1, uint8_t digit2, //bool setDigits(const std::vector<bool>& segments) const;
// uint8_t digit3, uint8_t digit4);
// TODO
// pushButton(...);
/* Set the four 7-segment display digits from left to right with ASCII codes. /* Set the four 7-segment display digits from left to right with ASCII codes.
* Any code out side the accepted ascii ranges results in blank display. * Any code out side the accepted ascii ranges results in blank display.
@ -220,6 +241,7 @@ namespace create {
* \param digit2 is second to left digit with ascii range [32, 126] * \param digit2 is second to left digit with ascii range [32, 126]
* \param digit3 is second to right digit with ascii range [32, 126] * \param digit3 is second to right digit with ascii range [32, 126]
* \param digit4 is right most digit with ascii range [32, 126] * \param digit4 is right most digit with ascii range [32, 126]
* \return true if successful, false otherwise
*/ */
bool setDigitsASCII(const uint8_t& digit1, const uint8_t& digit2, bool setDigitsASCII(const uint8_t& digit1, const uint8_t& digit2,
const uint8_t& digit3, const uint8_t& digit4) const; const uint8_t& digit3, const uint8_t& digit4) const;
@ -231,6 +253,7 @@ namespace create {
* \param notes is a sequence of notes. Each note is in the range [31, 127]. * \param notes is a sequence of notes. Each note is in the range [31, 127].
* Anything outside this range is considered a rest note. * Anything outside this range is considered a rest note.
* \param durations for each note in fractions of a second from the range [0, 4) * \param durations for each note in fractions of a second from the range [0, 4)
* \return true if successful, false otherwise
*/ */
bool defineSong(const uint8_t& songNumber, bool defineSong(const uint8_t& songNumber,
const uint8_t& songLength, const uint8_t& songLength,
@ -239,12 +262,11 @@ namespace create {
/* Play a previously created song. /* Play a previously created song.
* This command will not work if a song was not already defined with the specified song number. * This command will not work if a song was not already defined with the specified song number.
* \param songNumber is one of four stored songs in the range [0, 4]
* \return true if successful, false otherwise
*/ */
bool playSong(const uint8_t& songNumber) const; bool playSong(const uint8_t& songNumber) const;
// TODO
//void registerCallback(...);
/* True if a left or right wheeldrop is detected. /* True if a left or right wheeldrop is detected.
*/ */
bool isWheeldrop() const; bool isWheeldrop() const;
@ -265,12 +287,19 @@ namespace create {
*/ */
bool isCliff() const; bool isCliff() const;
//TODO /* True if there is a virtual wall signal is being received.
//bool isVirtualWall() const; */
bool isVirtualWall() const;
//TODO //TODO (https://github.com/AutonomyLab/libcreate/issues/8)
//bool isWheelOvercurrent() const; //bool isWheelOvercurrent() const;
//TODO (https://github.com/AutonomyLab/libcreate/issues/8)
//bool isMainBrushOvercurrent() const;
//TODO (https://github.com/AutonomyLab/libcreate/issues/8)
//bool isSideBrushOvercurrent() const;
/* Get level of the dirt detect sensor. /* Get level of the dirt detect sensor.
* \return value in range [0, 255] * \return value in range [0, 255]
*/ */
@ -292,13 +321,36 @@ namespace create {
*/ */
uint8_t getIRRight() const; uint8_t getIRRight() const;
/* Get state of 'clean' button ('play' button on Create 1).
*/
bool isCleanButtonPressed() const; bool isCleanButtonPressed() const;
/* Not supported by any firmware!
*/
bool isClockButtonPressed() const; bool isClockButtonPressed() const;
/* Not supported by any firmware!
*/
bool isScheduleButtonPressed() const; bool isScheduleButtonPressed() const;
/* Get state of 'day' button.
*/
bool isDayButtonPressed() const; bool isDayButtonPressed() const;
/* Get state of 'hour' button.
*/
bool isHourButtonPressed() const; bool isHourButtonPressed() const;
/* Get state of 'min' button.
*/
bool isMinButtonPressed() const; bool isMinButtonPressed() const;
/* Get state of 'dock' button ('advance' button on Create 1).
*/
bool isDockButtonPressed() const; bool isDockButtonPressed() const;
/* Get state of 'spot' button.
*/
bool isSpotButtonPressed() const; bool isSpotButtonPressed() const;
/* Get battery voltage. /* Get battery voltage.
@ -327,21 +379,39 @@ namespace create {
*/ */
uint16_t getBatteryCapacity() const; uint16_t getBatteryCapacity() const;
bool isIRDetectLeft() const; /* Return true if farthest left light sensor detects an obstacle, false otherwise.
bool isIRDetectFrontLeft() const; */
bool isIRDetectCenterLeft() const; bool isLightBumperLeft() const;
bool isIRDetectRight() const;
bool isIRDetectFrontRight() const;
bool isIRDetectCenterRight() const;
uint16_t getDistLeft() const; /* Return true if front left light sensor detects an obstacle, false otherwise.
uint16_t getDistFrontLeft() const; */
uint16_t getDistCenterLeft() const; bool isLightBumperFrontLeft() const;
uint16_t getDistRight() const;
uint16_t getDistFrontRight() const;
uint16_t getDistCenterRight() const;
/* Return true if Create is moving forward. /* Return true if center left light sensor detects an obstacle, false otherwise.
*/
bool isLightBumperCenterLeft() const;
/* Return true if farthest right light sensor detects an obstacle, false otherwise.
*/
bool isLightBumperRight() const;
/* Return true if front right light sensor detects an obstacle, false otherwise.
*/
bool isLightBumperFrontRight() const;
/* Return true if center right light sensor detects an obstacle, false otherwise.
*/
bool isLightBumperCenterRight() const;
//TODO (https://github.com/AutonomyLab/libcreate/issues/3)
//uint16_t getDistLeft() const;
//uint16_t getDistFrontLeft() const;
//uint16_t getDistCenterLeft() const;
//uint16_t getDistRight() const;
//uint16_t getDistFrontRight() const;
//uint16_t getDistCenterRight() const;
/* Return true if Create is moving forward, false otherwise.
*/ */
bool isMovingForward() const; bool isMovingForward() const;
@ -353,7 +423,7 @@ namespace create {
*/ */
create::CreateMode getMode() const; create::CreateMode getMode() const;
/* Get the estimated position of Create based on it's wheel encoders. /* Get the estimated position of Create based on wheel encoders.
*/ */
const create::Pose& getPose() const; const create::Pose& getPose() const;

View file

@ -46,6 +46,9 @@ namespace create {
static const uint32_t CREATE_2_MAX_ENCODER_TICKS = 65535; static const uint32_t CREATE_2_MAX_ENCODER_TICKS = 65535;
static const float CREATE_2_WHEEL_DIAMETER = 0.078; static const float CREATE_2_WHEEL_DIAMETER = 0.078;
static const float CREATE_2_MAX_VEL = 0.5; static const float CREATE_2_MAX_VEL = 0.5;
static const float CREATE_2_MAX_RADIUS = 2.0;
static const float CREATE_2_STRAIGHT_RADIUS = 32.768;
static const float CREATE_2_IN_PLACE_RADUIS = 0.001;
static const float PI = 3.14159; static const float PI = 3.14159;
static const float TWO_PI = 6.28318; static const float TWO_PI = 6.28318;
static const float EPS = 0.0001; static const float EPS = 0.0001;

View file

@ -188,16 +188,16 @@ namespace create {
return serial->send(cmd, 4); return serial->send(cmd, 4);
} }
/*void Create::driveRadius(const float& vel, const float& radius) const { bool Create::driveRadius(const float& vel, const float& radius) const {
// Expects each parameter as two bytes each and in millimeters // Expects each parameter as two bytes each and in millimeters
int16_t vel_mm = roundf(vel * 1000); int16_t vel_mm = roundf(vel * 1000);
int16_t radius_mm = roundf(radius * 1000); int16_t radius_mm = roundf(radius * 1000);
BOUND(vel_mm, -500, 500); BOUND(vel_mm, -util::CREATE_2_MAX_VEL * 1000, util::CREATE_2_MAX_VEL * 1000);
// Consider special cases for radius // Bound radius if not a special case
if (radius_mm != 32768 && radius_mm != 32767 && if (radius_mm != 32768 && radius_mm != 32767 &&
radius_mm != -1 && radius_mm != 1) { radius_mm != -1 && radius_mm != 1) {
BOUND(radius_mm, -2000, 2000); BOUND(radius_mm, -util::CREATE_2_MAX_RADIUS, util::CREATE_2_MAX_RADIUS);
} }
uint8_t cmd[5] = { OC_DRIVE, uint8_t cmd[5] = { OC_DRIVE,
@ -207,9 +207,8 @@ namespace create {
radius_mm & 0xff radius_mm & 0xff
}; };
serial->send(cmd, 5); return serial->send(cmd, 5);
} }
*/
bool Create::driveWheels(const float& leftVel, const float& rightVel) const { bool Create::driveWheels(const float& leftVel, const float& rightVel) const {
int16_t leftCmd = roundf(leftVel * 1000); int16_t leftCmd = roundf(leftVel * 1000);
@ -226,17 +225,6 @@ namespace create {
return serial->send(cmd, 5); return serial->send(cmd, 5);
} }
/*void Create::drivePWM(const int16_t& leftPWM, const int16_t& rightPWM) const {
uint8_t cmd[5] = { OC_DRIVE_PWM,
rightPWM >> 8,
rightPWM & 0xff,
leftPWM >> 8,
leftPWM & 0xff
};
serial->send(cmd, 5);
}
*/
bool Create::drive(const float& xVel, const float& angularVel) const { bool Create::drive(const float& xVel, const float& angularVel) const {
// Compute left and right wheel velocities // Compute left and right wheel velocities
float leftVel = xVel - ((util::CREATE_2_AXLE_LENGTH / 2.0) * angularVel); float leftVel = xVel - ((util::CREATE_2_AXLE_LENGTH / 2.0) * angularVel);
@ -432,6 +420,16 @@ namespace create {
} }
} }
bool Create::isVirtualWall() const {
if (data->isValidPacketID(ID_VIRTUAL_WALL)) {
return GET_DATA(ID_VIRTUAL_WALL);
}
else {
CERR("[create::Create] ", "Virtual Wall sensor not supported!");
return false;
}
}
uint8_t Create::getDirtDetect() const { uint8_t Create::getDirtDetect() const {
if (data->isValidPacketID(ID_DIRT_DETECT)) { if (data->isValidPacketID(ID_DIRT_DETECT)) {
return GET_DATA(ID_DIRT_DETECT); return GET_DATA(ID_DIRT_DETECT);
@ -495,8 +493,9 @@ namespace create {
} }
} }
// Not working // Not supported by any 600 series firmware
bool Create::isClockButtonPressed() const { bool Create::isClockButtonPressed() const {
CERR("[create::Create] ", "Clock button is not supported!");
if (data->isValidPacketID(ID_BUTTONS)) { if (data->isValidPacketID(ID_BUTTONS)) {
return (GET_DATA(ID_BUTTONS) & 0x80) != 0; return (GET_DATA(ID_BUTTONS) & 0x80) != 0;
} }
@ -506,8 +505,9 @@ namespace create {
} }
} }
// Not working // Not supported by any 600 series firmware
bool Create::isScheduleButtonPressed() const { bool Create::isScheduleButtonPressed() const {
CERR("[create::Create] ", "Schedule button is not supported!");
if (data->isValidPacketID(ID_BUTTONS)) { if (data->isValidPacketID(ID_BUTTONS)) {
return (GET_DATA(ID_BUTTONS) & 0x40) != 0; return (GET_DATA(ID_BUTTONS) & 0x40) != 0;
} }
@ -617,7 +617,7 @@ namespace create {
} }
} }
bool Create::isIRDetectLeft() const { bool Create::isLightBumperLeft() const {
if (data->isValidPacketID(ID_LIGHT)) { if (data->isValidPacketID(ID_LIGHT)) {
return (GET_DATA(ID_LIGHT) & 0x01) != 0; return (GET_DATA(ID_LIGHT) & 0x01) != 0;
} }
@ -627,7 +627,7 @@ namespace create {
} }
} }
bool Create::isIRDetectFrontLeft() const { bool Create::isLightBumperFrontLeft() const {
if (data->isValidPacketID(ID_LIGHT)) { if (data->isValidPacketID(ID_LIGHT)) {
return (GET_DATA(ID_LIGHT) & 0x02) != 0; return (GET_DATA(ID_LIGHT) & 0x02) != 0;
} }
@ -637,7 +637,7 @@ namespace create {
} }
} }
bool Create::isIRDetectCenterLeft() const { bool Create::isLightBumperCenterLeft() const {
if (data->isValidPacketID(ID_LIGHT)) { if (data->isValidPacketID(ID_LIGHT)) {
return (GET_DATA(ID_LIGHT) & 0x04) != 0; return (GET_DATA(ID_LIGHT) & 0x04) != 0;
} }
@ -647,7 +647,7 @@ namespace create {
} }
} }
bool Create::isIRDetectCenterRight() const { bool Create::isLightBumperCenterRight() const {
if (data->isValidPacketID(ID_LIGHT)) { if (data->isValidPacketID(ID_LIGHT)) {
return (GET_DATA(ID_LIGHT) & 0x08) != 0; return (GET_DATA(ID_LIGHT) & 0x08) != 0;
} }
@ -657,7 +657,7 @@ namespace create {
} }
} }
bool Create::isIRDetectFrontRight() const { bool Create::isLightBumperFrontRight() const {
if (data->isValidPacketID(ID_LIGHT)) { if (data->isValidPacketID(ID_LIGHT)) {
return (GET_DATA(ID_LIGHT) & 0x10) != 0; return (GET_DATA(ID_LIGHT) & 0x10) != 0;
} }
@ -667,7 +667,7 @@ namespace create {
} }
} }
bool Create::isIRDetectRight() const { bool Create::isLightBumperRight() const {
if (data->isValidPacketID(ID_LIGHT)) { if (data->isValidPacketID(ID_LIGHT)) {
return (GET_DATA(ID_LIGHT) & 0x20) != 0; return (GET_DATA(ID_LIGHT) & 0x20) != 0;
} }

View file

@ -24,13 +24,13 @@ namespace create {
ADD_PACKET(ID_TEMP, 1, "temperature"); ADD_PACKET(ID_TEMP, 1, "temperature");
ADD_PACKET(ID_CHARGE , 2, "battery_charge"); ADD_PACKET(ID_CHARGE , 2, "battery_charge");
ADD_PACKET(ID_CAPACITY, 2, "battery_capacity"); ADD_PACKET(ID_CAPACITY, 2, "battery_capacity");
ADD_PACKET(ID_VIRTUAL_WALL, 1, "virtual_wall");
if (model == CREATE_1) { if (model == CREATE_1) {
ADD_PACKET(ID_DISTANCE, 2, "distance"); ADD_PACKET(ID_DISTANCE, 2, "distance");
ADD_PACKET(ID_ANGLE, 2, "angle"); ADD_PACKET(ID_ANGLE, 2, "angle");
} }
else if (model == CREATE_2) { else if (model == CREATE_2) {
//ADD_PACKET(ID_VIRTUAL_WALL, 1, "virtual_wall");
//ADD_PACKET(ID_OVERCURRENTS, 1, "overcurrents"); //ADD_PACKET(ID_OVERCURRENTS, 1, "overcurrents");
ADD_PACKET(ID_DIRT_DETECT, 1, "dirt_detect"); ADD_PACKET(ID_DIRT_DETECT, 1, "dirt_detect");
//ADD_PACKET(ID_UNUSED_1, 1, "unused 1"); //ADD_PACKET(ID_UNUSED_1, 1, "unused 1");