From: Vinh <arb...@go...> - 2006-10-19 15:17:10
|
Hi everyone, I'm trying to write a driver now. I have found this tutorial, but still have problems: http://cgi.cse.unsw.edu.au/~cs4411/wiki/index.php?title=Writing_player_drivers The example driver provided with player 2.0.3 compiles for me (MacOSX) and I can use exampledriver.cfg to load up with player. However if I change some code - really simple such as "puts ("bla") in between of some other outputs - it never gets called. So I doubt that my code is actually processed. Is there anything I'm doing wrong? I have some opencv code which detects moving objects. I now want to provide this information in form of a driver to some player clients. As I understood I need to write a driver supporting the position2d proxy interface and implementing the message type PLAYER_POSITION2D_DATA_STATE. Vinh |
From: Vinh <arb...@go...> - 2006-10-19 15:27:29
|
..and if calling player I receive this weired error, even though the compilation went fine. I attached the slightly modified files derived from the exampledriver. GeekBook:~/virtualGPS/test vpdn$ ls Makefile virtualGPSdriver.cc virtualGPSdriver.o libvirtualGPSdriver.dylib virtualGPSdriver.cfg libvirtualGPSdriver.la virtualGPSdriver.cfg~ GeekBook:~/virtualGPS/test vpdn$ rm virtualGPSdriver.o libvirtualGPSdriver.dylib GeekBook:~/virtualGPS/test vpdn$ make g++ `pkg-config --cflags playercore` -Wall -g3 -dynamiclib -c virtualGPSdriver.cc g++ -bundle -flat_namespace -undefined suppress -o libvirtualGPSdriver.dylib virtualGPSdriver.o GeekBook:~/virtualGPS/test vpdn$ player ./virtualGPSdriver.cfg * Part of the Player/Stage/Gazebo Project [http://playerstage.sourceforge.net]. * Copyright (C) 2000 - 2006 Brian Gerkey, Richard Vaughan, Andrew Howard, * Nate Koenig, and contributors. Released under the GNU General Public License. * Player comes with ABSOLUTELY NO WARRANTY. This is free software, and you * are welcome to redistribute it under certain conditions; see COPYING * for details. trying to load /Users/vpdn/virtualGPS/test/./libvirtualGPSdriver... trying to load /usr/local/lib/libvirtualGPSdriver... trying to load libvirtualGPSdriver... error : error loading plugin: libvirtualGPSdriver error : failed to load plugin: libvirtualGPSdriver error : failed to parse config file ./virtualGPSdriver.cfg On 10/20/06, Vinh <arb...@go...> wrote: > Hi everyone, > I'm trying to write a driver now. I have found this tutorial, but > still have problems: > http://cgi.cse.unsw.edu.au/~cs4411/wiki/index.php?title=Writing_player_drivers > > The example driver provided with player 2.0.3 compiles for me (MacOSX) > and I can use exampledriver.cfg to load up with player. > However if I change some code - really simple such as "puts ("bla") in > between of some other outputs - it never gets called. So I doubt that > my code is actually processed. Is there anything I'm doing wrong? > > I have some opencv code which detects moving objects. I now want to > provide this information in form of a driver to some player clients. > As I understood I need to write a driver supporting the position2d > proxy interface and implementing the message type > PLAYER_POSITION2D_DATA_STATE. > > Vinh > |
From: Brian G. <br...@ge...> - 2006-10-19 17:06:33
|
On Oct 19, 2006, at 8:27 AM, Vinh wrote: > ..and if calling player I receive this weired error, even though the > compilation went fine. > I attached the slightly modified files derived from the exampledriver. > > GeekBook:~/virtualGPS/test vpdn$ player ./virtualGPSdriver.cfg > > * Part of the Player/Stage/Gazebo Project [http:// > playerstage.sourceforge.net]. > * Copyright (C) 2000 - 2006 Brian Gerkey, Richard Vaughan, Andrew > Howard, > * Nate Koenig, and contributors. Released under the GNU General > Public License. > * Player comes with ABSOLUTELY NO WARRANTY. This is free software, > and you > * are welcome to redistribute it under certain conditions; see COPYING > * for details. > > trying to load /Users/vpdn/virtualGPS/test/./libvirtualGPSdriver... > trying to load /usr/local/lib/libvirtualGPSdriver... > trying to load libvirtualGPSdriver... > error : error loading plugin: libvirtualGPSdriver > error : failed to load plugin: libvirtualGPSdriver > error : failed to parse config file ./virtualGPSdriver.cfg Run again with more debug output: $ player -d 9 ./virtualGPSdriver.cfg Then you'll see why it failed to load your plugin. Alternatively, you can look in the file .player, which will have all the debug output. brian. |
From: Toby C. <tco...@pl...> - 2006-10-19 19:51:46
|
I really must change my mail service, hadn't got this one yet, apologies for the double up :) Brian Gerkey wrote: > On Oct 19, 2006, at 8:27 AM, Vinh wrote: > > >> ..and if calling player I receive this weired error, even though the >> compilation went fine. >> I attached the slightly modified files derived from the exampledriver. >> >> GeekBook:~/virtualGPS/test vpdn$ player ./virtualGPSdriver.cfg >> >> * Part of the Player/Stage/Gazebo Project [http:// >> playerstage.sourceforge.net]. >> * Copyright (C) 2000 - 2006 Brian Gerkey, Richard Vaughan, Andrew >> Howard, >> * Nate Koenig, and contributors. Released under the GNU General >> Public License. >> * Player comes with ABSOLUTELY NO WARRANTY. This is free software, >> and you >> * are welcome to redistribute it under certain conditions; see COPYING >> * for details. >> >> trying to load /Users/vpdn/virtualGPS/test/./libvirtualGPSdriver... >> trying to load /usr/local/lib/libvirtualGPSdriver... >> trying to load libvirtualGPSdriver... >> error : error loading plugin: libvirtualGPSdriver >> error : failed to load plugin: libvirtualGPSdriver >> error : failed to parse config file ./virtualGPSdriver.cfg >> > > Run again with more debug output: > > $ player -d 9 ./virtualGPSdriver.cfg > > Then you'll see why it failed to load your plugin. Alternatively, > you can look in the file .player, which will have all the debug output. > > brian. > > ------------------------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 > _______________________________________________ > Playerstage-users mailing list > Pla...@li... > https://lists.sourceforge.net/lists/listinfo/playerstage-users > |
From: Vinh <arb...@go...> - 2006-10-20 13:13:07
|
Thanks everyone for the help. With -d 9 I could track back the problem and have it now fixed (slowly changed from a working example until it didn't work anymore...was some path issue I guess). I now can output stuff in the main loop of the driver, therefore sure that I am actually modifying the correct code. Brian, you mentioned I should use the Blobfinder instead of position proxy? I have exactly one robot and want to track it using background subtraction. Is there any detailed tutorial on how to write a driver? I also couldn't find the link to the Driver class API in the manual. How are people usally extending the driver base?? Vinh |
From: Vinh <arb...@go...> - 2006-10-21 05:00:55
|
I have a prototype now which can compile. But somehow I am not getting any blobs back. The output suggests that there has been no message processing going on at all. I don't understand how that can be though? I have one client connected to it and asking for blobfinder data. The client is also connected as the server outputs: trying to load /Users/vpdn/vgps/./vgps... success invoking player_driver_init()... Example driver initializing Example driver done success Listening on ports: 6665 accepted client 0 on port 6665, fd 5 Example driver initialising image size - W 320 - H 240 Was foo option given in config file? 1 Example driver ready warning : other error on client 0 closing connection to client 0 on port 6665 Shutting example driver down Example driver has been shutdown But somehow the statements in ProcessMessage(..) is never executed. Attached the simple code, based on the cmvision blob driver: -------------------------- /* * Player - One Hell of a Robot Server * Copyright (C) 2003 * Brian Gerkey * * * 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 * */ /* * A simple example of how to write a driver that will be built as a * shared object. */ // ONLY if you need something that was #define'd as a result of configure // (e.g., HAVE_CFMAKERAW), then #include <config.h>, like so: /* #if HAVE_CONFIG_H #include <config.h> #endif */ #include <unistd.h> #include <string.h> #include <iostream> #include <libplayercore/playercore.h> //////////////////////////////////////////////////////////////////////////////// // The class for the driver class ExampleDriver : public Driver { public: // Constructor; need that ExampleDriver(ConfigFile* cf, int section); // Must implement the following methods. virtual int Setup(); virtual int Shutdown(); // This method will be invoked on each incoming message virtual int ProcessMessage(MessageQueue* resp_queue, player_msghdr * hdr, void * data); private: // Main function for device thread. virtual void Main(); uint16_t mWidth; uint16_t mHeight; // the image dimensions player_blobfinder_data_t mData; void TestPattern(); int foop; }; // A factory creation function, declared outside of the class so that it // can be invoked without any object context (alternatively, you can // declare it static in the class). In this function, we create and return // (as a generic Driver*) a pointer to a new instance of this driver. Driver* ExampleDriver_Init(ConfigFile* cf, int section) { // Create and return a new instance of this driver return((Driver*)(new ExampleDriver(cf, section))); } // A driver registration function, again declared outside of the class so // that it can be invoked without object context. In this function, we add // the driver into the given driver table, indicating which interface the // driver can support and how to create a driver instance. void ExampleDriver_Register(DriverTable* table) { table->AddDriver("exampledriver", ExampleDriver_Init); } //////////////////////////////////////////////////////////////////////////////// // Constructor. Retrieve options from the configuration file and do any // pre-Setup() setup. ExampleDriver::ExampleDriver(ConfigFile* cf, int section) : Driver(cf, section, true, PLAYER_MSGQUEUE_DEFAULT_MAXLEN, PLAYER_BLOBFINDER_CODE) { // Read an option from the configuration file this->foop = cf->ReadInt(section, "foo", 0); return; } //////////////////////////////////////////////////////////////////////////////// // Set up the device. Return 0 if things go well, and -1 otherwise. int ExampleDriver::Setup() { puts("Example driver initialising"); mWidth = 320; mHeight = 240; std::cout << "image size - W " << mWidth << " - H " << mHeight << "\n"; // Here you do whatever is necessary to setup the device, like open and // configure a serial port. printf("Was foo option given in config file? %d\n", this->foop); puts("Example driver ready"); // Start the device thread; spawns a new thread and executes // ExampleDriver::Main(), which contains the main loop for the driver. StartThread(); return(0); } //////////////////////////////////////////////////////////////////////////////// // Shutdown the device int ExampleDriver::Shutdown() { puts("Shutting example driver down"); // Stop and join the driver thread StopThread(); // Here you would shut the device down by, for example, closing a // serial port. puts("Example driver has been shutdown"); return(0); } int ExampleDriver::ProcessMessage(MessageQueue* resp_queue, player_msghdr * hdr, void * data) { // Process messages here. Send a response if necessary, using Publish(). // If you handle the message successfully, return 0. Otherwise, // return -1, and a NACK will be sent for you, if a response is required. // if(Message::MatchMessage(hdr, PLAYER_MSGTYPE_DATA, PLAYER_CAMERA_DATA_STATE, // this->mCameraAddr)) // { puts("Processing message ..."); TestPattern(); /* got the data. now publish it */ uint size = sizeof(mData) - sizeof(mData.blobs) + mData.blobs_count * sizeof(mData.blobs[0]); printf("total size found to be %d", size); Publish(device_addr, NULL, PLAYER_MSGTYPE_DATA, PLAYER_BLOBFINDER_DATA_BLOBS, reinterpret_cast<void*>(&mData), size, NULL); return(0); } //////////////////////////////////////////////////////////////////////////////// // Main function for device thread void ExampleDriver::Main() { // The main loop; interact with the device here for(;;) { // test if we are supposed to cancel pthread_testcancel(); // Process incoming messages. ExampleDriver::ProcessMessage() is // called on each message. ProcessMessages(); // Interact with the device, and push out the resulting data, using // Driver::Publish() // Sleep (you might, for example, block on a read() instead) usleep(100000); } } ////////////////////////////////////////////////////////// // Some test building up a blob. Let's see whether driver // works at all void ExampleDriver::TestPattern() { puts("set blob count to three.\n"); mData.blobs_count = 3; puts("adding blobs\n"); for (uint i=0; i<mData.blobs_count; ++i) { uint x = mWidth/5*i + mWidth/5; uint y = mHeight/2; mData.blobs[i].x = x; mData.blobs[i].y = y; mData.blobs[i].top = y+10; mData.blobs[i].bottom = y-10; mData.blobs[i].left = x-10; mData.blobs[i].right = x+10; mData.blobs[i].color = 0xff << i*8; } puts("done."); } //////////////////////////////////////////////////////////////////////////////// // Extra stuff for building a shared object. /* need the extern to avoid C++ name-mangling */ extern "C" { int player_driver_init(DriverTable* table) { puts("Example driver initializing"); ExampleDriver_Register(table); puts("Example driver done"); return(0); } } -------------------------- The client: --------------------------- #include <libplayerc++/playerc++.h> #include <stdlib.h> /* for exit() */ #include <iostream> using namespace PlayerCc; int main(int argc, char *argv[]) { PlayerClient robot("localhost"); BlobfinderProxy bf(&robot); while (1) { std::cout << "-------------\n"; std::cout << "WIDTH " << bf.GetWidth() << " " << std::endl; std::cout << "HEIGHT" << bf.GetHeight() << " " << std::endl; std::cout << "BLOBS Count " << bf.GetCount() << " " << std::endl; for (int i=0; i<bf.GetCount(); i++) { std::cout << "AREA " << bf[i].area << " " << std::endl; std::cout << "ID " << bf[i].id << " " << std::endl; std::cout << "X " << bf[i].x << " " << std::endl; std::cout << "Y " << bf[i].y << " " << std::endl; std::cout << "LEFT " << bf[i].left << " " << std::endl; std::cout << "RIGHT " << bf[i].right << " " << std::endl; } std::cout << "\n\n"; } } ----------------- On 10/20/06, Vinh <arb...@go...> wrote: > Thanks everyone for the help. With -d 9 I could track back the problem > and have it now fixed (slowly changed from a working example until it > didn't work anymore...was some path issue I guess). > I now can output stuff in the main loop of the driver, therefore sure > that I am actually modifying the correct code. > > Brian, you mentioned I should use the Blobfinder instead of position > proxy? I have exactly one robot and want to track it using background > subtraction. Is there any detailed tutorial on how to write a driver? > I also couldn't find the link to the Driver class API in the manual. > How are people usally extending the driver base?? > > Vinh > |
From: Toby C. <tco...@pl...> - 2006-10-21 21:45:37
|
Data is based on a produce/consume model, you need to produce it in your main thread and then the client consumes it. Process message will only be called when commands or requests arrive for your driver. (More precisely the only messages put into your drivers queue are commands, requests and data for devices *it* is subscribed to, none of which are happening in your case) Toby Vinh wrote: > I have a prototype now which can compile. But somehow I am not getting > any blobs back. The output suggests that there has been no message > processing going on at all. I don't understand how that can be though? > I have one client connected to it and asking for blobfinder data. The > client is also connected as the server outputs: > > trying to load /Users/vpdn/vgps/./vgps... > success > invoking player_driver_init()... > Example driver initializing > Example driver done > success > Listening on ports: 6665 > accepted client 0 on port 6665, fd 5 > Example driver initialising > image size - W 320 - H 240 > Was foo option given in config file? 1 > Example driver ready > warning : other error on client 0 > closing connection to client 0 on port 6665 > Shutting example driver down > Example driver has been shutdown > > > But somehow the statements in ProcessMessage(..) is never executed. > Attached the simple code, based on the cmvision blob driver: > > -------------------------- > /* > * Player - One Hell of a Robot Server > * Copyright (C) 2003 > * Brian Gerkey > * > * > * 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 > * > */ > > /* > * A simple example of how to write a driver that will be built as a > * shared object. > */ > > // ONLY if you need something that was #define'd as a result of configure > // (e.g., HAVE_CFMAKERAW), then #include <config.h>, like so: > /* > #if HAVE_CONFIG_H > #include <config.h> > #endif > */ > > #include <unistd.h> > #include <string.h> > #include <iostream> > > #include <libplayercore/playercore.h> > > //////////////////////////////////////////////////////////////////////////////// > // The class for the driver > class ExampleDriver : public Driver > { > public: > > // Constructor; need that > ExampleDriver(ConfigFile* cf, int section); > > // Must implement the following methods. > virtual int Setup(); > virtual int Shutdown(); > > // This method will be invoked on each incoming message > virtual int ProcessMessage(MessageQueue* resp_queue, > player_msghdr * hdr, > void * data); > > private: > > // Main function for device thread. > virtual void Main(); > > uint16_t mWidth; > uint16_t mHeight; // the image dimensions > player_blobfinder_data_t mData; > > void TestPattern(); > > > int foop; > }; > > // A factory creation function, declared outside of the class so that it > // can be invoked without any object context (alternatively, you can > // declare it static in the class). In this function, we create and return > // (as a generic Driver*) a pointer to a new instance of this driver. > Driver* > ExampleDriver_Init(ConfigFile* cf, int section) > { > // Create and return a new instance of this driver > return((Driver*)(new ExampleDriver(cf, section))); > } > > // A driver registration function, again declared outside of the class so > // that it can be invoked without object context. In this function, we add > // the driver into the given driver table, indicating which interface the > // driver can support and how to create a driver instance. > void ExampleDriver_Register(DriverTable* table) > { > table->AddDriver("exampledriver", ExampleDriver_Init); > } > > //////////////////////////////////////////////////////////////////////////////// > // Constructor. Retrieve options from the configuration file and do any > // pre-Setup() setup. > ExampleDriver::ExampleDriver(ConfigFile* cf, int section) > : Driver(cf, section, true, PLAYER_MSGQUEUE_DEFAULT_MAXLEN, > PLAYER_BLOBFINDER_CODE) > { > // Read an option from the configuration file > this->foop = cf->ReadInt(section, "foo", 0); > > return; > } > > //////////////////////////////////////////////////////////////////////////////// > // Set up the device. Return 0 if things go well, and -1 otherwise. > int ExampleDriver::Setup() > { > puts("Example driver initialising"); > > mWidth = 320; > mHeight = 240; > > std::cout << "image size - W " << mWidth << " - H " << mHeight << "\n"; > // Here you do whatever is necessary to setup the device, like open and > // configure a serial port. > > printf("Was foo option given in config file? %d\n", this->foop); > > puts("Example driver ready"); > > // Start the device thread; spawns a new thread and executes > // ExampleDriver::Main(), which contains the main loop for the driver. > StartThread(); > > return(0); > } > > > //////////////////////////////////////////////////////////////////////////////// > // Shutdown the device > int ExampleDriver::Shutdown() > { > puts("Shutting example driver down"); > > // Stop and join the driver thread > StopThread(); > > // Here you would shut the device down by, for example, closing a > // serial port. > > puts("Example driver has been shutdown"); > > return(0); > } > > int ExampleDriver::ProcessMessage(MessageQueue* resp_queue, > player_msghdr * hdr, > void * data) > { > // Process messages here. Send a response if necessary, using Publish(). > // If you handle the message successfully, return 0. Otherwise, > // return -1, and a NACK will be sent for you, if a response is required. > > // if(Message::MatchMessage(hdr, PLAYER_MSGTYPE_DATA, > PLAYER_CAMERA_DATA_STATE, > // this->mCameraAddr)) > // { > > puts("Processing message ..."); > > TestPattern(); > > /* got the data. now publish it */ > uint size = sizeof(mData) - sizeof(mData.blobs) + > mData.blobs_count * sizeof(mData.blobs[0]); > > printf("total size found to be %d", size); > > Publish(device_addr, NULL, > PLAYER_MSGTYPE_DATA, PLAYER_BLOBFINDER_DATA_BLOBS, > reinterpret_cast<void*>(&mData), size, NULL); > > return(0); > } > > > > //////////////////////////////////////////////////////////////////////////////// > // Main function for device thread > void ExampleDriver::Main() > { > // The main loop; interact with the device here > for(;;) > { > // test if we are supposed to cancel > pthread_testcancel(); > > // Process incoming messages. ExampleDriver::ProcessMessage() is > // called on each message. > ProcessMessages(); > > // Interact with the device, and push out the resulting data, using > // Driver::Publish() > > // Sleep (you might, for example, block on a read() instead) > usleep(100000); > } > } > > ////////////////////////////////////////////////////////// > // Some test building up a blob. Let's see whether driver > // works at all > > void ExampleDriver::TestPattern() > { > puts("set blob count to three.\n"); > mData.blobs_count = 3; > > puts("adding blobs\n"); > for (uint i=0; i<mData.blobs_count; ++i) > { > uint x = mWidth/5*i + mWidth/5; > uint y = mHeight/2; > > mData.blobs[i].x = x; > mData.blobs[i].y = y; > > mData.blobs[i].top = y+10; > mData.blobs[i].bottom = y-10; > mData.blobs[i].left = x-10; > mData.blobs[i].right = x+10; > > mData.blobs[i].color = 0xff << i*8; > } > puts("done."); > } > > //////////////////////////////////////////////////////////////////////////////// > // Extra stuff for building a shared object. > > /* need the extern to avoid C++ name-mangling */ > extern "C" { > int player_driver_init(DriverTable* table) > { > puts("Example driver initializing"); > ExampleDriver_Register(table); > puts("Example driver done"); > return(0); > } > } > -------------------------- > > > The client: > > --------------------------- > > #include <libplayerc++/playerc++.h> > #include <stdlib.h> /* for exit() */ > #include <iostream> > > using namespace PlayerCc; > > int main(int argc, char *argv[]) > { > PlayerClient robot("localhost"); > BlobfinderProxy bf(&robot); > > while (1) > { > std::cout << "-------------\n"; > std::cout << "WIDTH " << bf.GetWidth() << " " << std::endl; > std::cout << "HEIGHT" << bf.GetHeight() << " " << std::endl; > > std::cout << "BLOBS Count " << bf.GetCount() << " " << std::endl; > > for (int i=0; i<bf.GetCount(); i++) > { > std::cout << "AREA " << bf[i].area << " " << std::endl; > std::cout << "ID " << bf[i].id << " " << std::endl; > std::cout << "X " << bf[i].x << " " << std::endl; > std::cout << "Y " << bf[i].y << " " << std::endl; > std::cout << "LEFT " << bf[i].left << " " << std::endl; > std::cout << "RIGHT " << bf[i].right << " " << std::endl; > } > std::cout << "\n\n"; > } > } > > ----------------- > > > On 10/20/06, Vinh <arb...@go...> wrote: > >> Thanks everyone for the help. With -d 9 I could track back the problem >> and have it now fixed (slowly changed from a working example until it >> didn't work anymore...was some path issue I guess). >> I now can output stuff in the main loop of the driver, therefore sure >> that I am actually modifying the correct code. >> >> Brian, you mentioned I should use the Blobfinder instead of position >> proxy? I have exactly one robot and want to track it using background >> subtraction. Is there any detailed tutorial on how to write a driver? >> I also couldn't find the link to the Driver class API in the manual. >> How are people usally extending the driver base?? >> >> Vinh >> >> > > ------------------------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 > _______________________________________________ > Playerstage-users mailing list > Pla...@li... > https://lists.sourceforge.net/lists/listinfo/playerstage-users > > |
From: Toby C. <tco...@pl...> - 2006-10-19 19:49:59
|
Hi, start player with the -d 9 option and it will give you more debug information about loading the driver. Also might be worth posting your modified makefile.am Toby Vinh wrote: > ..and if calling player I receive this weired error, even though the > compilation went fine. > I attached the slightly modified files derived from the exampledriver. > > GeekBook:~/virtualGPS/test vpdn$ ls > Makefile virtualGPSdriver.cc > virtualGPSdriver.o > libvirtualGPSdriver.dylib virtualGPSdriver.cfg > libvirtualGPSdriver.la virtualGPSdriver.cfg~ > GeekBook:~/virtualGPS/test vpdn$ rm virtualGPSdriver.o > libvirtualGPSdriver.dylib > GeekBook:~/virtualGPS/test vpdn$ make > g++ `pkg-config --cflags playercore` -Wall -g3 -dynamiclib -c > virtualGPSdriver.cc > g++ -bundle -flat_namespace -undefined suppress -o > libvirtualGPSdriver.dylib virtualGPSdriver.o > GeekBook:~/virtualGPS/test vpdn$ player ./virtualGPSdriver.cfg > > * Part of the Player/Stage/Gazebo Project > [http://playerstage.sourceforge.net]. > * Copyright (C) 2000 - 2006 Brian Gerkey, Richard Vaughan, Andrew Howard, > * Nate Koenig, and contributors. Released under the GNU General Public > License. > * Player comes with ABSOLUTELY NO WARRANTY. This is free software, > and you > * are welcome to redistribute it under certain conditions; see COPYING > * for details. > > trying to load /Users/vpdn/virtualGPS/test/./libvirtualGPSdriver... > trying to load /usr/local/lib/libvirtualGPSdriver... > trying to load libvirtualGPSdriver... > error : error loading plugin: libvirtualGPSdriver > error : failed to load plugin: libvirtualGPSdriver > error : failed to parse config file ./virtualGPSdriver.cfg > > > > On 10/20/06, Vinh <arb...@go...> wrote: >> Hi everyone, >> I'm trying to write a driver now. I have found this tutorial, but >> still have problems: >> http://cgi.cse.unsw.edu.au/~cs4411/wiki/index.php?title=Writing_player_drivers >> >> >> The example driver provided with player 2.0.3 compiles for me (MacOSX) >> and I can use exampledriver.cfg to load up with player. >> However if I change some code - really simple such as "puts ("bla") in >> between of some other outputs - it never gets called. So I doubt that >> my code is actually processed. Is there anything I'm doing wrong? >> >> I have some opencv code which detects moving objects. I now want to >> provide this information in form of a driver to some player clients. >> As I understood I need to write a driver supporting the position2d >> proxy interface and implementing the message type >> PLAYER_POSITION2D_DATA_STATE. >> >> Vinh >> > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 > ------------------------------------------------------------------------ > > _______________________________________________ > Playerstage-users mailing list > Pla...@li... > https://lists.sourceforge.net/lists/listinfo/playerstage-users > |
From: Brian G. <br...@ge...> - 2006-10-19 17:04:27
|
On Oct 19, 2006, at 8:17 AM, Vinh wrote: > Hi everyone, > I'm trying to write a driver now. I have found this tutorial, but > still have problems: > http://cgi.cse.unsw.edu.au/~cs4411/wiki/index.php? > title=Writing_player_drivers > > The example driver provided with player 2.0.3 compiles for me (MacOSX) > and I can use exampledriver.cfg to load up with player. > However if I change some code - really simple such as "puts ("bla") in > between of some other outputs - it never gets called. So I doubt that > my code is actually processed. Is there anything I'm doing wrong? Where did you put the print statement? Are you subscribing to the device, or specifying "alwayson 1" in your .cfg file? Otherwise your driver will never be initialized. > I have some opencv code which detects moving objects. I now want to > provide this information in form of a driver to some player clients. > As I understood I need to write a driver supporting the position2d > proxy interface and implementing the message type > PLAYER_POSITION2D_DATA_STATE. position2d is designed to report the pose of a single entity, such as a robot. If you're tracking moving objects, you might want to consider either the fiducial or blobfinder interfaces. brian. |