This program is porting rosserial_arduino for mbed http://www.ros.org/wiki/rosserial_arduino This program supported the revision of 169 of rosserial. This program contains an example.

Dependencies:   rosserial_mbed_lib mbed Servo

Committer:
nucho
Date:
Wed Feb 29 23:02:12 2012 +0000
Revision:
4:2cbca0ac2569
Parent:
0:06fc856e99ca

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nucho 0:06fc856e99ca 1 //#define COMPILE_IRRANGER_CODE_ROSSERIAL
nucho 0:06fc856e99ca 2 #ifdef COMPILE_IRRANGER_CODE_ROSSERIAL
nucho 0:06fc856e99ca 3
nucho 0:06fc856e99ca 4 /*
nucho 0:06fc856e99ca 5 * rosserial IR Ranger Example
nucho 0:06fc856e99ca 6 *
nucho 0:06fc856e99ca 7 * This example is calibrated for the Sharp GP2D120XJ00F.
nucho 0:06fc856e99ca 8 */
nucho 0:06fc856e99ca 9
nucho 0:06fc856e99ca 10 #include <ros.h>
nucho 0:06fc856e99ca 11 #include <ros/time.h>
nucho 0:06fc856e99ca 12 #include <sensor_msgs/Range.h>
nucho 0:06fc856e99ca 13
nucho 0:06fc856e99ca 14 ros::NodeHandle nh;
nucho 0:06fc856e99ca 15
nucho 0:06fc856e99ca 16
nucho 0:06fc856e99ca 17 sensor_msgs::Range range_msg;
nucho 0:06fc856e99ca 18 ros::Publisher pub_range( "range_data", &range_msg);
nucho 0:06fc856e99ca 19
nucho 0:06fc856e99ca 20 PinName analog_pin = p20;
nucho 0:06fc856e99ca 21 unsigned long range_timer;
nucho 0:06fc856e99ca 22
nucho 0:06fc856e99ca 23 /*
nucho 0:06fc856e99ca 24 * getRange() - samples the analog input from the ranger
nucho 0:06fc856e99ca 25 * and converts it into meters.
nucho 0:06fc856e99ca 26 */
nucho 0:06fc856e99ca 27 float getRange(PinName pin_num) {
nucho 0:06fc856e99ca 28 int sample;
nucho 0:06fc856e99ca 29 // Get data
nucho 0:06fc856e99ca 30 sample = AnalogIn(pin_num).read_u16()/4;
nucho 0:06fc856e99ca 31 // if the ADC reading is too low,
nucho 0:06fc856e99ca 32 // then we are really far away from anything
nucho 0:06fc856e99ca 33 if (sample < 10)
nucho 0:06fc856e99ca 34 return 254; // max range
nucho 0:06fc856e99ca 35 // Magic numbers to get cm
nucho 0:06fc856e99ca 36 sample= 1309/(sample-3);
nucho 0:06fc856e99ca 37 return (sample - 1)/100; //convert to meters
nucho 0:06fc856e99ca 38 }
nucho 0:06fc856e99ca 39
nucho 0:06fc856e99ca 40 char frameid[] = "/ir_ranger";
nucho 0:06fc856e99ca 41
nucho 0:06fc856e99ca 42 Timer t;
nucho 0:06fc856e99ca 43 int main() {
nucho 0:06fc856e99ca 44 t.start();
nucho 0:06fc856e99ca 45 nh.initNode();
nucho 0:06fc856e99ca 46 nh.advertise(pub_range);
nucho 0:06fc856e99ca 47
nucho 0:06fc856e99ca 48 range_msg.radiation_type = sensor_msgs::Range::INFRARED;
nucho 0:06fc856e99ca 49 range_msg.header.frame_id = frameid;
nucho 0:06fc856e99ca 50 range_msg.field_of_view = 0.01;
nucho 0:06fc856e99ca 51 range_msg.min_range = 0.03;
nucho 0:06fc856e99ca 52 range_msg.max_range = 0.4;
nucho 0:06fc856e99ca 53
nucho 0:06fc856e99ca 54 while (1) {
nucho 0:06fc856e99ca 55 // publish the range value every 50 milliseconds
nucho 0:06fc856e99ca 56 // since it takes that long for the sensor to stabilize
nucho 0:06fc856e99ca 57 if ( (t.read_ms()-range_timer) > 50) {
nucho 0:06fc856e99ca 58 range_msg.range = getRange(analog_pin);
nucho 0:06fc856e99ca 59 range_msg.header.stamp = nh.now();
nucho 0:06fc856e99ca 60 pub_range.publish(&range_msg);
nucho 0:06fc856e99ca 61 range_timer = t.read_ms() + 50;
nucho 0:06fc856e99ca 62 }
nucho 0:06fc856e99ca 63 nh.spinOnce();
nucho 0:06fc856e99ca 64 }
nucho 0:06fc856e99ca 65 }
nucho 0:06fc856e99ca 66
nucho 0:06fc856e99ca 67 #endif