Mobile Robotics COM596 Laboratory Session: week 2 Introduction to Khepera Robot Khepera Robot This is a miniature robot that has diameter of 55mm, height of 30mm, and weight of 70g, shown in Figure 1. The robot is supported by two wheels and two small Teflon balls placed under its platform. The wheels are controlled by two DC motors with an incremental encoder (12 pulses per mm of robot advancement) and can rotate in both directions. The geometrical shape and the motor layout of Khepera make the robot to navigate in sophisticated environment even when its control system is immature. It is provided with eight infrared proximity sensors placed around its body which are based on emission and reception of infrared light, shown in Figure 1. Each receptor can measure both the ambient infrared light and the reflected infrared light emitted by the robot itself. Several new single sensors and complete modules, such as a stereovision module and a gripper module, can be easily added, due to the hardware and software modularity of the system. Dedicated to Khepera, the simulated mobile robot includes eight infrared sensors allowing it to detect by reflection (small rectangles) the proximity of objects in front of it, behind it, and to the right and left sides of it. Each sensor returns a value ranging between 0 and 1023 represented in gradual colour levels. 0 means that no object is perceived whereas 1023 means that an object is very close to the sensor (almost touching the sensor). Intermediate values may give an approximate idea of the distance between the sensor and the object. Each motor can take a speed value ranging between -10 and +l0. Infrared Sensors 0-7 Left Sensor (DL) Left Wheel (VL) Right Wheel (VR) Right Sensor (DR) Figure 1: Khepera Robot Programming Features The Khepera robot can be programmed in Matlab or C++. It is expected that the students will develop the system in Matlab environment. Matlab functions for Khepera robot will be made available during the project. Initial material can be found at module website. Example 1: Useful Matlab functions/commands for the Khepera robot kMatlab is a set of Matlab routines that permit the user to interact with Khepera over a serial connection. It includes Windows DLLs to perform the system-level serial-port communication, and a library of useful Matlab .m files to read sensors, set speed, etc. Extract all "kMatlab" files to a directory on your hard disk. Run Matlab. To use the commands, you can simply change the local directory to your kMatlab directory (e.g. » cd d:\path\to\kMatlab). To avoid performing this step every time you load Matlab (or to run the kMatlab commands from another directory) you can add the kMatlab directory to the Matlab path. From the Matlab menu, choose File, Set Path, and enter (or Browse for) your kMatlab directory. Choose "Add to Path". Make sure Khepera is connected to your computer and powered on. You are now ready to use the commands! Usage You must first OPEN the serial port using the KOPEN command, which is of the form: » port_reference = kopen([ com_port, baud_rate, timeout]) e.g. use first serial device (COM1), at 19200 baud, with 1 second timeout: » ref = kopen([0,19200,1]) or for COM2 at 38400 baud: » ref = kopen([1,38400,1]) If you receive the response: ??? Undefined function or variable 'kopen', then you are not in the correct directory, or you have not set up your path correctly. Note that 0=COM1, 1=COM2! Also, do not forget to assign kopen's return value to some variable; it is required for all subsequent commands. We will use 'ref' as our return variable for the following examples. When you are done you must CLOSE the serial port: » kclose(ref) Sending commands To send a command that returns a SINGLE line response: » return_value = kcmd( port_reference, 'khepera_command') To send a command that returns a MULTIPLE line response, you add a '1': » return_value = kcmd( port_reference, 'khepera_command', 1) Notes: The single-line command returns everything it receives from Khepera until it receives a newline character. The multi-line command, however, doesn't know how long your multi-line response it, and so it waits for 'timeout' seconds, and then returns everything in the buffer. The choice of timeout is therefore important. Too small, and multi-line responses will be truncated; too long, and the command will take a long time to return. One second (timeout = 1) is recommended, and corresponds to 48 lines of 80-column text at 38400 baud. The use of the return value is optional. Use the 'port_reference' that was returned by kopen. Examples: To return the system bios version (single-line): » kcmd(ref,'B') ans = b,5.01,5.00 To list currently running processes (multi-line): » kcmd(ref,'process',1) ans = Process N. 00000000 IDLE process for the micro-kernell, EF-98: Rev. 1.00 Process N. 00000001 Start-up process of the Khepera, EF-98: Rev. 5.00 kMatlab Command Library Although kopen, kcmd, and kclose are all you need to fully control Khepera from Matlab, for convenience we have also provided a library of useful matlab commands. They are described briefly below, but for more information please read the .m files. For explanation of the actual Khepera commands sent by these Matlab routines, please consult Appendix A of the Khepera User Manual. These commands are provided as a starting point. You are encouraged to modify and/or create your own new functions to suit your application. The commands are not case sensitive. They are written in mixed-case for clarity, but for example kSetSpeedPID and ksetspeedpid are equivalent. If an error occurs, many of the functions will return -1 as an error code. The equivalents for all of the Khepera commands listed in Appendix A of the Khepera User Manual are listed at the end of this document. Demos: kProximityG(ref) - Graphical histogram or polar plot display of proximity sensor readings kBraitenbergG(ref, gain) - Graphical demonstration of a Braitenberg vehicle ('gain' is optional) System Commands: kopen([port, baud_rate, timeout]) - opens serial port, supports baud rates up to 115200 bps. kcmd(ref, text_string) - sends a command to Khepera for a SINGLE-LINE response kcmd(ref, text_string, 1) - sends a command to Khepera for a MULTI-LINE response kclose(ref) - closes the serial port kFlush(ref) - empties the buffer. This is useful if you issue a multi-line command but forget the '1' parameter. (see sample session below) A "command not found" message will be returned by Khepera--ignore this. Information Commands: kBios(ref) - kBios(ref); displays the bios and protocol versions - [a,b] = kBios(ref); does not display, but assigns the values to a and b kList(ref) - lists available ROM modules kTeam(ref) - lists the K-Team Sensor Commands: kAmbient(ref) - returns the ambient light sensor readings as an 8-element vector kProximity(ref) - returns the proximity sensor readings as an 8-element vector Motor/Encoder Commands: kGetStatus(ref) - returns a 6-element vector describing motor controller status kStatus(ref) - displays text description of current motor controller status kGetEncoders(ref) - returns a 2-element vector of current encoder values kSetEncoders(ref, left, right) - sets the encoder positions. If left and right aren't specified, the positions are reset to zero. kSetPWM(ref, left, right) - sets the speed of the motors using pulse-width modulation values (-255..+255) Speed Control : kGetSpeed(ref) - returns a 2-element vector of current speeds kSetSpeed(ref, left, right) - sets the motor speeds, regulated by PID control kStop(ref) - stop Khepera (set speed to zero) kSetSpeedPID(ref, Kp, Ki, Kd) - sets the PID coefficients of the speed controller. If no values are specified, they are reset to the defaults (3800, 800, 100) Position Control : kMoveTo(ref, left, right) - use the position controller to move to a position specified by encoder counts kSetPositionPID(ref, Kp, Ki, Kd) - sets the PID coefficients of the position controller. If no values are specified, they are reset to the defaults (3000, 20, 4000) kSetProfile(ref, velLeft, accLeft, velRight, accRight) - sets the velocity and acceleration profile of the position controller. If no values are specified, they are reset to the defaults (vel=20, acc=64) Miscellaneous Commands: kGetAnalog(ref, channel) - read an analog input channel via the 10-bit A/D converter kLED(ref, n, action) - set the two LEDs. 'n' and/or 'action' can be vectors, e.g. kLED(ref, [0 1], [2 0]) will toggle LED0, and turn off LED1. kReadByte(ref, address) - reads a byte from the extension bus kWriteByte(ref, address) - writes a byte to the extension bus kTurret(ref, turretID, textString) - sends a text string command to an extension turret kTurretBios(ref, turretID) - provided as an example of possible turret commands, this displays the bios version of an extension turret kBraitenberg(ref, gain) - demonstrates a Braitenberg vehicle. If no gain is specified, a default value of 0.7 is used. kMatlab equivalents to Khepera commands (as listed in Appendix A of the User Manual) Khepera Command kMatlab equivalent -----------------------------------------------------------------------A - Configure kSetSpeedPID B - Read software version kBios C - Set a position to be reached kMoveTo D - Set speed kSetSpeed E - Read speed kGetSpeed F - Configure the position PID controller kSetPositionPID G - Set position to the position counter kSetEncoders H - Read position kGetEncoders I - Read A/D input kGetAnalog J - Configure the speed profile controller kSetProfile K - Read the status of the motion controller kGetStatus L - Change LED state kLED N - Read proximity sensors kProximity O - Read ambient light sensors kAmbient P - Set PWM (pulse width modulation) kSetPWM T - Send a message to an extension turret kTurret R - Read a byte on the extension bus kReadByte W - Write a byte on the extension bus kWriteByte Sample session It has been edited for clarity: % open COM1 at 38400 baud, 1 second timeout » ref = kopen([0, 38400, 1]); » kBios(ref); Khepera BIOS version: 5.01 Khepera protocol version: 5.00 » kGetEncoders(ref) ans = 0 0 % move forward 100 encoder counts » kMoveTo(ref,100,100); » kGetEncoders(ref) ans = 100 100 » kStatus(ref) Left: (status = AT TARGET) (control = SPEED) (Error = 0) Right: (status = AT TARGET) (control = SPEED) (Error = 0) % try a multi-line command using the '1' parameter » kcmd(ref,'memory',1) ans = First free ROM address: 16'00012490, used 57% First free RAM 1 address: 16'001243F4, used 13% First free RAM 2 address: 16'001A0000, used 0% % but if we forget the '1', we only receive the first line of the buffer » kcmd(ref,'process') ans = First free ROM address: 16'00012490, used 57% % subsequent commands will receive incorrect responses stored in the buffer % Here we ask for the system bios, but receive part of the previous response » kcmd(ref,'B') ans = First free RAM 1 address: 16'001243F4, used 13% % flushing the buffer will let us continue normally (ignore the % "Command not found" message) » kFlush(ref) Buffer contents: First free RAM 2 address: 16'001A0000, used 0% b,5.01,5.00 Command not found % we can now continue... » kcmd(ref,'B') ans = b,5.01,5.00 % when we are finished, we can close the connection » kclose(ref)