roomba_comms.h
1 /*
2  * Player - One Hell of a Robot Server
3  * Copyright (C) 2006 -
4  * Brian Gerkey
5  *
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  *
21  */
22 
23 #ifndef ROOMBA_COMMS_H
24 #define ROOMBA_COMMS_H
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
30 #include <limits.h>
31 
32 /* command opcodes */
33 #define ROOMBA_OPCODE_START 128
34 #define ROOMBA_OPCODE_BAUD 129
35 #define ROOMBA_OPCODE_CONTROL 130
36 #define ROOMBA_OPCODE_SAFE 131
37 #define ROOMBA_OPCODE_FULL 132
38 #define ROOMBA_OPCODE_POWER 133
39 #define ROOMBA_OPCODE_SPOT 134
40 #define ROOMBA_OPCODE_CLEAN 135
41 #define ROOMBA_OPCODE_MAX 136
42 #define ROOMBA_OPCODE_DRIVE 137
43 #define ROOMBA_OPCODE_MOTORS 138
44 #define ROOMBA_OPCODE_LEDS 139
45 #define ROOMBA_OPCODE_SONG 140
46 #define ROOMBA_OPCODE_PLAY 141
47 #define ROOMBA_OPCODE_SENSORS 142
48 #define ROOMBA_OPCODE_FORCEDOCK 143
49 
50 #define ROOMBA_DELAY_MODECHANGE_MS 20
51 
52 #define ROOMBA_MODE_OFF 0
53 #define ROOMBA_MODE_PASSIVE 1
54 #define ROOMBA_MODE_SAFE 2
55 #define ROOMBA_MODE_FULL 3
56 
57 #define ROOMBA_TVEL_MAX_MM_S 500
58 #define ROOMBA_RADIUS_MAX_MM 2000
59 
60 #define ROOMBA_SENSOR_PACKET_SIZE 26
61 
62 #define ROOMBA_CHARGING_NOT 0
63 #define ROOMBA_CHARGING_RECOVERY 1
64 #define ROOMBA_CHARGING_CHARGING 2
65 #define ROOMBA_CHARGING_TRICKLE 3
66 #define ROOMBA_CHARGING_WAITING 4
67 #define ROOMBA_CHARGING_ERROR 5
68 
69 #define ROOMBA_AXLE_LENGTH 0.258
70 
71 #define ROOMBA_DIAMETER 0.33
72 
73 #define ROOMBA_BUMPER_XOFFSET 0.05
74 
75 #define ROOMBA_DISCOVERY 0
76 #define ROOMBA_500 1
77 
78 #ifndef MIN
79  #define MIN(a,b) ((a < b) ? (a) : (b))
80 #endif
81 #ifndef MAX
82  #define MAX(a,b) ((a > b) ? (a) : (b))
83 #endif
84 #ifndef NORMALIZE
85  #define NORMALIZE(z) atan2(sin(z), cos(z))
86 #endif
87 
88 typedef struct
89 {
90  /* Serial port to which the robot is connected */
91  char serial_port[PATH_MAX];
92  /* File descriptor associated with serial connection (-1 if no valid
93  * connection) */
94  int fd;
95  /* Current operation mode; one of ROOMBA_MODE_* */
96  unsigned char mode;
97  /* Integrated odometric position [m m rad] */
98  double ox, oy, oa;
99  /* Roomba type (there are differences between roomba discovery & 500 interfaces) */
100  unsigned int roomba_type;
101 
102  /* Various Boolean flags */
103  int bumper_left, bumper_right;
104  unsigned char wheeldrop_caster, wheeldrop_left, wheeldrop_right;
105  unsigned char wall;
106  unsigned char cliff_left, cliff_frontleft, cliff_frontright, cliff_right;
107  unsigned char virtual_wall;
108  unsigned char overcurrent_driveleft, overcurrent_driveright;
109  unsigned char overcurrent_mainbrush, overcurrent_sidebrush;
110  unsigned char overcurrent_vacuum;
111  unsigned char dirtdetector_right, dirtdetector_left;
112  unsigned char remote_opcode;
113  unsigned char button_power, button_spot, button_clean, button_max;
114 
115  /* One of ROOMBA_CHARGING_* */
116  unsigned char charging_state;
117  /* Volts */
118  double voltage;
119  /* Amps */
120  double current;
121  /* degrees C */
122  double temperature;
123  /* Ah */
124  double charge;
125  /* Capacity */
126  double capacity;
127 } roomba_comm_t;
128 
129 roomba_comm_t* roomba_create(const char* serial_port, unsigned int roomba_type);
130 void roomba_destroy(roomba_comm_t* r);
131 int roomba_open(roomba_comm_t* r, unsigned char fullcontrol);
132 int roomba_init(roomba_comm_t* r, unsigned char fullcontrol);
133 int roomba_close(roomba_comm_t* r);
134 int roomba_set_speeds(roomba_comm_t* r, double tv, double rv);
135 int roomba_parse_sensor_packet(roomba_comm_t* r,
136  unsigned char* buf, size_t buflen);
137 int roomba_get_sensors(roomba_comm_t* r, int timeout);
138 void roomba_print(roomba_comm_t* r);
139 int roomba_clean(roomba_comm_t* r);
140 int roomba_forcedock(roomba_comm_t* r);
141 
142 int roomba_set_song(roomba_comm_t* r, unsigned char songNumber,
143  unsigned char songLength, unsigned char *notes,
144  unsigned char *noteLengths);
145 int roomba_play_song(roomba_comm_t *r, unsigned char songNumber);
146 
147 int roomba_vacuum(roomba_comm_t *r, int state);
148 int roomba_set_leds(roomba_comm_t *r, uint8_t dirt_detect, uint8_t max,
149  uint8_t clean, uint8_t spot, uint8_t status,
150  uint8_t power_color, uint8_t power_intensity );
151 
152 #ifdef __cplusplus
153 }
154 #endif
155 
156 #endif
157 
#define PLAYER_VECTORMAP_REQ_WRITE_LAYER
Request/reply subtype: write layer data.
Definition: player_interfaces.h:5143
uint8_t state
FALSE for off, TRUE for on.
Definition: player_interfaces.h:667
#define PLAYER_BUMPER_REQ_GET_GEOM
Data: state (PLAYER_BUMPER_DATA_GEOM)
Definition: player_interfaces.h:1916
position 2d velocity command
Definition: player_interfaces.h:617
uint32_t bumpers_count
the number of valid bumper readings
Definition: player_interfaces.h:1925
Command: state (PLAYER_POSITION1D_CMD_POS)
Definition: player_interfaces.h:3583
char * name
Identifier for the geometric shape.
Definition: player_interfaces.h:5153
uint32_t data_count
Size of data as stored in buffer (bytes)
Definition: player_interfaces.h:3452
#define PLAYER_MSG1(level, msg, a)
Error message macros.
Definition: error.h:105
#define PLAYER_MSG3(level, msg, a, b, c)
Error message macros.
Definition: error.h:107
player_pose2d_t vel
translational velocities [m/s,m/s,rad/s] (x, y, yaw)
Definition: player_interfaces.h:620
#define PLAYER_IR_DATA_RANGES
Data subtype: ranges.
Definition: player_interfaces.h:2108
static bool MatchMessage(player_msghdr_t *hdr, int type, int subtype, player_devaddr_t addr)
Helper for message processing.
Definition: message.h:158
Definition: roomba_comms.h:88
player_vectormap_feature_data_t * features
Array of map features.
Definition: player_interfaces.h:5185
double ReadFloat(int section, const char *name, double value)
Read a floating point (double) value.
player_bumper_define_t * bumper_def
geometry of each bumper
Definition: player_interfaces.h:1953
double px
X [m].
Definition: player.h:230
uint32_t valid
Status bits.
Definition: player_interfaces.h:296
A pose in the plane.
Definition: player.h:216
uint32_t poses_count
the number of ir samples returned by this robot
Definition: player_interfaces.h:2133
Data AND Request/reply: bumper geometry.
Definition: player_interfaces.h:1948
Generic message header.
Definition: player.h:160
virtual int MainSetup(void)
Sets up the resources needed by the driver thread.
Definition: driver.h:657
virtual void MainQuit(void)
Cleanup method for driver thread (called when main exits)
Definition: driver.h:663
#define PLAYER_IR_REQ_POSE
Request/reply subtype: get pose.
Definition: player_interfaces.h:2102
uint8_t type
Message type; must be one of PLAYER_MSGTYPE_*.
Definition: player.h:165
#define PLAYER_WARN3(msg, a, b, c)
Error message macros.
Definition: error.h:91
Encapsulates a device (i.e., a driver bound to an interface)
Definition: device.h:73
const char * ReadString(int section, const char *name, const char *value)
Read a string value.
#define PLAYER_POSITION2D_REQ_MOTOR_POWER
Request/reply: Motor power.
Definition: player_interfaces.h:496
uint32_t name_count
Length of name in bytes.
Definition: player_interfaces.h:5179
position2d power config
Definition: player_interfaces.h:664
double px
X [m].
Definition: player.h:219
Request/reply: get pose.
Definition: player_interfaces.h:2130
#define PLAYER_POWER_DATA_STATE
Data subtype: voltage.
Definition: player_interfaces.h:274
#define PLAYER_POWER_MASK_VOLTS
bit masks for the player_power_data_t mask field
Definition: player_interfaces.h:282
#define PLAYER_POSITION2D_CMD_VEL
Command: velocity (PLAYER_POSITION2D_CMD_VEL)
Definition: player_interfaces.h:581
double pyaw
yaw [rad]
Definition: player.h:240
Vectormap data.
Definition: player_interfaces.h:5176
uint8_t subtype
Message subtype; interface specific.
Definition: player.h:167
double ReadTupleFloat(int section, const char *name, int index, double value)
Read a float (double) from a tuple field.
Request/reply: Motor power.
Definition: player_interfaces.h:3616
virtual void Main(void)=0
Main method for driver thread.
const char * ReadTupleString(int section, const char *name, int index, const char *value)
Read a string from a tuple field.
int ReadInt(int section, const char *name, int value)
Read an integer value.
#define PLAYER_POWER_MASK_WATTS
Data subtype: voltage.
Definition: player_interfaces.h:283
#define PLAYER_OPAQUE_DATA_STATE
Data subtype: generic state.
Definition: player_interfaces.h:3434
player_pose3d_t * poses
the pose of each IR detector on this robot
Definition: player_interfaces.h:2135
#define PLAYER_MSGTYPE_DATA
A data message.
Definition: player.h:94
double py
Y [m].
Definition: player.h:221
float radius
radius of curvature [m] - zero for straight lines
Definition: player_interfaces.h:1938
Request to get a double property.
Definition: player.h:468
uint32_t bumper_def_count
The number of valid bumper definitions.
Definition: player_interfaces.h:1951
uint8_t state
FALSE for off, TRUE for on.
Definition: player_interfaces.h:3619
#define PLAYER_MSGTYPE_RESP_ACK
A positive response message.
Definition: player.h:111
float * ranges
ranges [m]
Definition: player_interfaces.h:2124
char * attrib
Attrib data for the feature.
Definition: player_interfaces.h:5162
float ki
PID parameters.
Definition: player_interfaces.h:698
#define PLAYER_VECTORMAP_REQ_GET_LAYER_DATA
Request/reply subtype: get layer data.
Definition: player_interfaces.h:5140
#define PLAYER_POSITION2D_REQ_GET_GEOM
Request/reply: geometry.
Definition: player_interfaces.h:483
virtual int ProcessMessage(QueuePointer &resp_queue, player_msghdr *hdr, void *data)
Message handler.
bool ReadBool(int section, const char *name, bool value)
Read a boolean value (one of: yes, no, true, false, 1, 0)
Data: state (PLAYER_BUMPER_DATA_GEOM)
Definition: player_interfaces.h:1922
#define PLAYER_POSITION1D_REQ_MOTOR_POWER
Request/reply subtype: motor power.
Definition: player_interfaces.h:3488
float watts
estimated current energy consumption (negative values) or aquisition (positive values) [W].
Definition: player_interfaces.h:306
#define PLAYER_MSGTYPE_REQ
A request message.
Definition: player.h:105
#define PLAYER_MSGTYPE_RESP_NACK
A negative response message.
Definition: player.h:124
float pos
position [m] or [rad]
Definition: player_interfaces.h:3586
double sl
Length [m].
Definition: player.h:258
Data: voltage (PLAYER_POWER_DATA_STATE)
Definition: player_interfaces.h:291
uint32_t wkb_count
Length of data in bytes.
Definition: player_interfaces.h:5155
float kp
PID parameters.
Definition: player_interfaces.h:696
int ReadDeviceAddr(player_devaddr_t *addr, int section, const char *name, int code, int index, const char *key)
Read a device id.
player_pose2d_t pose
(x, y, yaw) [m, m, rad]
Definition: player_interfaces.h:689
int GetTupleCount(int section, const char *name)
Get the number of values in a tuple.
#define PLAYER_BUMPER_DATA_STATE
Data: state (PLAYER_BUMPER_DATA_GEOM)
Definition: player_interfaces.h:1910
Class for loading configuration file information.
Definition: configfile.h:195
double sw
Width [m].
Definition: player.h:256
virtual int Setup()
Initialize the driver.
Definition: driver.h:385
A device address.
Definition: player.h:144
#define PLAYER_POSITION2D_REQ_RESET_ODOM
Request/reply: Reset odometry.
Definition: player_interfaces.h:541
An autopointer for the message queue.
Definition: message.h:72
double py
Y [m].
Definition: player.h:232
uint8_t * bumpers
array of bumper values
Definition: player_interfaces.h:1927
Double property class.
Definition: property.h:141
player_pose2d_t vel
translational velocities [m/s,m/s,rad/s] (x, y, yaw)
Definition: player_interfaces.h:611
char * name
Identifier for the layer.
Definition: player_interfaces.h:5181
uint32_t name_count
Length of name in bytes.
Definition: player_interfaces.h:5151
position2d data
Definition: player_interfaces.h:606
#define PLAYER_ERROR1(msg, a)
Error message macros.
Definition: error.h:81
position2d geom
Definition: player_interfaces.h:655
char * key
The property key.
Definition: player.h:473
A pose in space.
Definition: player.h:227
#define PLAYER_ERROR(msg)
Error message macros.
Definition: error.h:80
Base class for drivers which oeprate with a thread.
Definition: driver.h:551
float kd
PID parameters.
Definition: player_interfaces.h:700
#define PLAYER_GET_DBLPROP_REQ
Double property get request subtype.
Definition: player.h:433
uint32_t ranges_count
number of samples
Definition: player_interfaces.h:2122
#define PLAYER_POSITION2D_DATA_STATE
Data: state (PLAYER_POSITION2D_DATA_STATE)
Definition: player_interfaces.h:568
player_pose2d_t pos
position [m,m,rad] (x, y, yaw)
Definition: player_interfaces.h:609
uint32_t attrib_count
Length of data in bytes.
Definition: player_interfaces.h:5160
Data: ranges (PLAYER_IR_DATA_RANGES)
Definition: player_interfaces.h:2115
uint32_t size
Size in bytes of the payload to follow.
Definition: player.h:173
uint32_t features_count
The number of map features.
Definition: player_interfaces.h:5183
position2d speed PID req
Definition: player_interfaces.h:693
float volts
Battery voltage [V].
Definition: player_interfaces.h:299
#define PLAYER_WARN(msg)
Warning message macros.
Definition: error.h:88
float length
length of the sensor [m]
Definition: player_interfaces.h:1936
uint8_t * wkb
Well known binary describing the geometric shape.
Definition: player_interfaces.h:5157
#define PLAYER_MSGTYPE_CMD
A command message.
Definition: player.h:98
virtual int Shutdown()
Finalize the driver.
Definition: driver.h:392
data
Definition: player_interfaces.h:3449
struct player_blobfinder_blob player_blobfinder_blob_t
Structure describing a single blob.
#define PLAYER_POSITION2D_REQ_SPEED_PID
Request/reply: Set velocity PID parameters.
Definition: player_interfaces.h:548
double pa
yaw [rad]
Definition: player.h:223
Base class for all drivers.
Definition: driver.h:107
Vectormap feature data.
Definition: player_interfaces.h:5148
#define PLAYER_MSG0(level, msg)
General messages.
Definition: error.h:104
player_bbox3d_t size
Dimensions of the base (m).
Definition: player_interfaces.h:660
#define PLAYER_POSITION1D_CMD_POS
Command subtype: position command.
Definition: player_interfaces.h:3521
set odometry
Definition: player_interfaces.h:686
uint16_t index
Which device of that interface.
Definition: player.h:154
player_devaddr_t addr
Device to which this message pertains.
Definition: player.h:163
#define PLAYER_MSGQUEUE_DEFAULT_MAXLEN
Default maximum length for a message queue.
Definition: player.h:75
T max(T a, T b)
Return the maximum of a, b.
Definition: utility.h:122
#define PLAYER_POSITION2D_REQ_SET_ODOM
Request/reply: Set odometry.
Definition: player_interfaces.h:535
player_pose3d_t pose
the local pose of a single bumper
Definition: player_interfaces.h:1934
uint8_t * data
The data we will be sending.
Definition: player_interfaces.h:3454