The baseName value for all devices is: Device/DeviceList/
The baseName value for all subdevices is: Device/SubDeviceList/
This last one is the most useful. You can also ask them by a DCMProxy::getPrefix() request to the DCM.
(Actuator and sensors have the same)
Value (float)
A subDevice always has a main value. Sensors has a value that is the return of the sensor, and actuator has a value that is the last command sent to the actuator (by the DCM).
For example, a Joint has (at least) 2 subdevices, the actuator (the angle we want to reach) and the sensor (the angle where we are, at the sensor precision). The value has a last update time (this is automatically done by ALMemory).
Usually, this value is an integer (8 bits, 16 bits, or others, and signed or unsigned) sent/received by the electronic boards, and changed to/read as a float by the DCM (using gain and offset). Actuators are first changed to int values, then the timed-command algorithm is applied, and then the last value is set in ALMemory. This is why if you ask 0.4 as a float value to a LED with a timed command, you can have 0.398 as the last sent command in ALMemory.
To access the value of a subDevice in ALMemory, simply add the baseName to the subDevice name and add “/Value”. For example: “Device/SubDeviceList//HeadPitch/Position/Actuator/Value”. Use “/Value” to access this value.
Gain and Offset (float)
The gain and the offset are applied to the device return/send value.
When a sensor returns a value (usually an integer), it’s automaticall multiplied by the gain, and the offset is added. When there is a command sent to an actuator, the offset is first removed, then it’s divided by the gain. Then, the value is sent to the device (after the timed-command algorithm).
Use “/Gain” and “/Offset” keys to access these values. In a normal use, you do not need to change these keys.
Ack and Nack (int) Each subDevice has also an “Ack” (device answered) and a “Nack” (device did not answer) value, that are simple counters. This value is an integer increment for all ack/nack received.
Ack is incremented each time there is a successful message sent/received to the (sub)Device, and Nack is incremented each time there is a communication error (or no return) from the (sub)Device. If there is no communication, there is no increase of ACK and NACK.
Be careful it could return to negative values or 0. Here, the upper level can also use the last update time. Nack means that the device is probably lost or not present, at least for a while (it could be just one communication issue), unless special feature. Use “/Ack” and “/Nack” keys to read these values.
Note
Right now, only Devices has Ack/Nack information, and a ack or a nack received for the device is not forwarded to its subDevices. So you have to check the Devices Ack/Nack...
Error
Each device/sub-device also has an error list. Each error has a time, a 0-7 level number, and a string. There is a 30 second time limit for each of these values. So only the 30 seconds old errors are kept (if there are any).
Levels are:
Level |
Meaning |
---|---|
7 |
Fatal error, could not be used (as with an Nack) |
6 |
Fatal error, but could still be used in a very bad way |
5 |
Error with bad effect on the main feature |
4 |
Error |
3 |
Warning |
2 |
Light warning |
1 |
Comment |
0 |
Everything is ok |
> Use the “/Error” key to read this value.
Note
Right now, this is not used. There are only errors for motor board devices, and the value is a special 8 bits int (see next chapter).
Min and Max
There is also a mandatory Min and Max value. Each timed command sent to an actuator is majored/minored by the min and max value. For sensors, their meaning depends on the subDevice type. There could have also specific use for some actuators. Use “/Min” and “/Max” keys to read these values. These values should not be changed.
Other configurations values: “Type”, “Device”, “SubDeviceNumber”
“Type” is a string that describes the kind of SubDevice. “Device” is the string name of the Device that controls this subDevice. “SubDeviceNumber” is an int, starting at “1” that is the subdevice number of this subDevice in this Device. These values should not be changed.
These are only mandatory keys. Depending on the type, every subDevices could have other “information” (such as changed sensor values) or “configuration” keys.
They are described in next chapters with the precise meaning of all keys.
Devices, unlike subdevices, do not have a “Value” in ALMemory, and also “Gain”, “Offset”, “Min” and “Max”. But they have “Ack/Nack” and “error list”.
They also have:
These values should not be changed.
It is possible to have other specific information, depending the Device type. See precise list in next chapter.
Note
There is no specific meaning for mandatory keys.
Specific keys:
StructVersion: an integer that is the version of the configuration structure for the motor board. This value is returned by the Device
BoardId: an integer value used as ID for the electronic board.
Note
This will change in the future
BoardId2: a second integer value used as ID for the electronic board.
Note
This will change in the future
BootLoaderVersion: an integer value with the motor board bootloader version.
Note
This will change in the future
ProgVersion: an integer value with the motor board program version.
Note
This will change in the future
Bid: a number from 1 to number max of board in the specific bus used in RS485 broadcast communication. This number is automatically given by the DCM at startup, and sent to the motor board in the config struct.
Error: One byte returns each cycle by the motor board. If there is more than one error, the motor board will send a different one every cycle. Be careful that motor and MRE numbers are physical numbers and not subdevice numbers.
Note
MRE means Magnetic Rotary Encoders and are the main sensors for joints (there is one on the joint itself, and there could be another one that is directly on the motor for more precision in some other joints). Most of the MRE errors are directly sent by the MRE sensor.
Error codes for motor board:
ERROR COM
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
---|---|---|---|---|---|---|---|
RS485 protocol |
10 |
READ UNFINISHED |
RCRC ERROR |
UNFINISHED |
READ CRC ERROR |
161 to 175 |
No |
Note |
Text |
---|---|
Bit 3 |
Start of a read request to this PIC, then ask for another address before the end |
Bit 2 |
Read CRC (write to this dsPIC point of view) was wrong |
Bit 1 |
New address found while message was not finished |
Bit 0 |
Message read by the dsPIC as a CRC error |
ERROR_UART_SPI
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
---|---|---|---|---|---|---|---|
Com RS485 / SPI (MRE) |
11 |
OERR |
FERR |
PERR |
SPI_SPIROV |
177 to 191 |
No |
Note |
Text |
---|---|
Bit 3 |
Overrun Error bit: Received FIFO full (5 bytes) |
Bit 2 |
Framing Error bit: bad stop bit |
Bit 1 |
Parity Error bit: bad parity |
Bit 0 |
SPI Overflow: a byte in the SPI was lost (SPI used for MRE communication) |
ERROR_MRE_BAD_OCF
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|---|---|
MRE |
9 |
MRE 4 |
MRE 3 |
MRE 2 |
MRE 1 |
145 to 159 |
Yes |
MRE: the offset compensation is not finished. Not tested if ERROR_NO_DATA or ERROR_PARITY |
ERROR_MRE_BAD_COF
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|---|---|
MRE |
5 |
MRE 4 |
MRE 3 |
MRE 2 |
MRE 1 |
81 to 95 |
Yes |
MRE: data invalid due to cordic overflow (magnet above XYZ limit). Not tested if ERROR_NO_DATA or ERROR_PARITY |
ERROR_MRE_WARNING_BAD_LIN
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|---|---|
MRE |
6 |
MRE 4 |
MRE 3 |
MRE 2 |
MRE 1 |
97 to 111 |
Yes |
MRE: Linearity alarm: Data could be invalid (magnet above XYZ limit). Not tested if ERROR_NO_DATA or ERROR_PARITY |
ERROR_MRE_WARNING_BAD_MAG
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|---|---|
MRE |
7 |
MRE 4 |
MRE 3 |
MRE 2 |
MRE 1 |
113 to 127 |
Yes |
MRE: magnetic input field invalid (too large or too small). Not tested if ERROR_NO_DATA or ERROR_PARITY |
ERROR_MRE_ERROR_PARITY
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|---|---|
MRE |
8 |
MRE 4 |
MRE 3 |
MRE 2 |
MRE 1 |
129 to 143 |
Yes |
MRE: Parity of the SPI message is false. Not tested if ERROR_NO_DATA |
ERROR_MRE_ERROR_NO_DATA
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|---|---|
MRE |
4 |
MRE 4 |
MRE 3 |
MRE 2 |
MRE 1 |
65 to 79 |
Yes |
MRE: Message is only 0 (no SPI) |
ERROR_TEMPERATURE
Kind |
1st value (7-4 bits) |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|
Temperature |
2 |
Motor 2 |
Motor 1 |
33, 34 or 35 |
Yes |
Motor temperature too high, current limitation is decreased |
ERROR_CURRENT_NO_MOTOR
Kind |
1st value (7-4 bits) |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|
Motor |
1 |
Motor 2 ERROR |
Motor 1 ERROR |
17, 18 or 19 |
Yes |
Error sent when there is no current for a while on the mother while the PWM is >10%. Divide PWM by two, until there is current back for a while. |
ERROR_ASSERV_ERROR_TOO_BIG_MOTOR
Kind |
1st value (7-4 bits) |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Note |
Text |
---|---|---|---|---|---|---|---|
Motor control |
3 |
Motor 2 |
Motor 1 |
49, 50 or 51 |
Yes |
Must be 100% hardness |
Motor control error greater than x deg |
WARNING_CURRENT_LIMITATION
Kind |
1st value (7-4 bits) |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|
Motor |
13 |
Motor 2 |
Motor 1 |
209, 210 or 211 |
Yes |
Motor current too big, PWM is decreased. |
ERROR_MOTOR1_NOT_ASSERV_BECAUSE_MRE
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|---|---|
MRE |
14 |
MRE joint OTHER ISSU |
MRE motor OTHER ISSUE |
MRE joint NO DATA |
MRE motor NO DATA |
225 to 239 |
Yes |
Position control cut for the motor one because of a MRE issue |
ERROR_MOTOR2_NOT_ASSERV_BECAUSE_MRE
Kind |
1st value (7-4 bits) |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
Value |
Test only after config |
Text |
---|---|---|---|---|---|---|---|---|
MRE |
15 |
MRE joint OTHER ISSUE |
MRE motor OTHER ISSUE |
MRE joint NO DATA |
MRE motor NO DATA |
241 to 255 |
Yes |
Position control cut for the motor because of a MRE issue |
ManufactureDate : Manufacture date (DD-MM-YYYY) (string)
Manufacturer (Ausgabe: “FSM-BMZ”) (string)
Device Name (Ausgabe: “AR-NAO ”) (string)
Firmware Version (Ausgabe: “V1.01”) (string)
Serial number (int: 2 bytes)
Note
None of these values are implemented, except for the new Sanyo battery, where the serial number is now a string like “ALDE000039___PD00100600”, with “ALDE000039___PD00” + year (“10”) + month (“06”) + 2 bytes serial in hexa “0x00”. The manufacturer is “SANYO”.
There are the mandatory keys, plus:
BodyId: official ID of the robot as a string. This string is stored in the chestBoard, and so linked to the body.
BodyNickName: string with the nick name of the robot, usually “NaoX”, X is the NAO number. This string is stored in the chestBoard, and so linked to the body.
ProgVersion: this is a string with the program version.
ChainResult: this is a string describing the chaining of motorBoard result. The chaining process is the way to give address to the motorBoard.
Note
This value is not correct right now.
Note
A Nack increment from the chestBoard usually means that the USB connection is lost. This is a very important error.
Other devices only have the mandatory keys.
Value:
Every LED is a simple actuator that has a float value from 0.0 (no light) to 1.0 (full light). Each LED has only one color, but there could be 3 LEDs (RGB) at the same place to have a full color RGB LED. But for the DCM point of view it’s always 3 LEDs.
In the robot, there is 16 possible blue value for the LEDs in the ears. There is 64 possible values for every LEDs near the eyes. And 255 possible values for the chest and foot ones.
The main Value is the last value sent to the LED, using timed-command. This value is first converted to the suitable integer value (depending on the resolution), sent to the actuator, and then converted back to 0.0-1.0 value in ALMemory.
Warning
Unfortunately, having 3 RGB LEDs set to “1.0” does not mean that you’ll see a perfect white: one or two LEDs will be brighter than others.
List of LEDs value keys:
Device/SubDeviceList/ChestBoard/Led/Blue/Actuator/Value
Device/SubDeviceList/ChestBoard/Led/Green/Actuator/Value
Device/SubDeviceList/ChestBoard/Led/Red/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/0Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/108Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/144Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/180Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/216Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/252Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/288Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/324Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/36Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Left/72Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/0Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/108Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/144Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/180Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/216Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/252Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/288Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/324Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/36Deg/Actuator/Value
Device/SubDeviceList/Ears/Led/Right/72Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Left/0Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Left/135Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Left/180Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Left/225Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Left/270Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Left/315Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Left/45Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Left/90Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Right/0Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Right/135Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Right/180Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Right/225Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Right/270Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Right/315Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Right/45Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Blue/Right/90Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Left/0Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Left/135Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Left/180Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Left/225Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Left/270Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Left/315Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Left/45Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Left/90Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Right/0Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Right/135Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Right/180Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Right/225Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Right/270Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Right/315Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Right/45Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Green/Right/90Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Left/0Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Left/135Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Left/180Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Left/225Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Left/270Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Left/315Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Left/45Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Left/90Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Right/0Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Right/135Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Right/180Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Right/225Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Right/270Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Right/315Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Right/45Deg/Actuator/Value
Device/SubDeviceList/Face/Led/Red/Right/90Deg/Actuator/Value
Device/SubDeviceList/Head/Led/Front/Left/0/Actuator/Value
Device/SubDeviceList/Head/Led/Front/Left/1/Actuator/Value
Device/SubDeviceList/Head/Led/Front/Right/0/Actuator/Value
Device/SubDeviceList/Head/Led/Front/Right/1/Actuator/Value
Device/SubDeviceList/Head/Led/Middle/Left/0/Actuator/Value
Device/SubDeviceList/Head/Led/Middle/Right/0/Actuator/Value
Device/SubDeviceList/Head/Led/Rear/Left/0/Actuator/Value
Device/SubDeviceList/Head/Led/Rear/Left/1/Actuator/Value
Device/SubDeviceList/Head/Led/Rear/Left/2/Actuator/Value
Device/SubDeviceList/Head/Led/Rear/Right/0/Actuator/Value
Device/SubDeviceList/Head/Led/Rear/Right/1/Actuator/Value
Device/SubDeviceList/Head/Led/Rear/Right/2/Actuator/Value
Device/SubDeviceList/LFoot/Led/Blue/Actuator/Value
Device/SubDeviceList/LFoot/Led/Green/Actuator/Value
Device/SubDeviceList/LFoot/Led/Red/Actuator/Value
Device/SubDeviceList/RFoot/Led/Blue/Actuator/Value
Device/SubDeviceList/RFoot/Led/Green/Actuator/Value
Device/SubDeviceList/RFoot/Led/Red/Actuator/Value
Value:
Switches are simple sensors that return a 2 state float value 0.0 (unpressed) or 1.0 (pressed).
Beware that the value is read only every 10ms, and very fast change may be unseen.
Warning
It’s better to use a logical “or” between the two switches of the same foot, and use it as one bumper only.
List of switchs value keys:
Device/SubDeviceList/ChestBoard/Button/Sensor/Value
Device/SubDeviceList/LFoot/Bumper/Left/Sensor/Value
Device/SubDeviceList/LFoot/Bumper/Right/Sensor/Value
Device/SubDeviceList/RFoot/Bumper/Left/Sensor/Value
Device/SubDeviceList/RFoot/Bumper/Right/Sensor/Value
This actuator is the subdevice giving the angle (in radian) to reach for joints. You need to send a timed command to this actuator, and you’ll see in ALMemory the last value sent to the sensor. The value is sent to the motor board device as integer in 16 bits precision (0-360deg are 0-65535). In ALMemory and in timed-command everything is in radian only.You can use the hardness value (see below) to control the max current sent to the motor.
There is a special case: when the hardness is <=0, the position is automatically set to the Position/Sensor with the same subDevice number on the device.
Here are some information about the control-loop for joint position:
Control-loop in the robot use one or two MRE sensors (Magnetic Rotary Encoder, used like potentiometer/optical encoder). These sensors are a small chip that detects the angle of rotation with a magnet. The magnet and the MRE could be on the motor or on the joint, after the gear. The angle is returned as a 12bit integer (0 to 360 deg -> 0 to 4095). The value is quite precise (even if a 1° absolute error is not something exceptional) and has little errors. NAO articulations use 2 kinds of motors. The biggest is for all joints in the bottom (Hip and above).
There are two cases in the robot: you can have either one big motor that have 2 MRE, one on the motor and one on the joint (this is for the bottom part), or you can have one small motor with one MRE, on the joint (this is for the top part of the robot).
The first solution is more precise and gives more accurate position, and very smooth movements even at low speed. On both solutions, the control loop is a kind of PID control, with modifications. For the 2 MRE version, the control is done with the MRE on the motor.
The MRE joint needs a calibration to know the “0” deg position. This is done by pushing the joint in the mechanical limit stop and send a special request. This calibration value is stored in the chest board (see preferences chapter), it’s a 0-4095 integer that is the 0 position of the joint for the MRE. When the motor board starts, it has no address and no data about motors and MRE. They received everything after a configuration process done by the DCM.
There are many error cases where the control loop is disabled (or decreased):
If there are more than 50 consecutive errors (not warnings) on one of the two sensors (if there is two), the control loop is disabled. It starts again if there is no more error. A MRE value with an error is forgotten, and the last value is used. You’ll need to wait 50 errors before disabling the control loop.
If there is no current detected, and the PWM>10%, the dsPIC thinks that the motor is unplugged, and reduces the control loop.
If there is a temperature issue (see temperature sensor). This reduces the max current.
There is no calibration (calibration value is 0).
If the motorBoard did not receive any order from 500ms, the control loop is automatically stopped.
Warning
This is important: if the DCM process/thread dies, the control loop of each motor will be stopped half a second later, and only the electromagnetic break will remain. Your robot will fall slowly...
If the hardness is not set to 100% (see hardness actuator). This reduces the max current.
If the electric current is too high compared to the limitation value (see current sensor).
Others keys are:
ImportanceLevel1...7
These keys are not used right now.
InvertControlDirection
Boolean. Set it to true if you want the control loop to be inverted for the motor rotation. This configuration value is read at startup by the DCM and then sent to the motherboard during the configuration process.
Warning
This value must never be changed!
Kp, Ki, Kp
These integer values are coefficients for the modified PID. This configuration value is read at startup by the DCM and then sent to the motherboard during the configuration process.
Warning
Do not change these configuration values. A high value may destroy the joint.
MotorNumber
Integer value. 0 means no motor for this subDevice. 1 or 2 are the motor number. This configuration value is read at startup by the DCM and then sent to the motherboard during the configuration process.
Warning
Do not change this configuration value.
List of position/actuator value keys:
Device/SubDeviceList/HeadPitch/Position/Actuator/Value
Device/SubDeviceList/HeadYaw/Position/Actuator/Value
Device/SubDeviceList/LAnklePitch/Position/Actuator/Value
Device/SubDeviceList/LAnkleRoll/Position/Actuator/Value
Device/SubDeviceList/LElbowRoll/Position/Actuator/Value
Device/SubDeviceList/LElbowYaw/Position/Actuator/Value
Device/SubDeviceList/LHand/Position/Actuator/Value
Device/SubDeviceList/LHipPitch/Position/Actuator/Value
Device/SubDeviceList/LHipRoll/Position/Actuator/Value
Device/SubDeviceList/LHipYawPitch/Position/Actuator/Value
Device/SubDeviceList/LKneePitch/Position/Actuator/Value
Device/SubDeviceList/LShoulderPitch/Position/Actuator/Value
Device/SubDeviceList/LShoulderRoll/Position/Actuator/Value
Device/SubDeviceList/LWristYaw/Position/Actuator/Value
Device/SubDeviceList/RAnklePitch/Position/Actuator/Value
Device/SubDeviceList/RAnkleRoll/Position/Actuator/Value
Device/SubDeviceList/RElbowRoll/Position/Actuator/Value
Device/SubDeviceList/RElbowYaw/Position/Actuator/Value
Device/SubDeviceList/RHand/Position/Actuator/Value
Device/SubDeviceList/RHipPitch/Position/Actuator/Value
Device/SubDeviceList/RHipRoll/Position/Actuator/Value
Device/SubDeviceList/RHipYawPitch/Position/Actuator/Value
Device/SubDeviceList/RKneePitch/Position/Actuator/Value
Device/SubDeviceList/RShoulderPitch/Position/Actuator/Value
Device/SubDeviceList/RShoulderRoll/Position/Actuator/Value
Device/SubDeviceList/RWristYaw/Position/Actuator/Value
This is a special actuator that defines the hardness (named as stiffness in the Motion module) of the joint. The value is from 0.0 to 1.0, 0 means 0% and 1 means 100% (full power). In the motorboard, this percentage is directly applied to the max current. Setting the hardness to 0.5 means that the electric current limitation is reduced to 50%.
Note
Previous use of the hardness has an effect on the PWM.
The effect is not linear. A hardness set to 0.5 means that there is less power left to the motor.
There is a special case: when the hardness is <=0, the position is automatically set to the Position/Sensor with the same subDevice number on the device.
There is another special case: when there is no calibration ( Position/Sensor/jointZeroPosition is 0, see in jointPosition sensor) the hardness cannot be greater than 0.0.
The hardness is sent to the motor board every DCM cycle time, so you can decrease/increase the control loop very fast.
Warning
Increasing the hardness very fast could result on a very strong movement on the robot, depending on the difference between the last actuator command and the real position, given by the sensor.
The hardness is usually used to smooth the start of the control loop when the robot is powered. It’s also used as a security. For example when the DCM has a cycle time error for more than 500ms, all hardness are set to 0 and then increased back to their former values in two seconds. You can also decrease it slowly at the end.
When the hardness is 0.0 (default value - that includes when the motorboard just started) the motor is in short circuit, so there is an electromagnetic break. This is a security to avoid the robot falling (it’ll fall anyway, but slower).
If the hardness is <0, the motor is free (no electromagnetic break), but due to hardware limitation, it’s only possible when the two motors of the same board are <0 (both are then free). If not, it’s still electromagnetic break.
If the current from the battery is over the limit (see below) the hardness of all joints will be decreased (slowly) to avoid the battery to shut off.
List of hardness value keys:
Device/SubDeviceList/HeadPitch/Hardness/Actuator/Value
Device/SubDeviceList/HeadYaw/Hardness/Actuator/Value
Device/SubDeviceList/LAnklePitch/Hardness/Actuator/Value
Device/SubDeviceList/LAnkleRoll/Hardness/Actuator/Value
Device/SubDeviceList/LElbowRoll/Hardness/Actuator/Value
Device/SubDeviceList/LElbowYaw/Hardness/Actuator/Value
Device/SubDeviceList/LHand/Hardness/Actuator/Value
Device/SubDeviceList/LHipPitch/Hardness/Actuator/Value
Device/SubDeviceList/LHipRoll/Hardness/Actuator/Value
Device/SubDeviceList/LHipYawPitch/Hardness/Actuator/Value
Device/SubDeviceList/LKneePitch/Hardness/Actuator/Value
Device/SubDeviceList/LShoulderPitch/Hardness/Actuator/Value
Device/SubDeviceList/LShoulderRoll/Hardness/Actuator/Value
Device/SubDeviceList/LWristYaw/Hardness/Actuator/Value
Device/SubDeviceList/RAnklePitch/Hardness/Actuator/Value
Device/SubDeviceList/RAnkleRoll/Hardness/Actuator/Value
Device/SubDeviceList/RElbowRoll/Hardness/Actuator/Value
Device/SubDeviceList/RElbowYaw/Hardness/Actuator/Value
Device/SubDeviceList/RHand/Hardness/Actuator/Value
Device/SubDeviceList/RHipPitch/Hardness/Actuator/Value
Device/SubDeviceList/RHipRoll/Hardness/Actuator/Value
Device/SubDeviceList/RHipYawPitch/Hardness/Actuator/Value
Device/SubDeviceList/RKneePitch/Hardness/Actuator/Value
Device/SubDeviceList/RShoulderPitch/Hardness/Actuator/Value
Device/SubDeviceList/RShoulderRoll/Hardness/Actuator/Value
Device/SubDeviceList/RWristYaw/Hardness/Actuator/Value
These sensors return the angle of the joint in radian in the “Value” key. As seen in Joint (Position/Actuator), there is 1 or 2 MRE for each joint. The value returned here is always the MRE on the joint. It’s a 12bits precise value (from 0 to 4095) change in rad.Refer to the Joint (Position/Actuator) for more details about the use of MRE sensors in control loop.
The sensor value is always returned, at each DCM cycle time. The value returned here uses a calibration that is stored in on special key (“jointZeroPosition”). MRE sensor values are quite precise and have very low error.
Others keys are:
“GearRatio”
This key is a float with the gear ratio between the motor and the joint. The control loop uses it. This configuration value is read at startup by the DCM and then sent to the motherboard during the configuration process.
Warning
Do not change this configuration value.
“SensorType”
This key is the description the kind of sensor. For now it could be only one or two MRE for the joint. This configuration value is read at startup by the DCM and then sent to the motherboard during the configuration process.
Warning
Do not change this configuration value.
“jointZeroPosition”
This key is the calibration value for the MRE on the joint. It’s an integer from 0 to 4095. A 0 value means that there is no calibration (default state) and so the hardness cannot be set. Usually, the value of this key is at “0” in the Device.xml standard file, but another value different from 0 is set by the configuration file in the chest board. This chest board file is of course linked to the body of the robot, and is specific to it. This configuration value is read at startup by the DCM and then sent to the motherboard during the configuration process.
Warning
Do not change this configuration value in the chest board and/or in the Device.xml.
“positionChainMREJoint”
This key is a integer 0-4 number that indicates the position of the MRE sensor for the joint in the MRE chain linked to the motorboard. 0 means that there is no sensor.This configuration value is read at startup by the DCM and then send to the motherboard during the configuration process.
Warning
Do not change this configuration value.
“positionChainMREMotor”
This key is an integer 0-4 number that indicates the position of the MRE sensor for the motor in the MRE chain linked to the motorboard. 0 means that there is no sensor. It’s the case for all joints up to the robot. This configuration value is read at startup by the DCM and then sent to the motherboard during the configuration process.
Warning
Do not change this configuration value.
List of Position/Sensor value keys:
Device/SubDeviceList/HeadPitch/Position/Sensor/Value
Device/SubDeviceList/HeadYaw/Position/Sensor/Value
Device/SubDeviceList/LAnklePitch/Position/Sensor/Value
Device/SubDeviceList/LAnkleRoll/Position/Sensor/Value
Device/SubDeviceList/LElbowRoll/Position/Sensor/Value
Device/SubDeviceList/LElbowYaw/Position/Sensor/Value
Device/SubDeviceList/LHand/Position/Sensor/Value
Device/SubDeviceList/LHipPitch/Position/Sensor/Value
Device/SubDeviceList/LHipRoll/Position/Sensor/Value
Device/SubDeviceList/LHipYawPitch/Position/Sensor/Value
Device/SubDeviceList/LKneePitch/Position/Sensor/Value
Device/SubDeviceList/LShoulderPitch/Position/Sensor/Value
Device/SubDeviceList/LShoulderRoll/Position/Sensor/Value
Device/SubDeviceList/LWristYaw/Position/Sensor/Value
Device/SubDeviceList/RAnklePitch/Position/Sensor/Value
Device/SubDeviceList/RAnkleRoll/Position/Sensor/Value
Device/SubDeviceList/RElbowRoll/Position/Sensor/Value
Device/SubDeviceList/RElbowYaw/Position/Sensor/Value
Device/SubDeviceList/RHand/Position/Sensor/Value
Device/SubDeviceList/RHipPitch/Position/Sensor/Value
Device/SubDeviceList/RHipRoll/Position/Sensor/Value
Device/SubDeviceList/RHipYawPitch/Position/Sensor/Value
Device/SubDeviceList/RKneePitch/Position/Sensor/Value
Device/SubDeviceList/RShoulderPitch/Position/Sensor/Value
Device/SubDeviceList/RShoulderRoll/Position/Sensor/Value
Device/SubDeviceList/RWristYaw/Position/Sensor/Value
There is 2 different Devices that send a current: the MotorBoard (updated every 10ms), and the Battery (updated every 20ms). For the battery, the value is signed: positive if the robot is charging, negative in case of discharge. For motorboard, the value key has the electric current in the motor in Ampere.
Every motorboard has a current sensor for each motor that is a very small resistor between the H-Bridge and the 0v.
The resistor voltage value is read by the micro-controller ADC at a precise moment in the PWM. If there is no PWM, there is no current seen, even if the motor has current (for example if you move the motor by hand).
Every motorBoard has an electric current limitation: if the current reach the “Max” value (“ElectricCurrent/Sensor/Max”) the PWM (return by the control loop) will be decreased a bit until it returns under the maximum value, and it’s increased again after. This is a kind of current control loop around the maximum value.
The aim of this limitation is to protect the motor, the electronic board, and the mechanical part of the joint.
This configuration value is read at startup by the DCM and then send to the motherboard during the configuration process.
The battery has also a current limitation: if the current from the battery is over the limit (max value) the hardness of all joints will be decreased (slowly) by the DCM to avoid the battery to shut off.
Warning
Never increase these configuration values!
Note
For the new Sanyo battery, the current is updated every 3.5s.
There is no special key for current subDevice type, but the “Max’” value is the value used for the current limitation.
List of current value keys:
Device/SubDeviceList/Battery/Current/Sensor/Value
Device/SubDeviceList/HeadPitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/HeadYaw/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LAnklePitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LAnkleRoll/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LElbowRoll/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LElbowYaw/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LHand/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LHipPitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LHipRoll/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LHipYawPitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LKneePitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LShoulderPitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LShoulderRoll/ElectricCurrent/Sensor/Value
Device/SubDeviceList/LWristYaw/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RAnklePitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RAnkleRoll/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RElbowRoll/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RElbowYaw/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RHand/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RHipPitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RHipRoll/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RHipYawPitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RKneePitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RShoulderPitch/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RShoulderRoll/ElectricCurrent/Sensor/Value
Device/SubDeviceList/RWristYaw/ElectricCurrent/Sensor/Value
There are two different Devices that return a temperature: the MotorBoard, and the Battery. For both, the temperature returned in “Value” is in deg Celsius. The motor temperature is a simulated one, using electric current value of the motor. Even when the robot just starts, the temperature is quite high (50°C).The simulation starts at this value mainly due to the internal temperature value. The motor board implements a temperature limitation: as long as the simulated temperature reaches 75°C, the current limitation is decreased to stay under 85°C.
List of temperature value keys:
Device/SubDeviceList/Battery/Temperature/Sensor/Value
Device/SubDeviceList/HeadPitch/Temperature/Sensor/Value
Device/SubDeviceList/HeadYaw/Temperature/Sensor/Value
Device/SubDeviceList/LAnklePitch/Temperature/Sensor/Value
Device/SubDeviceList/LAnkleRoll/Temperature/Sensor/Value
Device/SubDeviceList/LElbowRoll/Temperature/Sensor/Value
Device/SubDeviceList/LElbowYaw/Temperature/Sensor/Value
Device/SubDeviceList/LHand/Temperature/Sensor/Value
Device/SubDeviceList/LHipPitch/Temperature/Sensor/Value
Device/SubDeviceList/LHipRoll/Temperature/Sensor/Value
Device/SubDeviceList/LHipYawPitch/Temperature/Sensor/Value
Device/SubDeviceList/LKneePitch/Temperature/Sensor/Value
Device/SubDeviceList/LShoulderPitch/Temperature/Sensor/Value
Device/SubDeviceList/LShoulderRoll/Temperature/Sensor/Value
Device/SubDeviceList/LWristYaw/Temperature/Sensor/Value
Device/SubDeviceList/RAnklePitch/Temperature/Sensor/Value
Device/SubDeviceList/RAnkleRoll/Temperature/Sensor/Value
Device/SubDeviceList/RElbowRoll/Temperature/Sensor/Value
Device/SubDeviceList/RElbowYaw/Temperature/Sensor/Value
Device/SubDeviceList/RHand/Temperature/Sensor/Value
Device/SubDeviceList/RHipPitch/Temperature/Sensor/Value
Device/SubDeviceList/RHipRoll/Temperature/Sensor/Value
Device/SubDeviceList/RKneePitch/Temperature/Sensor/Value
Device/SubDeviceList/RShoulderPitch/Temperature/Sensor/Value
Device/SubDeviceList/RShoulderRoll/Temperature/Sensor/Value
Device/SubDeviceList/RWristYaw/Temperature/Sensor/Value
Value: relative state of charge in % ( from 0.0 to 1.0, 1.0 means 100%). This value is directly sent by the battery.
Warning
The value on the old BMZ battery is not very precise, due to an imprecision on calibration and integration of power.
Accu Voltage in V after last learning cycle
Not implemented
Remaining Capacity in Ah
Not implemented
“FullChargeCapacity” in Ah
FCC: Implemented
Cycle Counts (0-0xffff)
Not implemented
Design Capacity in Ah
Not implemented
Design Voltage in V
Not implemented
Cell Voltage in mV max
Implemented: the mV value of the maximum voltage of all 6 cells in the battery.
Cell Voltage in mV min
Implemented: the mV value of the minimum voltage of all 6 cells in the battery. The battery has security that stop it if < 2.7V.
DelayForDischargeErrorReset (in s)
Not implemented
Count of cycles after last learning cycle
Not implemented
Status of the battery
Implemented. See below
Note
On the new Sanyo battery, the min/max value of cell voltage are now both an average of the 6 cells values.
Boolean values:
These boolean value are not implemented. However, the direct bits are available through the “Status” key, as a 2 byte integer word. Use bit mask to found the true/false result for each bits.
There is a different status on the new Sanyo battery. It is one byte with:
Note
RemainingCapacity is updated in the SANYO battery, with values in Ah.
Note
FullChargeCapacity is nupdated in the SANYO battery, with values in Ah. The value is the division of the RemainingCapacity by the charge %. It is not updated if the charge is less than 10%.
Note
There is a new “Age” value for the SANYO battery, with values in %. This is an estimation of the age of the battery (depending on cycles). Better is 100%.
Send a value to this actuator to send a wave. With the value, you can choose what is the transmitter (left or right) and what is the receiver (left or right) for the US wave.
Choosing the side of the receiver/transmitter has an influence on detection cone, and gives you information about the obstacle presence.
The result is written approximately 10ms after in US/Sensor/Value. It’s in meters. <=0 or >=2.55m means error from the sensor or echo not detected.
Value | Transmitter | Receiver |
---|---|---|
0.0 | Left | Left |
1.0 | Left | Right |
2.0 | Right | Left |
3.0 | Right | Right |
Note
Since the new firmware (version 2) there are new modes of measuring object distances with ultrasounds. You can check the firmware version in /Device/USBoard/ProgVersion
All the bits combinations are not useful, even possible. Here are examples:
Value | Transmitter | Receiver |
---|---|---|
4.0 | Right and Left | Right and Left |
12.0 (8.0 + 4.0) | Right and Left | Right and Left |
68.0 (64.0 + 4.0) | Right and Left | Right and Left |
US actuator value key:
Device/SubDeviceList/US/Actuator/Value
This is the value returned by the UltraSound Device sensor (one of the two sensors in the chest). The value is changed about 10ms after sending the wave using the US actuator.
This request decides which transmitter/receiver is used.
The result is in meters. If you’ve got 0 or >=2.55 m, this is an error (same if there is a NACK).
Here is some more information about ultrasonic sensor:
The maximum distance for detection is approximately 1.20m (for the old version), but you’ll likely detect the ground before.
Be careful you can detect the robot arms!
The emission cone depends on the size of the object in front of the robot.
The quality of the detection will depends on the object (or obstacle): size, surface, orientation.
US sensor value key:
Device/SubDeviceList/US/Sensor/Value
These are the new sensors respectively dedicated to the left or right receivers. They are used if the third bit is set in the value sent to the actuator (only available for V2 cards).
The results of the first echo detected on each receiver are in Value, the 9 following echoes are from Value1 to Value9.
A value of 0 means an error, the minimum valid value/distance is 0,25m. A value of 2,55 means no echo, the maximum detectable distance is 2,54m.
For example, if Value contains 0,40, Value1 1,2 and Value2 2,55, the following values (3 to 9) will contain 2,55 too. It probably means you have the echo of the ground at 0,40m and another object at 1,2m. Left and Right sensors work the same way and allow you to locate objects.
List of us left/right sensor value keys:
Device/SubDeviceList/US/Left/Sensor/Value
Device/SubDeviceList/US/Left/Sensor/Value1
Device/SubDeviceList/US/Left/Sensor/Value2
Device/SubDeviceList/US/Left/Sensor/Value3
Device/SubDeviceList/US/Left/Sensor/Value4
Device/SubDeviceList/US/Left/Sensor/Value5
Device/SubDeviceList/US/Left/Sensor/Value6
Device/SubDeviceList/US/Left/Sensor/Value7
Device/SubDeviceList/US/Left/Sensor/Value8
Device/SubDeviceList/US/Left/Sensor/Value9
Device/SubDeviceList/US/Right/Sensor/Value
Device/SubDeviceList/US/Right/Sensor/Value1
Device/SubDeviceList/US/Right/Sensor/Value2
Device/SubDeviceList/US/Right/Sensor/Value3
Device/SubDeviceList/US/Right/Sensor/Value4
Device/SubDeviceList/US/Right/Sensor/Value5
Device/SubDeviceList/US/Right/Sensor/Value6
Device/SubDeviceList/US/Right/Sensor/Value7
Device/SubDeviceList/US/Right/Sensor/Value8
Device/SubDeviceList/US/Right/Sensor/Value9
The robot has a two axis gyrometer, in the center of the body. There is in fact 3 subDevices as there is also a reference value.
These sensors give the rotation speed around the robot X axis and around the robot Y axis.
When the robot does not move, you’ve got a “no rotation” value, that is not 0 and needs a calibration, usually around -2000. The main difficulty here is to calibrate this 0.
Then, the change of the value is around 2.7 increment/°/s.
You can have more information reading the sensor datasheet:
The value is then read by a micro-controller ADC (12 bits, from a 0-3.3v range), with a few average, and sent back directly (just multiplied by -1 in order to be in the good direction).
List of gyro value keys:
Device/SubDeviceList/InertialSensor/GyrRef/Sensor/Value
Device/SubDeviceList/InertialSensor/GyrX/Sensor/Value
Device/SubDeviceList/InertialSensor/GyrY/Sensor/Value
New gyro value keys are available since 1.14 version:
Device/SubDeviceList/InertialSensor/GyroscopeX/Sensor/Value
Device/SubDeviceList/InertialSensor/GyroscopeY/Sensor/Value
Device/SubDeviceList/InertialSensor/GyroscopeZ/Sensor/Value
The robot has a digital 8-bits 3 axis accelerometer, in the center of the body.
The 3 values are the return from the 3 axis acceleration sensor, with a light filter. 0 value means no acceleration at all for this axis. The value of g is about 56.
You can have more information reading the sensor datasheet:
The value is digital, and directly returned in ALMemory (with just a *-1 for the Y value).
List of acc value keys:
Device/SubDeviceList/InertialSensor/AccX/Sensor/Value
Device/SubDeviceList/InertialSensor/AccY/Sensor/Value
Device/SubDeviceList/InertialSensor/AccZ/Sensor/Value
New accelero value keys are available since 1.14 version:
Device/SubDeviceList/InertialSensor/AccelerometerX/Sensor/Value
Device/SubDeviceList/InertialSensor/AccelerometerY/Sensor/Value
Device/SubDeviceList/InertialSensor/AccelerometerZ/Sensor/Value
Theses are direct acceleration values in m.s-2 (one g is approximately 9.81 m.s-2).
The inertial board computes 2 inclination angles of the robot body with the gyro and accelero data.
Both angles are in radians.
List of angles value keys:
Device/SubDeviceList/InertialSensor/AngleX/Sensor/Value
Device/SubDeviceList/InertialSensor/AngleY/Sensor/Value
Since 1.14 version, a new Device/SubDeviceList/InertialSensor/AngleZ/Sensor/Value is avaiable, but always as “0” until new hardware update.
FSR stands for Force Sensing Resistor. There are 8 FSR subDevices in the robot, 4 in each foot. See hardware documentation for precise localization (there are also in the keys /XPosition and /YPosition, in m).
The value returned for each FSR is similar to Kg. If FSR are calibrated (see robot configuration keys), the value in kg is about 20% precision (depending time and real force position). Without calibration the error could be more important, and is specific to each sensor.
Note
The former raw values could be computed again inverting the formula: New value = ((1.0/old raw value) - offset)*gain.
The total weight value is the sum of all 4 FSR of the foot.
List of FSR value keys:
Device/SubDeviceList/LFoot/FSR/FrontLeft/Sensor/Value
Device/SubDeviceList/LFoot/FSR/FrontRight/Sensor/Value
Device/SubDeviceList/LFoot/FSR/RearLeft/Sensor/Value
Device/SubDeviceList/LFoot/FSR/RearRight/Sensor/Value
Device/SubDeviceList/LFoot/FSR/TotalWeight/Sensor/Value
Device/SubDeviceList/RFoot/FSR/FrontLeft/Sensor/Value
Device/SubDeviceList/RFoot/FSR/FrontRight/Sensor/Value
Device/SubDeviceList/RFoot/FSR/RearLeft/Sensor/Value
Device/SubDeviceList/RFoot/FSR/RearRight/Sensor/Value
Device/SubDeviceList/RFoot/FSR/TotalWeight/Sensor/Value
CenterOfPressure values are computed barycenter of FSR (using individual weight and position) for each foot. The value returned is in m for X and Y, from the foot reference, see the hardware documentation.
Using centerOfPressure and weight from both foot, you can compute a barycenter for all weight on the robot.
Warning
When the weight on the foot is very low, the center of pressure will likely be bad.
Warning
If the real center of pressure go outside the 4 FSR parallelogram, the value of weight and centre of pressure could become bad, due to internal mechanical constraint.
The total weight value is the sum of all 4 FSR of the foot.
List of CenterOfPressure value keys:
Device/SubDeviceList/LFoot/FSR/CenterOfPressure/X/Sensor/Value
Device/SubDeviceList/LFoot/FSR/CenterOfPressure/Y/Sensor/Value
Device/SubDeviceList/RFoot/FSR/CenterOfPressure/X/Sensor/Value
Device/SubDeviceList/RFoot/FSR/CenterOfPressure/Y/Sensor/Value
3 tactile proximity switches are present on the top of the head of NAO Academics Edition. They can detect a human finger or hand. The LEDs near the sensors are switched on when sensors detect something.
From the 3.3 version of NAO, 3 tactile sensors are also present on each hands, on both side and on the upper part.
Warning
When the battery charger is plugged in, the tactile sensor may be too sensitive during a short period of time.
List of touch value keys:
Device/SubDeviceList/Head/Touch/Front/Sensor/Value
Device/SubDeviceList/Head/Touch/Middle/Sensor/Value
Device/SubDeviceList/Head/Touch/Rear/Sensor/Value
Device/SubDeviceList/LHand/Touch/Back/Sensor/Value
Device/SubDeviceList/LHand/Touch/Left/Sensor/Value
Device/SubDeviceList/LHand/Touch/Right/Sensor/Value
Device/SubDeviceList/RHand/Touch/Back/Sensor/Value
Device/SubDeviceList/RHand/Touch/Left/Sensor/Value
Device/SubDeviceList/RHand/Touch/Right/Sensor/Value
Configurations keys are specific ALMemory entries that describe the hardware of the robot. Theses keys are stored in two separate location:
Note
This is only available for version 3.3 or higher of NAO, and new keys will be created while the robot is updated.
Keys for the head:
Key | Value | Description |
---|---|---|
RobotConfig/Head/BaseVersion | V3Plus | “Base” configuration of the V3+ head. |
V3PlusExtendedHead | Special head with more extension (USB, serial...) and specific design. A laser range finder could be included or not. | |
V3.2 | “Base” configuration of the V3.2 head | |
V3.3 | “Base” configuration of the V3.3 head | |
V4.0 | “Base” configuration of the V4.0 head |
Key | Value | Description |
---|---|---|
RobotConfig/Head/Device/TouchBoard/Version | 0 (or none) | No capacitive sensor |
1 | First version of capacitive sensor. Same for V3.3 version |
Key | Value | Description |
---|---|---|
RobotConfig/Head/Device/FaceBoard/Leds/Rotation | 0 (or none) | Old version (less or equal than 3.2) |
1 | New version (>=3.2), with rotation of LEDs |
Key | Value | Description |
---|---|---|
RobotConfig/Head/Device/LaserRangeFinder/Version | 0 (or none) | No laser range finder |
1 | URG-04LX laser range finder included (only possible with extended head) |
Key | Value | Description |
---|---|---|
RobotConfig/Head/Device/Camera/Version | 0 (or none) | Version anterior or equal to 3.2) |
1 | Version 3.3 with camera up down of 8° and camera down up to 8° | |
2 | Version 3.3 with the angles of the 3.2 | |
3 | Version 4.0 |
Keys for the body:
Key | Value | Description |
---|---|---|
RobotConfig/Body/BaseVersion | V3Plus | “Base” version for the body. |
V3.2 | “Base” version for the body V3.2. | |
V3.3 | “Base” version for the body V3.3. Extended arms has to be tested with key below. | |
V4.0 | “Base” version for the body V4.0 |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Device/Hand/Left/Version | 0 (or none) | No left hand |
1 | V3 academics hand version | |
2 | Hand version V3+/V3.2 | |
3 | Hand version V3.3 with capacitive sensor. | |
4 | Hand version V4.0 with capacitive sensor. |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Device/Hand/Right/Version | 0 (or none) | No right hand |
1 | V3 academics hand version | |
2 | Hand version V3+/V3.2 | |
3 | Hand version V3.3 with capacitive sensor. |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Device/FSR/Calibration/Version | 0 (or none) | No calibration on FSR |
1 | FSR calibrated (version 1 of the calibration process) | |
2 | FSR calibrated (version 2 of the calibration process) |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Device/Joints/Calibration/Version | 2 | Version 2 of the calibration process |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Device/LeftArm/Version | 1 (or none) | Left arm normal version |
-1 | No left arm | |
2 | Extended arms (introduce with 3.3 version, but also available for some 3.2) |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Device/RightArm/Version | 1 (or none) | Right arm normal version |
-1 | No right arm | |
2 2 | Extended arms (introduce with 3.3 version, but also available for some 3.2) |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Device/Legs/Version | 1 (or none) | Legs normal version |
-1 | No legs |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Device/Foot/Version | 1 (or none) | Normal feet |
0 | No feet |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Version | For exemple “3.3.0” | Version of the body of the robot |
Key | Value | Description |
---|---|---|
RobotConfig/Body/Type | NAO | Type of the robot |
Key | Value | Description |
---|---|---|
RobotConfig/Body/SoftwareRequirement | For exemple 1.8.0 | Minimal software version compatible with this hardware |