Update of /cvsroot/playerstage/code/player/server/drivers/mixed/erratic
In directory
sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv762/server/drivers/mixed/erratic
Modified Files:
Tag: release-2-0-patches
Makefile.am erratic.cc erratic.h packet.cc packet.h
robot_params.cc robot_params.h
Added Files:
Tag: release-2-0-patches
motorpacket.cc motorpacket.h
Log Message:
merged various changes from HEAD
Index: erratic.cc
===================================================================
RCS file:
/cvsroot/playerstage/code/player/server/drivers/mixed/erratic/erratic.cc,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** erratic.cc 7 Jun 2006 16:12:50 -0000 1.1.2.2
--- erratic.cc 22 Sep 2006 20:46:43 -0000 1.1.2.3
***************
*** 2,5 ****
--- 2,10 ----
/**
+ * Copyright (C) 2006
+ * Videre Design
+ * Copyright (C) 2000
+ * Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
+ *
* Videre Erratic robot driver for Player
*
***************
*** 20,35 ****
/**
! * This driver is adapted from the p2os driver of player 1.6. Major changes
! * throughout, as well as removed many uneccessary interfaces. In
particular,
! * communication with robot is threaded and fully responsive.
**/
// This must be first per pthread reference
#include <pthread.h>
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
-
#include <fcntl.h>
#include <stdio.h>
--- 25,165 ----
/**
! * This driver is adapted from the p2os driver of player 1.6.
**/
+ /** @ingroup drivers */
+ /** @{ */
+ /** @defgroup driver_erratic erratic
+ * @brief Erratic
+
+ This driver talks to the embedded computer in the Erratic robot, which
+ mediates communication to the devices of the robot.
+
+ @par Compile-time dependencies
+
+ - none
+
+ @par Provides
+
+ The erratic driver provides the following device interfaces, some of
+ them named:
+
+ - "odometry" @ref interface_position2d
+ - This interface returns odometry data, and accepts velocity commands.
+
+ - @ref interface_power
+ - Returns the current battery voltage (12 V when fully charged).
+
+ - @ref interface_aio
+ - Returns data from analog input pins
+
+ - @ref interface_ir
+ - Returns ranges from IR sensors, assuming they're connected to the analog
input pins
+
+ @par Supported configuration requests
+
+ - "odometry" @ref interface_position2d :
+ - PLAYER_POSITION_SET_ODOM_REQ
+ - PLAYER_POSITION_MOTOR_POWER_REQ
+ - PLAYER_POSITION_RESET_ODOM_REQ
+ - PLAYER_POSITION_GET_GEOM_REQ
+ - PLAYER_POSITION_VELOCITY_MODE_REQ
+ - @ref interface_ir :
+ - PLAYER_SONAR_GET_GEOM_REQ
+
+ @par Configuration file options
+
+ - port (string)
+ - Default: "/dev/ttyS0"
+ - direct_wheel_vel_control (integer)
+ - Default: 0
+ - Send direct wheel velocity commands to Erratic (as opposed to sending
+ translational and rotational velocities and letting Erratic smoothly
+ achieve them).
+ - max_trans_vel (length)
+ - Default: 0.5 m/s
+ - Maximum translational velocity
+ - max_rot_vel (angle)
+ - Default: 100 deg/s
+ - Maximum rotational velocity
+ - trans_acc (length)
+ - Default: 0
+ - Maximum translational acceleration, in length/sec/sec; nonnegative.
+ Zero means use the robot's default value.
+ - trans_decel (length)
+ - Default: trans_acc
+ - Maximum translational deceleration, in length/sec/sec; nonpositive.
+ Zero means use the robot's default value.
+ - rot_acc (angle)
+ - Default: 0
+ - Maximum rotational acceleration, in angle/sec/sec; nonnegative.
+ Zero means use the robot's default value.
+ - rot_decel (angle)
+ - Default: rot_acc
+ - Maximum rotational deceleration, in angle/sec/sec; nonpositive.
+ Zero means use the robot's default value.
+ - pid_trans_p (integer)
+ - Default: -1
+ - Translational PID setting; proportional gain.
+ Negative means use the robot's default value.
+ - pid_trans_d (integer)
+ - Default: -1
+ - Translational PID setting; derivative gain.
+ Negative means use the robot's default value.
+ - pid_rot_p (integer)
+ - Default: -1
+ - Rotational PID setting; proportional gain.
+ Negative means use the robot's default value.
+ - pid_rot_d (integer)
+ - Default: -1
+ - Rotational PID setting; derivative gain.
+ Negative means use the robot's default value.
+ - motor_pwm_frequency (integer)
+ - Default: -1
+ - Frequency of motor PWM.
+ Bounds determined by robot.
+ Negative means use the robot's default value.
+ - motor_pwm_max_on (float)
+ - Default: 1
+ - Maximum motor duty cycle.
+ - save_settings_in_robot (integer)
+ - Default: 0
+ - A value of 1 installs current settings as default values in the robot.
+
+
+ @par Example
+
+ @verbatim
+ driver
+ (
+ name "erratic"
+ plugin "erratic"
+
+ provides [ "position2d:0"
+ "power:0"
+ "aio:0"
+ "ir:0" ]
+
+ port "/dev/ttyUSB0"
+
+ max_trans_vel 3
+ max_rot_vel 720
+
+ trans_acc 1
+ rot_acc 200
+
+ direct_wheel_vel_control 0
+ )
+ @endverbatim
+
+ @author Joakim Arfvidsson, Brian Gerkey, Kasper Stoy, James McKenna
+ */
+ /** @} */
+
+
+
// This must be first per pthread reference
#include <pthread.h>
#include <fcntl.h>
#include <stdio.h>
***************
*** 40,43 ****
--- 170,177 ----
#include "erratic.h"
+ #ifdef HAVE_CONFIG_H
+ #include "config.h"
+ #endif
+
bool debug_mode = FALSE;
***************
*** 53,57 ****
table->AddDriver("erratic", Erratic_Init);
}
-
#if 0
extern "C" {
--- 187,190 ----
***************
*** 77,81 ****
this->position_subscriptions = 0;
! this->aio_subscriptions = 0;
// intialise members
--- 210,214 ----
this->position_subscriptions = 0;
! this->aio_ir_subscriptions = 0;
// intialise members
***************
*** 106,109 ****
--- 239,250 ----
}
+ // Do we create an ir interface?
+ if(cf->ReadDeviceAddr(&(this->ir_id), section, "provides",
PLAYER_IR_CODE, -1, NULL) == 0) {
+ if(this->AddInterface(this->ir_id) != 0) {
+ this->SetError(-1);
+ return;
+ }
+ }
+
// build the table of robot parameters.
initialize_robot_params();
***************
*** 328,333 ****
param_idx = 0;
! // Create a packet and set initial odometry position (the SIP is
persistent)
! this->motor_packet = new erSIP(param_idx);
this->motor_packet->x_offset = 0;
this->motor_packet->y_offset = 0;
--- 469,474 ----
param_idx = 0;
! // Create a packet and set initial odometry position (the
ErraticMotorPacket is persistent)
! this->motor_packet = new ErraticMotorPacket(param_idx);
this->motor_packet->x_offset = 0;
this->motor_packet->y_offset = 0;
***************
*** 580,584 ****
if(Device::MatchDeviceAddress(id, this->aio_id))
! this->aio_subscriptions++;
}
--- 721,728 ----
if(Device::MatchDeviceAddress(id, this->aio_id))
! this->aio_ir_subscriptions++;
!
! if(Device::MatchDeviceAddress(id, this->ir_id))
! this->aio_ir_subscriptions++;
}
***************
*** 599,603 ****
if(Device::MatchDeviceAddress(id, this->aio_id))
! this->aio_subscriptions--;
}
--- 743,750 ----
if(Device::MatchDeviceAddress(id, this->aio_id))
! this->aio_ir_subscriptions--;
!
! if(Device::MatchDeviceAddress(id, this->ir_id))
! this->aio_ir_subscriptions--;
}
***************
*** 621,625 ****
while ((error_code = packet.Receive(this->read_fd, 5000))) {
waited += 5;
! printf("Lost serial communication with Erratic - no
data received for %i seconds\n", waited);
}
--- 768,772 ----
while ((error_code = packet.Receive(this->read_fd, 5000))) {
waited += 5;
! printf("Lost serial communication with Erratic (%d) -
no data received for %i seconds\n", error_code, waited);
}
***************
*** 650,659 ****
break;
case (reply_e)ain:
erratic_data.aio.voltages_count =
packet.packet[4];
for (unsigned int i_voltage = 0; i_voltage <
erratic_data.aio.voltages_count ;i_voltage++) {
erratic_data.aio.voltages[i_voltage] =
(packet.packet[5+i_voltage*2]
! +
256*packet.packet[6+i_voltage*2]) * (1.0 / 1024.0);
}
PublishAIn();
break;
case (reply_e)debug:
--- 797,813 ----
break;
case (reply_e)ain:
+ // This data goes in two places, analog input
and ir rangers
erratic_data.aio.voltages_count =
packet.packet[4];
+ erratic_data.ir.voltages_count =
RobotParams[this->param_idx]->NumIR;
+ erratic_data.ir.ranges_count = 2;
for (unsigned int i_voltage = 0; i_voltage <
erratic_data.aio.voltages_count ;i_voltage++) {
erratic_data.aio.voltages[i_voltage] =
(packet.packet[5+i_voltage*2]
! +
256*packet.packet[6+i_voltage*2]) * (1.0 / 1024.0) * CPU_VOLTAGE;
! erratic_data.ir.voltages[i_voltage] =
(packet.packet[5+i_voltage*2]
! +
256*packet.packet[6+i_voltage*2]) * (1.0 / 1024.0) * CPU_VOLTAGE;
! erratic_data.ir.ranges[i_voltage] =
IRRangeFromVoltage(erratic_data.ir.voltages[i_voltage]);
}
PublishAIn();
+ PublishIR();
break;
case (reply_e)debug:
***************
*** 703,707 ****
if (packet) {
if (print_all_packets) {
! printf("Just about to send:\n");
packet->Print();
}
--- 857,861 ----
if (packet) {
if (print_all_packets) {
! printf("Just about to send: ");
packet->Print();
}
***************
*** 768,772 ****
ErraticPacket *packet = new ErraticPacket();
! command[0] = (command_e)ain;
command[1] = (argtype_e)argint;
command[2] = val ? 1 : 0;
--- 922,926 ----
ErraticPacket *packet = new ErraticPacket();
! command[0] = (command_e)set_analog;
command[1] = (argtype_e)argint;
command[2] = val ? 1 : 0;
***************
*** 777,780 ****
--- 931,939 ----
}
+ // This describes the IR hardware
+ float Erratic::IRRangeFromVoltage(float voltage) {
+ // This is values for the Sharp 2Y0A02, 150 cm ranger
+ return -.2475 + .1756 * voltage + .7455 / voltage - .0446 * voltage *
voltage;
+ }
***************
*** 784,788 ****
void Erratic::Main() {
int last_position_subscrcount=0;
! int last_aio_subscriptions=0;
for(;;)
--- 943,947 ----
void Erratic::Main() {
int last_position_subscrcount=0;
! int last_aio_ir_subscriptions=0;
for(;;)
***************
*** 810,821 ****
last_position_subscrcount = this->position_subscriptions;
// We'll ask the robot to enable analog packets if we just got
our
// first subscriber
! if(!last_aio_subscriptions && this->aio_subscriptions)
this->ToggleAIn(1);
! else if(last_aio_subscriptions && !(this->aio_subscriptions))
this->ToggleAIn(0);
! last_aio_subscriptions = this->aio_subscriptions;
!
--- 969,980 ----
last_position_subscrcount = this->position_subscriptions;
+
// We'll ask the robot to enable analog packets if we just got
our
// first subscriber
! if(!last_aio_ir_subscriptions && this->aio_ir_subscriptions)
this->ToggleAIn(1);
! else if(last_aio_ir_subscriptions &&
!(this->aio_ir_subscriptions))
this->ToggleAIn(0);
! last_aio_ir_subscriptions = this->aio_ir_subscriptions;
***************
*** 867,898 ****
NULL);
}
!
! // This publishes all data we have (this is dumb)
! void Erratic::PublishAllData() {
! // TODO: something smarter about timestamping.
!
! // put odometry data
! this->Publish(this->position_id, NULL,
! PLAYER_MSGTYPE_DATA,
! PLAYER_POSITION2D_DATA_STATE,
! (void*)&(this->erratic_data.position),
! sizeof(player_position2d_data_t),
! NULL);
!
! // put power data
! this->Publish(this->power_id, NULL,
PLAYER_MSGTYPE_DATA,
! PLAYER_POWER_DATA_STATE,
! (void*)&(this->erratic_data.power),
! sizeof(player_power_data_t),
NULL);
!
! // put aio data
! this->Publish(this->aio_id, NULL,
! PLAYER_MSGTYPE_DATA,
! PLAYER_AIO_DATA_STATE,
! (void*)&(this->erratic_data.aio),
! sizeof(player_aio_data_t),
! NULL);
}
--- 1026,1042 ----
NULL);
}
! void Erratic::PublishIR() {
! this->Publish(this->ir_id, NULL,
PLAYER_MSGTYPE_DATA,
! PLAYER_IR_DATA_RANGES,
! (void*)&(this->erratic_data.ir),
! sizeof(player_ir_data_t),
NULL);
! }
! void Erratic::PublishAllData() {
! this->PublishPosition2D();
! this->PublishPower();
! this->PublishAIn();
! this->PublishIR();
}
***************
*** 913,918 ****
// check for position config requests
if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_SET_ODOM,
! this->position_id))
{
if(hdr->size != sizeof(player_position2d_set_odom_req_t))
--- 1057,1062 ----
// check for position config requests
if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_SET_ODOM,
! this->position_id))
{
if(hdr->size != sizeof(player_position2d_set_odom_req_t))
***************
*** 924,948 ****
(player_position2d_set_odom_req_t*)data;
! this->motor_packet->x_offset =
((int)rint(set_odom_req->pose.px*1e3)) -
! this->motor_packet->xpos;
! this->motor_packet->y_offset =
((int)rint(set_odom_req->pose.py*1e3)) -
! this->motor_packet->ypos;
! this->motor_packet->angle_offset =
((int)rint(RTOD(set_odom_req->pose.pa))) -
! this->motor_packet->angle;
this->Publish(this->position_id, resp_queue,
! PLAYER_MSGTYPE_RESP_ACK,
PLAYER_POSITION2D_REQ_SET_ODOM);
return(0);
}
else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_MOTOR_POWER,
! this->position_id))
! {
! /* motor state change request
! * 1 = enable motors
! * 0 = disable motors (default)
! */
! if(hdr->size !=
sizeof(player_position2d_power_config_t))
! {
PLAYER_WARN("Arg to motor state change request wrong
size; ignoring");
return(-1);
--- 1068,1086 ----
(player_position2d_set_odom_req_t*)data;
! this->motor_packet->x_offset =
((int)rint(set_odom_req->pose.px*1e3))
! - this->motor_packet->xpos;
! this->motor_packet->y_offset =
((int)rint(set_odom_req->pose.py*1e3))
! - this->motor_packet->ypos;
! this->motor_packet->angle_offset =
((int)rint(RTOD(set_odom_req->pose.pa)))
! - this->motor_packet->angle;
this->Publish(this->position_id, resp_queue,
! PLAYER_MSGTYPE_RESP_ACK,
PLAYER_POSITION2D_REQ_SET_ODOM);
return(0);
}
else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_MOTOR_POWER,
! this->position_id)) {
! if(hdr->size != sizeof(player_position2d_power_config_t)) {
PLAYER_WARN("Arg to motor state change request wrong
size; ignoring");
return(-1);
***************
*** 953,969 ****
this->Publish(this->position_id, resp_queue,
! PLAYER_MSGTYPE_RESP_ACK,
PLAYER_POSITION2D_REQ_MOTOR_POWER);
return(0);
! }
! else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_RESET_ODOM,
! this->position_id))
! {
! /* reset position to 0,0,0: no args */
! if(hdr->size != 0)
! {
PLAYER_WARN("Arg to reset position request is wrong
size; ignoring");
return(-1);
}
ResetRawPositions();
--- 1091,1105 ----
this->Publish(this->position_id, resp_queue,
! PLAYER_MSGTYPE_RESP_ACK,
! PLAYER_POSITION2D_REQ_MOTOR_POWER);
return(0);
! } else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_RESET_ODOM,
! this->position_id)) {
! if(hdr->size != 0) {
PLAYER_WARN("Arg to reset position request is wrong
size; ignoring");
return(-1);
}
+
ResetRawPositions();
***************
*** 973,1010 ****
}
else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_GET_GEOM,
! this->position_id))
! {
/* Return the robot geometry. */
! if(hdr->size != 0)
! {
PLAYER_WARN("Arg get robot geom is wrong size;
ignoring");
return(-1);
}
player_position2d_geom_t geom;
! // TODO: Figure out this rotation offset somehow; it's not
! // given in the Saphira parameters. For now, -0.1 is
! // about right for a Pioneer 2DX.
! geom.pose.px = -0.1;
geom.pose.py = 0.0;
geom.pose.pa = 0.0;
! // get dimensions from the parameter table
geom.size.sl = RobotParams[param_idx]->RobotLength / 1e3;
geom.size.sw = RobotParams[param_idx]->RobotWidth / 1e3;
this->Publish(this->position_id, resp_queue,
! PLAYER_MSGTYPE_RESP_ACK,
! PLAYER_POSITION2D_REQ_GET_GEOM,
! (void*)&geom, sizeof(geom), NULL);
return(0);
}
else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_VELOCITY_MODE,
! this->position_id))
! {
/* velocity control mode:
! * 0 = direct wheel velocity control (default)
! * 1 = separate translational and rotational control
! */
if(hdr->size !=
sizeof(player_position2d_velocity_mode_config_t))
{
--- 1109,1141 ----
}
else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_GET_GEOM,
! this->position_id)) {
/* Return the robot geometry. */
! if(hdr->size != 0) {
PLAYER_WARN("Arg get robot geom is wrong size;
ignoring");
return(-1);
}
player_position2d_geom_t geom;
!
! geom.pose.px = -RobotParams[param_idx]->RobotAxleOffset / 1e3;
geom.pose.py = 0.0;
geom.pose.pa = 0.0;
!
geom.size.sl = RobotParams[param_idx]->RobotLength / 1e3;
geom.size.sw = RobotParams[param_idx]->RobotWidth / 1e3;
this->Publish(this->position_id, resp_queue,
! PLAYER_MSGTYPE_RESP_ACK,
! PLAYER_POSITION2D_REQ_GET_GEOM,
! (void*)&geom, sizeof(geom), NULL);
return(0);
}
else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_POSITION2D_REQ_VELOCITY_MODE,
! this->position_id)) {
/* velocity control mode:
! * 0 = direct wheel velocity control
! * 1 = separate translational and rotational control
! */
if(hdr->size !=
sizeof(player_position2d_velocity_mode_config_t))
{
***************
*** 1022,1026 ****
this->Publish(this->position_id, resp_queue,
! PLAYER_MSGTYPE_RESP_ACK,
PLAYER_POSITION2D_REQ_VELOCITY_MODE);
return(0);
}
--- 1153,1174 ----
this->Publish(this->position_id, resp_queue,
! PLAYER_MSGTYPE_RESP_ACK,
! PLAYER_POSITION2D_REQ_VELOCITY_MODE);
! return(0);
! }
!
! // Request for getting IR locations
! else if(Message::MatchMessage(hdr,PLAYER_MSGTYPE_REQ,
! PLAYER_IR_POSE,
! this->ir_id)) {
! player_ir_pose_t pose;
! pose.poses_count = RobotParams[param_idx]->NumIR;
! for (uint16_t i = 0; i < pose.poses_count ;i++)
! pose.poses[i] = RobotParams[param_idx]->IRPose[i];
!
! this->Publish(this->ir_id, resp_queue,
! PLAYER_MSGTYPE_RESP_ACK,
! PLAYER_IR_POSE,
! (void*)&pose, sizeof(pose), NULL);
return(0);
}
Index: erratic.h
===================================================================
RCS file:
/cvsroot/playerstage/code/player/server/drivers/mixed/erratic/erratic.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** erratic.h 7 Jun 2006 16:12:50 -0000 1.1.2.2
--- erratic.h 22 Sep 2006 20:46:43 -0000 1.1.2.3
***************
*** 2,7 ****
/**
! * Erratic Erratic robot driver for Player
! *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
--- 2,12 ----
/**
! * Copyright (C) 2006
! * Videre Design
! * Copyright (C) 2000
! * Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
! *
! * Videre Erratic robot driver for Player
! *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
***************
*** 19,25 ****
**/
! #ifndef _P2OSDEVICE_H
! #define _P2OSDEVICE_H
#include <pthread.h>
--- 24,37 ----
**/
! #ifndef _ERRATICDEVICE_H
! #define _ERRATICDEVICE_H
+ #ifndef ERRATIC_VERSION
+ #define ERRATIC_VERSION "1.0b"
+ #endif
+
+ #ifndef ERRATIC_DATE
+ #define ERRATIC_DATE "2006-05-07"
+ #endif
#include <pthread.h>
***************
*** 35,41 ****
#include <stdint.h>
! // Version
! #define ERRATIC_VERSION "1.0b"
! #define ERRATIC_DATE "2006-05-07"
// Default max speeds
--- 47,51 ----
#include <stdint.h>
! #define CPU_VOLTAGE 3.5
// Default max speeds
***************
*** 105,116 ****
player_power_data_t power;
player_aio_data_t aio;
} __attribute__ ((packed)) player_erratic_data_t;
// this is here because we need the above typedef's before including it.
! #include "sip.h"
extern bool debug_mode;
! class erSIP;
class Erratic : public Driver
--- 115,127 ----
player_power_data_t power;
player_aio_data_t aio;
+ player_ir_data ir;
} __attribute__ ((packed)) player_erratic_data_t;
// this is here because we need the above typedef's before including it.
! #include "motorpacket.h"
extern bool debug_mode;
! class ErraticMotorPacket;
class Erratic : public Driver
***************
*** 122,131 ****
player_devaddr_t power_id;
player_devaddr_t aio_id;
int position_subscriptions;
! int aio_subscriptions;
! //erSIP* sippacket;
! erSIP *motor_packet;
pthread_mutex_t motor_packet_mutex;
--- 133,143 ----
player_devaddr_t power_id;
player_devaddr_t aio_id;
+ player_devaddr_t ir_id;
int position_subscriptions;
! int aio_ir_subscriptions;
! //ErraticMotorPacket* sippacket;
! ErraticMotorPacket *motor_packet;
pthread_mutex_t motor_packet_mutex;
***************
*** 133,138 ****
int Disconnect();
-
- int SendReceiveOLD(ErraticPacket* pkt, bool publish_data=true);
void ResetRawPositions();
void ToggleMotorPower(unsigned char val);
--- 145,148 ----
***************
*** 148,151 ****
--- 158,164 ----
void PublishPower();
void PublishAIn();
+ void PublishIR();
+
+ float IRRangeFromVoltage(float voltage);
void StartThreads();
***************
*** 158,166 ****
static void *ReceiveThreadDummy(void *driver);
- int direct_wheel_vel_control; // false -> separate trans and rot vel
-
int read_fd, write_fd;
const char* psos_serial_port;
- struct timeval lastblob_tv;
player_position2d_cmd_vel_t last_position_cmd;
--- 171,176 ----
***************
*** 175,178 ****
--- 185,190 ----
// Parameters
+ bool direct_wheel_vel_control;
+
bool print_all_packets;
bool print_status_summary;
Index: packet.h
===================================================================
RCS file:
/cvsroot/playerstage/code/player/server/drivers/mixed/erratic/packet.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** packet.h 7 Jun 2006 16:12:50 -0000 1.1.2.2
--- packet.h 22 Sep 2006 20:46:43 -0000 1.1.2.3
***************
*** 1,24 ****
! /*
! * Copyright (C) 2006
! * Videre Design
! * Copyright (C) 2000
! * Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
! *
! *
! * This program is free software; you can redistribute it and/or modify
! * it under the terms of the GNU General Public License as published by
! * the Free Software Foundation; either version 2 of the License, or
! * (at your option) any later version.
! *
! * This program is distributed in the hope that it will be useful,
! * but WITHOUT ANY WARRANTY; without even the implied warranty of
! * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! * GNU General Public License for more details.
! *
! * You should have received a copy of the GNU General Public License
! * along with this program; if not, write to the Free Software
! * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! *
! */
#ifndef _PACKET_H
--- 1,25 ----
! /**
! * Copyright (C) 2006
! * Videre Design
! * Copyright (C) 2000
! * Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
! *
! * Videre Erratic robot driver for Player
! *
! * This program is free software; you can redistribute it and/or modify
! * it under the terms of the GNU General Public License as published by
! * the Free Software Foundation; either version 2 of the License, or
! * (at your option) any later version.
! *
! * This program is distributed in the hope that it will be useful,
! * but WITHOUT ANY WARRANTY; without even the implied warranty of
! * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! * GNU General Public License for more details.
! *
! * You should have received a copy of the GNU General Public License
! * along with this program; if not, write to the Free Software
! * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
! *
! **/
#ifndef _PACKET_H
--- NEW FILE: motorpacket.h ---
/*
* Player - One Hell of a Robot Server
* Copyright (C) 2000
* Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
/*
* $Id: motorpacket.h,v 1.1.2.1 2006/09/22 20:46:43 gerkey Exp $
*
* part of the P2OS parser. methods for filling and parsing server
* information packets (ErraticMotorPackets)
*/
#ifndef _ErraticMotorPacket_H
#define _ErraticMotorPacket_H
#include <limits.h>
#include "erratic.h"
class ErraticMotorPacket
{
private:
int PositionChange( unsigned short, unsigned short );
int param_idx; // index of our robot's data in the parameter table
public:
// these values are returned in every standard ErraticMotorPacket
bool lwstall, rwstall;
unsigned char status, battery;
unsigned short ptu, timer, rawxpos;
unsigned short rawypos;
short angle, lvel, rvel, control;
int xpos, ypos;
int x_offset,y_offset,angle_offset;
bool Parse( unsigned char *buffer, int length );
void Print();
void Fill(player_erratic_data_t* data);
ErraticMotorPacket(int idx)
{
param_idx = idx;
xpos = INT_MAX;
ypos = INT_MAX;
}
};
#endif
Index: packet.cc
===================================================================
RCS file:
/cvsroot/playerstage/code/player/server/drivers/mixed/erratic/packet.cc,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** packet.cc 7 Jun 2006 16:12:50 -0000 1.1.2.2
--- packet.cc 22 Sep 2006 20:46:43 -0000 1.1.2.3
***************
*** 2,9 ****
/**
! * Player - One Hell of a Robot Server
* Copyright (C) 2000
* Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
! *
*
* This program is free software; you can redistribute it and/or modify
--- 2,11 ----
/**
! * Copyright (C) 2006
! * Videre Design
* Copyright (C) 2000
* Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
! *
! * Videre Erratic robot driver for Player
*
* This program is free software; you can redistribute it and/or modify
***************
*** 28,31 ****
--- 30,35 ----
#include "packet.h"
#include <unistd.h>
+ #include <sys/select.h>
+ #include <sys/time.h>
#include <stdlib.h> /* for exit() */
//#include <sys/poll.h>
***************
*** 59,63 ****
if ( chksum == received_chksum )
! return(true);
if (debug_mode) {
--- 63,74 ----
if ( chksum == received_chksum )
! {
! if (debug_mode)
! {
! printf("Good packet: ");
! PrintHex();
! }
! return(true);
! }
if (debug_mode) {
***************
*** 90,100 ****
uint16_t cnt;
memset(packet,0,sizeof(packet));
struct pollfd readpoll;
! readpoll.fd = fd; readpoll.events = POLLIN | POLLERR | POLLHUP |
POLLNVAL; readpoll.revents = 0;
// This block will terminate or move on when there is data to read
if (wait) {
while (1) {
int8_t stuff = poll(&readpoll, 1, wait);
--- 101,144 ----
uint16_t cnt;
+ if (debug_mode)
+ printf("Check for packets in Receive()\n");
+
memset(packet,0,sizeof(packet));
struct pollfd readpoll;
! readpoll.fd = fd;
! readpoll.events = POLLIN | POLLPRI;
! readpoll.revents = 0;
+ fd_set read_set, error_set;
+ struct timeval tv;
+ #ifdef USE_SELECT
+ FD_ZERO(&read_set);
+ FD_ZERO(&error_set);
+ FD_SET(fd, &read_set);
+ FD_SET(fd, &error_set);
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ if (wait >= 1000)
+ tv.tv_sec = wait/1000;
+ else
+ tv.tv_usec = wait*1000;
+ #endif
+
// This block will terminate or move on when there is data to read
if (wait) {
while (1) {
+ #ifdef USE_SELECT
+ int ret = select(fd+1, &read_set, 0, &error_set, &tv);
+ if (ret)
+ {
+ if (debug_mode)
+ printf("Data waiting\n");
+ break;
+ }
+ else
+ if (debug_mode)
+ printf("No data\n");
+ #endif
+
int8_t stuff = poll(&readpoll, 1, wait);
***************
*** 126,133 ****
// Once we've started receiving a packet, we have a
tight timeout
while( cnt!=1 ) {
if (wait) {
while (1) {
! int8_t stuff = poll(&readpoll,
1, 3);
if (stuff < 0) {
--- 170,192 ----
// Once we've started receiving a packet, we have a
tight timeout
+ // Trouble with FTDI USB interface: needs longer timeout
while( cnt!=1 ) {
if (wait) {
while (1) {
!
! #ifdef USE_SELECT
! FD_ZERO(&read_set);
! FD_ZERO(&error_set);
! FD_SET(fd, &read_set);
! FD_SET(fd, &error_set);
! tv.tv_sec = 0;
! tv.tv_usec = 100*1000; // in
usec's
!
! int ret = select(fd+1,
&read_set, 0, &error_set, &tv);
! if (ret)
! break;
! #endif
!
! int8_t stuff = poll(&readpoll,
1, 100);
if (stuff < 0) {
***************
*** 152,155 ****
--- 211,216 ----
int newcnt = read( fd, &prefix[2], 1 );
+ if (debug_mode)
+ printf("Read %d byte: %02x\n", newcnt,
prefix[2]);
if (newcnt < 0 && errno == EAGAIN)
***************
*** 181,185 ****
if (wait) {
while (1) {
! int8_t stuff = poll(&readpoll, 1, 3);
if (stuff < 0) {
--- 242,259 ----
if (wait) {
while (1) {
! #ifdef USE_SELECT
! FD_ZERO(&read_set);
! FD_ZERO(&error_set);
! FD_SET(fd, &read_set);
! FD_SET(fd, &error_set);
! tv.tv_sec = 0;
! tv.tv_usec = 100*1000;
// in usec's
!
! int ret = select(fd+1, &read_set, 0,
&error_set, &tv);
! if (ret)
! break;
! #endif
!
! int8_t stuff = poll(&readpoll, 1, 100);
if (stuff < 0) {
***************
*** 203,206 ****
--- 277,290 ----
int newcnt = read( fd, &packet[3+cnt], prefix[2]-cnt );
+ if (debug_mode)
+ {
+ printf("Read %d bytes packet\n",
newcnt);
+ if (newcnt > 0)
+ {
+ for (int i=0; i<newcnt;
i++)
+ printf("%02x ",
packet[3+i]);
+ printf("\n");
+ }
+ }
if (newcnt < 0 && errno == EAGAIN)
--- NEW FILE: motorpacket.cc ---
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:1; -*-
/**
* Videre Erratic robot driver for Player
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
*
**/
#include <stdio.h>
#include <limits.h>
#include <math.h> /* rint(3) */
#include <sys/types.h>
#include <netinet/in.h>
#include "motorpacket.h"
#include <stdlib.h> /* for abs() */
#include <unistd.h>
int ErraticMotorPacket::PositionChange( unsigned short from, unsigned short to
)
{
int diff1, diff2;
/* find difference in two directions and pick shortest */
if ( to > from ) {
diff1 = to - from;
diff2 = - ( from + 4096 - to );
}
else {
diff1 = to - from;
diff2 = 4096 - from + to;
}
if ( abs(diff1) < abs(diff2) )
return(diff1);
else
return(diff2);
}
void ErraticMotorPacket::Print()
{
printf("lwstall:%d rwstall:%d\n", lwstall, rwstall);
printf("status: 0x%x", status);
printf("battery: %d\n", battery);
printf("xpos: %d ypos:%d ptu:%hu timer:%hu\n", xpos, ypos, ptu, timer);
printf("angle: %d lvel: %d rvel: %d control: %d\n", angle, lvel, rvel,
control);
}
// Parses and absorbs a standard packet from the robot
bool ErraticMotorPacket::Parse( unsigned char *buffer, int length )
{
int cnt = 0, change;
unsigned short newxpos, newypos;
// Check type and length
if (length < 20) return false;
status = buffer[cnt];
cnt += sizeof(unsigned char);
// This driver does its own integration, and only cares for the lower bits of
the odometry updates
// Integers from robot are little-endian
newxpos = buffer[cnt] + 0x100*(buffer[cnt+1]&0x0F);
if (xpos!=INT_MAX) {
change = (int) rint(PositionChange( rawxpos, newxpos ) *
RobotParams[param_idx]->DistConvFactor);
//printf("xchange: %i ", change);
if (abs(change)>100)
;//PLAYER_WARN1("invalid odometry change [%d]; odometry values are
tainted", change);
else
xpos += change;
}
else {
//printf("xpos was INT_MAX\n");
xpos = 0;
}
rawxpos = newxpos;
cnt += 3;
newypos = buffer[cnt] + 0x100*(buffer[cnt+1]&0x0F);
if (ypos!=INT_MAX) {
change = (int) rint(PositionChange( rawypos, newypos ) *
RobotParams[param_idx]->DistConvFactor);
if (abs(change)>100)
;//PLAYER_WARN1("invalid odometry change [%d]; odometry values are
tainted", change);
else
ypos += change;
}
else
ypos = 0;
rawypos = newypos;
cnt += 3;
//if (debug_mode)
// printf("Just parsed, new xpos: %i ypos: %i\n", xpos, ypos);
angle = (short)
rint(((short)(buffer[cnt] | (buffer[cnt+1] << 8))) *
M_PI/2048.0 * 180.0/M_PI);
cnt += sizeof(short);
lvel = (short)
rint(((short)(buffer[cnt] | (buffer[cnt+1] << 8))) *
RobotParams[param_idx]->VelConvFactor);
cnt += sizeof(short);
rvel = (short)
rint(((short)(buffer[cnt] | (buffer[cnt+1] << 8))) *
RobotParams[param_idx]->VelConvFactor);
cnt += sizeof(short);
battery = buffer[cnt];
cnt += sizeof(unsigned char);
lwstall = buffer[cnt] & 0x01;
cnt += sizeof(unsigned char);
rwstall = buffer[cnt] & 0x01;
cnt += sizeof(unsigned char);
control = (short)
rint(((short)(buffer[cnt] | (buffer[cnt+1] << 8))) *
RobotParams[param_idx]->AngleConvFactor);
cnt += sizeof(short);
return true;
}
// Spits out information that was previously parsed
void ErraticMotorPacket::Fill(player_erratic_data_t* data)
{
// Odometry data
{
// initialize position to current offset
data->position.pos.px = this->x_offset / 1e3;
data->position.pos.py = this->y_offset / 1e3;
// now transform current position by rotation if there is one
// and add to offset
if(this->angle_offset != 0)
{
double rot = DTOR(this->angle_offset); // convert
rotation to radians
data->position.pos.px += ((this->xpos/1e3) * cos(rot)
-
(this->ypos/1e3) * sin(rot));
data->position.pos.py += ((this->xpos/1e3) * sin(rot)
+
(this->ypos/1e3) * cos(rot));
data->position.pos.pa = DTOR(this->angle_offset +
angle);
}
else
{
data->position.pos.px += this->xpos / 1e3;
data->position.pos.py += this->ypos / 1e3;
data->position.pos.pa = DTOR(this->angle);
}
data->position.vel.px = (((this->lvel) + (this->rvel) ) / 2) /
1e3;
data->position.vel.py = 0.0;
data->position.vel.pa = (0.596*(double)(this->rvel -
this->lvel) /
(2.0/RobotParams[param_idx]->DiffConvFactor));
data->position.stall = (unsigned char)(this->lwstall ||
this->rwstall);
}
// Battery data
{
data->power.valid = PLAYER_POWER_MASK_VOLTS |
PLAYER_POWER_MASK_PERCENT;
data->power.volts = this->battery / 1e1;
data->power.percent = 1e2 * (data->power.volts /
VIDERE_NOMINAL_VOLTAGE);
}
}
Index: robot_params.cc
===================================================================
RCS file:
/cvsroot/playerstage/code/player/server/drivers/mixed/erratic/robot_params.cc,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** robot_params.cc 7 Jun 2006 16:12:50 -0000 1.1.2.2
--- robot_params.cc 22 Sep 2006 20:46:43 -0000 1.1.2.3
***************
*** 27,85 ****
RobotParams_t erratic_params =
{
! 0.001534,
! "Videre",
! 0.011,
! 0.780, //This is the empirically correct value, but doesn't match wheel
size calculation
! 0,
! 1.626,
! 1,
! 1,
! 0,
! 0,
! 0,
! "",
! "",
! 0,
! 1,
! 0,
! 0,
! 0,
! 300,
! 1000,
! 0,
! 5,
! 5,
! 1,
! 0,
! 0,
! 0,
! 120,
! 330,
! 180,
! 279,
! 0,
! 0,
! 0,
! 1,
! 1,
! 8,
! "erratic",
! 38400,
! 0,
! 0,
! 0,
! 0,
! 20,
! 1.20482,
! {
! { 73, 105, 90 },
! { 130, 78, 41 },
! { 154, 30, 15 },
! { 154, -30, -15 },
! { 130, -78, -41 },
! { 73, -105, -90 },
! { -146, -60, -145 },
! { -146, 60, 145 },
! }
};
--- 27,91 ----
RobotParams_t erratic_params =
{
! 0.001534,
! "Videre",
! 0.011,
! 0.780, //This is the empirically correct value, but doesn't match wheel
size calculation
! 0,
! 1.626,
! 1,
! 1,
! 0,
! 0,
! 0,
! "",
! "",
! 0,
! 1,
! 0,
! 0,
! 0,
! 300,
! 1000,
! 0,
! 5,
! 5,
! 1,
! 0,
! 0,
! 0,
! 120,
! 392, // length
! 180,
! 415, // width
! 61, // axle distance to center of robot (positive forward)
! 0,
! 0,
! 0,
! 1,
! 1,
! 8,
! "erratic",
! 38400,
! 0,
! 0,
! 0,
! 0,
! 20,
! 1.20482,
! {
! { 73, 105, 90 },
! { 130, 78, 41 },
! { 154, 30, 15 },
! { 154, -30, -15 },
! { 130, -78, -41 },
! { 73, -105, -90 },
! { -146, -60, -145 },
! { -146, 60, 145 },
! },
! 2,
! {
! {0.1, 0.1, 0},
! {0.1, -0.1, 0},
! }
};
Index: robot_params.h
===================================================================
RCS file:
/cvsroot/playerstage/code/player/server/drivers/mixed/erratic/robot_params.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -C2 -d -r1.1.2.2 -r1.1.2.3
*** robot_params.h 7 Jun 2006 16:12:51 -0000 1.1.2.2
--- robot_params.h 22 Sep 2006 20:46:43 -0000 1.1.2.3
***************
*** 1,27 ****
! /*
! * Player - One Hell of a Robot Server
! * Copyright (C) 2000
! * Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
! *
! *
! * This program is free software; you can redistribute it and/or modify
! * it under the terms of the GNU General Public License as published by
! * the Free Software Foundation; either version 2 of the License, or
! * (at your option) any later version.
! *
! * This program is distributed in the hope that it will be useful,
! * but WITHOUT ANY WARRANTY; without even the implied warranty of
! * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! * GNU General Public License for more details.
! *
! * You should have received a copy of the GNU General Public License
! * along with this program; if not, write to the Free Software
! * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! *
! */
#ifndef _ROBOT_PARAMS_H
#define _ROBOT_PARAMS_H
void initialize_robot_params(void);
--- 1,30 ----
! /**
! * Videre Erratic robot driver for Player
! *
! * Copyright (C) 2006
! * Videre Design
! * Copyright (C) 2000
! * Brian Gerkey, Kasper Stoy, Richard Vaughan, & Andrew Howard
! *
! * This program is free software; you can redistribute it and/or modify
! * it under the terms of the GNU General Public License as published by
! * the Free Software Foundation; either version 2 of the License, or
! * (at your option) any later version.
! *
! * This program is distributed in the hope that it will be useful,
! * but WITHOUT ANY WARRANTY; without even the implied warranty of
! * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! * GNU General Public License for more details.
! *
! * You should have received a copy of the GNU General Public License
! * along with this program; if not, write to the Free Software
! * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! *
! **/
#ifndef _ROBOT_PARAMS_H
#define _ROBOT_PARAMS_H
+ #include "libplayercore/player.h"
void initialize_robot_params(void);
***************
*** 71,74 ****
--- 74,78 ----
int RobotRadius; //
int RobotWidth; //
+ int RobotAxleOffset; //
int RotAccel; //
int RotDecel; //
***************
*** 86,89 ****
--- 90,95 ----
double VelConvFactor; //
sonar_pose_t sonar_pose[32];
+ int NumIR;
+ player_pose_t IRPose[8];
} RobotParams_t;
Index: Makefile.am
===================================================================
RCS file:
/cvsroot/playerstage/code/player/server/drivers/mixed/erratic/Makefile.am,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -C2 -d -r1.1.2.3 -r1.1.2.4
*** Makefile.am 7 Jun 2006 19:03:50 -0000 1.1.2.3
--- Makefile.am 22 Sep 2006 20:46:43 -0000 1.1.2.4
***************
*** 7,10 ****
--- 7,11 ----
liberratic_la_SOURCES = erratic.cc erratic.h \
+ motorpacket.h motorpacket.cc \
packet.h packet.cc \
robot_params.cc robot_params.h \
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit