34 #include <std_msgs/String.h>
35 #include <visualization_msgs/Marker.h>
37 #include <sys/types.h>
46 #include <pressure_cells/SenVal.h>
57 return (
double)(0.026574084375916 * adc -0.834411121568734);
62 return (
double)(0.026233317081797 * adc -4.311235918674921);
67 return (
double)(0.027158321888210 * adc -1.748472910437862);
72 return (
double)(0.026998009432107 * adc -3.485178371297848);
77 return (
double)(0.061665094219161 * adc -0.037584380861199);
82 return (
double)(0.059355778053492 * adc -0.971028934842100);
87 return (
double)(0.061558158124062 * adc -1.514361056192554);
92 return (
double)(0.062712489442863 * adc -0.845013447028478);
102 int main (
int argc,
char **argv )
108 init( argc, argv,
"arduino" );
115 string device_default =
"default_device";
116 n.param(
"/device", device, device_default );
120 string tf_feet_default =
"tf_default_feet";
121 n.param(
"tf_feet", tf_feet, tf_feet_default );
125 string markers_default =
"default_markers";
126 n.param(
"markers", markers, markers_default );
129 std::string check_markers;
130 n.getParam(
"markers", check_markers);
132 if (check_markers!=markers_default)
134 ROS_INFO(
"Setting markers parameter to %s", check_markers.c_str());
141 int cell1_default = 1;
142 n.param(
"cell1", cell1, cell1_default );
145 int cell2_default = 2;
146 n.param(
"cell2", cell2, cell2_default );
149 int cell3_default = 3;
150 n.param(
"cell3", cell3, cell3_default );
153 int cell4_default = 4;
154 n.param(
"cell4", cell4, cell4_default );
157 pub_viz = n.advertise<visualization_msgs::Marker>( markers, 0 );
159 Publisher pub_sen_val = n.advertise< pressure_cells::SenVal >(
"/values", 1000 );
161 Rate loop_rate ( 1400 );
163 pressure_cells::SenVal senval;
168 double adc1, adc2, adc3, adc4;
170 int pid = getpid(), rpid;
172 boost::format fmt(
"sudo renice -10 %d");
175 rpid = std::system(fmt.str().c_str());
186 if(data.size()!=5) {loop_rate.sleep ( );
continue;}
188 adc1 = (
unsigned char)data[0] << 2 | (
unsigned char)data[4] >> 6 ;
189 adc2 = (
unsigned char)data[1] << 2 | ((
unsigned char)data[4] & 0x30) >> 4;
190 adc3 = (
unsigned char)data[2] << 2 | ((
unsigned char)data[4] & 0x0C) >> 2;
191 adc4 = (
unsigned char)data[3] << 2 | ((
unsigned char)data[4] & 0x03);
193 senval.sen1=
ee_calibrate(adc1, cell1);
if(senval.sen1<=0) senval.sen1=0.001;
194 senval.sen2=
ee_calibrate(adc2, cell2);
if(senval.sen2<=0) senval.sen2=0.001;
195 senval.sen3=
ee_calibrate(adc3, cell3);
if(senval.sen3<=0) senval.sen3=0.001;
196 senval.sen4=
ee_calibrate(adc4, cell4);
if(senval.sen4<=0) senval.sen4=0.001;
198 senval.header.stamp = ros::Time::now ( );
200 pub_sen_val.publish ( senval );
204 geometry_msgs::Point f1_p1;
205 geometry_msgs::Point f1_p2;
206 geometry_msgs::Point f2_p1;
207 geometry_msgs::Point f2_p2;
208 geometry_msgs::Point f3_p1;
209 geometry_msgs::Point f3_p2;
210 geometry_msgs::Point f4_p1;
211 geometry_msgs::Point f4_p2;
213 visualization_msgs::Marker force1;
214 visualization_msgs::Marker force2;
215 visualization_msgs::Marker force3;
216 visualization_msgs::Marker force4;
219 force1.header.frame_id = tf_feet;
220 force1.header.stamp = ros::Time();
221 force1.ns =
"force1";
223 force1.type = visualization_msgs::Marker::ARROW;
224 force1.action = visualization_msgs::Marker::ADD;
225 force1.scale.x = 0.02;
226 force1.scale.y = 0.02;
228 force1.color.a = 1.0;
229 force1.color.r = 1.0;
230 force1.color.g = 0.5;
231 force1.color.b = 0.0;
233 force1.points.clear();
237 force1.points.push_back(f1_p1);
240 f1_p2.z = senval.sen1/25;
241 force1.points.push_back(f1_p2);
244 force2.header.frame_id = tf_feet;
245 force2.header.stamp = ros::Time();
246 force2.ns =
"force2";
248 force2.type = visualization_msgs::Marker::ARROW;
249 force2.action = visualization_msgs::Marker::ADD;
250 force2.scale.x = 0.02;
251 force2.scale.y = 0.02;
253 force2.color.a = 1.0;
254 force2.color.r = 0.02;
255 force2.color.g = 0.8;
256 force2.color.b = 0.02;
258 force2.points.clear();
262 force2.points.push_back(f2_p1);
265 f2_p2.z = senval.sen2/25;
266 force2.points.push_back(f2_p2);
269 force3.header.frame_id = tf_feet;
270 force3.header.stamp = ros::Time();
271 force3.ns =
"force3";
273 force3.type = visualization_msgs::Marker::ARROW;
274 force3.action = visualization_msgs::Marker::ADD;
275 force3.scale.x = 0.02;
276 force3.scale.y = 0.02;
278 force3.color.a = 1.0;
279 force3.color.r = 0.02;
280 force3.color.g = 0.37;
281 force3.color.b = 0.8;
283 force3.points.clear();
287 force3.points.push_back(f3_p1);
290 f3_p2.z = senval.sen3/25;
291 force3.points.push_back(f3_p2);
294 force4.header.frame_id = tf_feet;
295 force4.header.stamp = ros::Time();
296 force4.ns =
"force4";
298 force4.type = visualization_msgs::Marker::ARROW;
299 force4.action = visualization_msgs::Marker::ADD;
300 force4.scale.x = 0.02;
301 force4.scale.y = 0.02;
303 force4.color.a = 1.0;
304 force4.color.r = 0.37;
305 force4.color.g = 0.02;
306 force4.color.b = 0.8;
308 force4.points.clear();
312 force4.points.push_back(f4_p1);
315 f4_p2.z = senval.sen4/25;
316 force4.points.push_back(f4_p2);
318 pub_viz.publish( force1 );
319 pub_viz.publish( force2 );
320 pub_viz.publish( force3 );
321 pub_viz.publish( force4 );
326 catch ( boost::system::system_error& e )
328 cout <<
"Error: " << e.what ( ) << endl;
double ee_calibrate(double adc, int cell)
Header for communicating w/ the arduino.
Asynchronous serial class w/ buffer Asynchronous serial class that sends data to buffer after reading...
std::string readStringUntil(const std::string delim="\n")
Class found to make buffers for Serial communications ()
int main(int argc, char **argv)