Revision: 6927 http://playerstage.svn.sourceforge.net/playerstage/?rev=6927&view=rev Author: jeremy_asher Date: 2008-07-25 21:27:59 +0000 (Fri, 25 Jul 2008)
Log Message: ----------- libstageplugin: fixed blobfinder returning pixels in reverse x order, implemented blobfinder test, added readme for tests Modified Paths: -------------- code/stage/trunk/libstage/model_blobfinder.cc code/stage/trunk/libstageplugin/p_blobfinder.cc code/stage/trunk/libstageplugin/test/CMakeLists.txt code/stage/trunk/libstageplugin/test/lsp_test_position2d.hh code/stage/trunk/libstageplugin/test/lsp_test_simulation.cc code/stage/trunk/worlds/lsp_test.cfg code/stage/trunk/worlds/lsp_test.world Added Paths: ----------- code/stage/trunk/libstageplugin/test/lsp_test_blobfinder.cc code/stage/trunk/libstageplugin/test/lsp_test_blobfinder.hh code/stage/trunk/libstageplugin/test/readme.txt Modified: code/stage/trunk/libstage/model_blobfinder.cc =================================================================== --- code/stage/trunk/libstage/model_blobfinder.cc 2008-07-25 17:35:38 UTC (rev 6926) +++ code/stage/trunk/libstage/model_blobfinder.cc 2008-07-25 21:27:59 UTC (rev 6927) @@ -197,7 +197,7 @@ //if( samples[s].block->Color() != 0xFFFF0000 ) //continue; // we saw nothing - unsigned int blobleft = s; + unsigned int right = s; stg_color_t blobcol = samples[s].block->Color(); //printf( "blob start %d color %X\n", blobleft, blobcol ); @@ -212,7 +212,7 @@ s++; } - unsigned int blobright = s-1; + unsigned int left = s - 1; //if we have color filters in place, check to see if we're looking for this color if( colors->len ) @@ -235,25 +235,25 @@ // find the average range to the blob; stg_meters_t range = 0; - for( unsigned int t=blobleft; t<=blobright; t++ ) + for( unsigned int t=right; t<=left; t++ ) range += samples[t].range; - range /= blobright-blobleft + 1; + range /= left-right + 1; double startyangle = atan2( robotHeight/2.0, range ); double endyangle = -startyangle; int blobtop = scan_height/2 - (int)(startyangle/yRadsPerPixel); int blobbottom = scan_height/2 -(int)(endyangle/yRadsPerPixel); - blobtop = MIN( blobtop, (int)scan_height ); + blobtop = MAX( blobtop, 0 ); blobbottom = MIN( blobbottom, (int)scan_height ); // fill in an array entry for this blob stg_blobfinder_blob_t blob; memset( &blob, 0, sizeof(blob) ); blob.color = blobcol; - blob.left = blobleft; + blob.left = scan_width - left - 1; blob.top = blobtop; - blob.right = blobright; + blob.right = scan_width - right - 1;; blob.bottom = blobbottom; blob.range = range; @@ -346,6 +346,7 @@ PushColor( 0xFF000000 ); glRectf( 0,0, scan_width, scan_height ); PopColor(); + glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); // draw the blobs on the screen for( unsigned int s=0; s<blobs->len; s++ ) @@ -360,7 +361,6 @@ PopColor(); } - glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); glPopMatrix(); } Modified: code/stage/trunk/libstageplugin/p_blobfinder.cc =================================================================== --- code/stage/trunk/libstageplugin/p_blobfinder.cc 2008-07-25 17:35:38 UTC (rev 6926) +++ code/stage/trunk/libstageplugin/p_blobfinder.cc 2008-07-25 21:27:59 UTC (rev 6927) @@ -73,20 +73,19 @@ for( b=0; b<bcount; b++ ) { // useful debug - leave in - /* + cout << "blob " - << " channel: " << (int)blobs[b].channel - << " area: " << blobs[b].area << " left: " << blobs[b].left << " right: " << blobs[b].right << " top: " << blobs[b].top << " bottom: " << blobs[b].bottom + << " color: " << hex << blobs[b].color << dec << endl; - */ + int dx = blobs[b].right - blobs[b].left; int dy = blobs[b].top - blobs[b].bottom; - + bfd.blobs[b].x = blobs[b].left + dx/2; bfd.blobs[b].y = blobs[b].bottom + dy/2; Modified: code/stage/trunk/libstageplugin/test/CMakeLists.txt =================================================================== --- code/stage/trunk/libstageplugin/test/CMakeLists.txt 2008-07-25 17:35:38 UTC (rev 6926) +++ code/stage/trunk/libstageplugin/test/CMakeLists.txt 2008-07-25 21:27:59 UTC (rev 6927) @@ -15,6 +15,8 @@ lsp_test.cc lsp_test_proxy.cc lsp_test_proxy.hh + lsp_test_blobfinder.cc + lsp_test_blobfinder.hh lsp_test_simulation.cc lsp_test_simulation.hh lsp_test_speech.cc Added: code/stage/trunk/libstageplugin/test/lsp_test_blobfinder.cc =================================================================== --- code/stage/trunk/libstageplugin/test/lsp_test_blobfinder.cc (rev 0) +++ code/stage/trunk/libstageplugin/test/lsp_test_blobfinder.cc 2008-07-25 21:27:59 UTC (rev 6927) @@ -0,0 +1,59 @@ +#include "lsp_test_blobfinder.hh" + +using namespace lspTest; + +void Blobfinder::setUp() { + connect(); + blobProxy = playerc_blobfinder_create( client, 0 ); + CPPUNIT_ASSERT( playerc_blobfinder_subscribe( blobProxy, PLAYER_OPEN_MODE ) == 0 ); +} + + +void Blobfinder::tearDown() { + CPPUNIT_ASSERT( playerc_blobfinder_unsubscribe( blobProxy ) == 0 ); + playerc_blobfinder_destroy( blobProxy ); + disconnect(); +} + +void Blobfinder::testData() { + playerc_client_read( client ); + + // verify that we're getting new data + blobProxy->info.fresh = 0; + playerc_client_read( client ); + CPPUNIT_ASSERT_MESSAGE( "blobfinder updating", blobProxy->info.fresh == 1 ); + + CPPUNIT_ASSERT( blobProxy->info.datatime > 0 ); + + //printf("\ncolor0: 0x%X, color1: 0x%X\n", blobProxy->blobs[0].color, blobProxy->blobs[1].color); + + // check stage defaults + CPPUNIT_ASSERT( blobProxy->width == 80 ); + CPPUNIT_ASSERT( blobProxy->height == 60 ); + + // Make sure we see three blobs: wall, robot, wall + CPPUNIT_ASSERT_EQUAL_MESSAGE( "blobs_count", (unsigned int)3, blobProxy->blobs_count ); // lsp_test.world + // sanity checks + CPPUNIT_ASSERT( blobProxy->blobs[1].range > 0 ); + CPPUNIT_ASSERT( blobProxy->blobs[1].area > 0 ); + CPPUNIT_ASSERT( blobProxy->blobs[1].y > 0 ); + CPPUNIT_ASSERT( blobProxy->blobs[1].left < blobProxy->blobs[1].right ); + CPPUNIT_ASSERT( blobProxy->blobs[1].top < blobProxy->blobs[1].bottom ); + + // robot should be red + CPPUNIT_ASSERT( blobProxy->blobs[1].color == 0xFFFF0000 ); + + // robot should be closer + CPPUNIT_ASSERT( blobProxy->blobs[0].range > blobProxy->blobs[1].range ); + + // robot should be towards the right + uint32_t robotCenter = blobProxy->blobs[1].x; + uint32_t imageCenter = blobProxy->width / 2; + //printf(" robotCenter: %d, imageCenter: %d\n", robotCenter, imageCenter); + CPPUNIT_ASSERT( robotCenter > imageCenter ); + + + +// CPPUNIT_ASSERT_EQUAL_MESSAGE( "id", (unsigned int)2, blobProxy->blobs[0].id ); + +} \ No newline at end of file Added: code/stage/trunk/libstageplugin/test/lsp_test_blobfinder.hh =================================================================== --- code/stage/trunk/libstageplugin/test/lsp_test_blobfinder.hh (rev 0) +++ code/stage/trunk/libstageplugin/test/lsp_test_blobfinder.hh 2008-07-25 21:27:59 UTC (rev 6927) @@ -0,0 +1,31 @@ +#ifndef _LSP_BLOBFINDER_TEST_H_ +#define _LSP_BLOBFINDER_TEST_H_ + +#include <cppunit/extensions/HelperMacros.h> +#include <libplayerc/playerc.h> + +#include "lsp_test_proxy.hh" + +namespace lspTest { + class Blobfinder : public Proxy + { + CPPUNIT_TEST_SUITE( Blobfinder ); + CPPUNIT_TEST( testData ); + CPPUNIT_TEST_SUITE_END(); + + protected: + playerc_blobfinder_t* blobProxy; + + void testConfig(); + void testGeom(); + void testData(); + + public: + void setUp(); + void tearDown(); + }; +}; + +CPPUNIT_TEST_SUITE_REGISTRATION( lspTest::Blobfinder ); + +#endif \ No newline at end of file Modified: code/stage/trunk/libstageplugin/test/lsp_test_position2d.hh =================================================================== --- code/stage/trunk/libstageplugin/test/lsp_test_position2d.hh 2008-07-25 17:35:38 UTC (rev 6926) +++ code/stage/trunk/libstageplugin/test/lsp_test_position2d.hh 2008-07-25 21:27:59 UTC (rev 6927) @@ -12,7 +12,7 @@ CPPUNIT_TEST_SUB_SUITE( Position2D, Proxy ); CPPUNIT_TEST( testGeom ); CPPUNIT_TEST( testData ); -// CPPUNIT_TEST( testMove ); + CPPUNIT_TEST( testMove ); CPPUNIT_TEST_SUITE_END(); protected: Modified: code/stage/trunk/libstageplugin/test/lsp_test_simulation.cc =================================================================== --- code/stage/trunk/libstageplugin/test/lsp_test_simulation.cc 2008-07-25 17:35:38 UTC (rev 6926) +++ code/stage/trunk/libstageplugin/test/lsp_test_simulation.cc 2008-07-25 21:27:59 UTC (rev 6927) @@ -20,8 +20,8 @@ // See if the robot "r1" is where it should be according to lsp_test.world CPPUNIT_ASSERT( playerc_simulation_get_pose2d( simProxy, "r1", &x, &y, &a ) == 0 ); - CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (x)", -5.085, x, Delta ); - CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (y)", -7.193, y, Delta ); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (x)", -4.19, x, Delta ); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (y)", -5.71, y, Delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (a)", 3*M_PI/4, a, Delta ); // Set pose to [ 0, 0, 0 ] and verify @@ -41,8 +41,8 @@ // See if the robot "r1" is where it should be according to lsp_test.world CPPUNIT_ASSERT( playerc_simulation_get_pose3d( simProxy, "r1", &x, &y, &z, &roll, &pitch, &yaw, &time ) == 0 ); - CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (x)", -5.085, x, Delta ); - CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (y)", -7.193, y, Delta ); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (x)", -4.19, x, Delta ); + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (y)", -5.71, y, Delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (z)", 0, z, Delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (roll)", 0, roll, Delta ); CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE( "pose (pitch)", 0, pitch, Delta ); Added: code/stage/trunk/libstageplugin/test/readme.txt =================================================================== --- code/stage/trunk/libstageplugin/test/readme.txt (rev 0) +++ code/stage/trunk/libstageplugin/test/readme.txt 2008-07-25 21:27:59 UTC (rev 6927) @@ -0,0 +1,9 @@ +Building +-------- +CPPUNIT is required. Build by enabling the BUILD_LSPTEST option either with a cmake command line arg or through ccmake on the root of the stage source. + +Execution +--------- +Run player on lsp_test.cfg, included in the worlds section of the stage source. + +Execute lsp_test on the same machine and the test suites will connect to localhost:6665 to perform testing. \ No newline at end of file Modified: code/stage/trunk/worlds/lsp_test.cfg =================================================================== --- code/stage/trunk/worlds/lsp_test.cfg 2008-07-25 17:35:38 UTC (rev 6926) +++ code/stage/trunk/worlds/lsp_test.cfg 2008-07-25 21:27:59 UTC (rev 6927) @@ -16,7 +16,7 @@ driver ( name "stage" - provides [ "position2d:0" "speech:0" "laser:0" "sonar:0" "fiducial:0" ] + provides [ "position2d:0" "speech:0" "laser:0" "sonar:0" "fiducial:0" "blobfinder:0" ] model "r0" ) Modified: code/stage/trunk/worlds/lsp_test.world =================================================================== --- code/stage/trunk/worlds/lsp_test.world 2008-07-25 17:35:38 UTC (rev 6926) +++ code/stage/trunk/worlds/lsp_test.world 2008-07-25 21:27:59 UTC (rev 6927) @@ -32,11 +32,11 @@ ( ranger() - sicklaser( pose [ 0.03 0 0 0 ] ) + sicklaser( pose [ 0.030 0 0 0 ] ) fiducial ( - pose [ -0.15 0 0 0 ] + pose [ -0.150 0 0 0 ] range_max 8 range_max_id 5 ) @@ -56,6 +56,7 @@ name "r0" fiducial_return 1 + blobfinder_return 1 pose [ -7.490 -7.490 0 45.000 ] ) @@ -64,5 +65,6 @@ name "r1" fiducial_return 2 - pose [ -5.085 -7.193 0 135 ] + blobfinder_return 2 + pose [ -4.19 -5.71 0 135.000 ] ) \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Playerstage-commit mailing list Playerstage-commit@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/playerstage-commit