From 3e7454436f3af6cca17cd28b7243074e49de31fd Mon Sep 17 00:00:00 2001 From: David Soto Date: Mon, 27 Mar 2017 23:54:34 -0400 Subject: [PATCH] PASSIVE SONAR: make paulboard_driver a python pkg The scripts here were demoted from being a ros package. It should be removed from the SubjuGator repo. --- drivers/mil_passive_sonar/README.md | 16 +++-- drivers/mil_passive_sonar/launch/test.launch | 4 +- .../paulboard_driver/CMakeLists.txt | 66 ------------------ .../paulboard_driver/README.md | 19 ++++- .../{blobs => }/SimpleHyd2013.bin | Bin .../{src/paulboard_driver => }/__init__.py | 0 .../paulboard_driver => }/ais_bootloader.py | 0 .../paulboard_driver/package.xml | 29 -------- .../{scripts => }/paulboard_driver | 0 .../paulboard_driver/setup.py | 13 ---- .../src/paulboard_driver/SimpleHyd2013.bin | Bin 33440 -> 0 bytes drivers/mil_passive_sonar/setup.py | 4 +- 12 files changed, 33 insertions(+), 118 deletions(-) delete mode 100644 drivers/mil_passive_sonar/paulboard_driver/CMakeLists.txt rename drivers/mil_passive_sonar/paulboard_driver/{blobs => }/SimpleHyd2013.bin (100%) rename drivers/mil_passive_sonar/paulboard_driver/{src/paulboard_driver => }/__init__.py (100%) rename drivers/mil_passive_sonar/paulboard_driver/{src/paulboard_driver => }/ais_bootloader.py (100%) mode change 100644 => 100755 delete mode 100644 drivers/mil_passive_sonar/paulboard_driver/package.xml rename drivers/mil_passive_sonar/paulboard_driver/{scripts => }/paulboard_driver (100%) delete mode 100644 drivers/mil_passive_sonar/paulboard_driver/setup.py delete mode 100644 drivers/mil_passive_sonar/paulboard_driver/src/paulboard_driver/SimpleHyd2013.bin diff --git a/drivers/mil_passive_sonar/README.md b/drivers/mil_passive_sonar/README.md index 7e808471..9fc82f1d 100644 --- a/drivers/mil_passive_sonar/README.md +++ b/drivers/mil_passive_sonar/README.md @@ -2,15 +2,23 @@ This script interfaces with Jake's sonar board and provides a ROS service that returns the location and time of emission of the last heard pinger pulse. -### How to run and use +## How to run and use To start the driver, run: - roslaunch sub8_sonar sonar.launch + rosrun mil_passive_sonar sonar.launch -*Note: In /launch/sonar.launch, make sure that port and baud are set correctly, and that the hydrophones' coordinates in the sonar frame are accurate.* +> Note: make sure that port, and baud rate, and hydrophone locations are loaded into the parameter server. See launch/test.launch for an example. In order to ask for hydrophone information: rosservice call /sonar/get_pinger_pulse *double_tab* -The service should respond with the x, y, z, and t of the emission of the last heard pinger pulse. +The service should respond with the x, y, and z of the last heard pinger +pulse. Remember that this should be considered the tip of an arrow +pointing in the direction of the pinger, the range is completely unreliable +and varies wildly. + +## TODO ++ This package is not yet fully set up to use the paulbaurd. The interface to make this happen would be simple to implement. ++ This package should estimate the least squares solution for the actual 3d position of the pinger. ++ Visualize both individual heading veactors and the LS position estimate. diff --git a/drivers/mil_passive_sonar/launch/test.launch b/drivers/mil_passive_sonar/launch/test.launch index 7eff7b7f..206be6b9 100644 --- a/drivers/mil_passive_sonar/launch/test.launch +++ b/drivers/mil_passive_sonar/launch/test.launch @@ -1,5 +1,5 @@ - + - - Matthew Thompson - - - catkin - - - rospy - hydrophones - - - rospy - hydrophones - - - - - - \ No newline at end of file diff --git a/drivers/mil_passive_sonar/paulboard_driver/scripts/paulboard_driver b/drivers/mil_passive_sonar/paulboard_driver/paulboard_driver similarity index 100% rename from drivers/mil_passive_sonar/paulboard_driver/scripts/paulboard_driver rename to drivers/mil_passive_sonar/paulboard_driver/paulboard_driver diff --git a/drivers/mil_passive_sonar/paulboard_driver/setup.py b/drivers/mil_passive_sonar/paulboard_driver/setup.py deleted file mode 100644 index bc1213b0..00000000 --- a/drivers/mil_passive_sonar/paulboard_driver/setup.py +++ /dev/null @@ -1,13 +0,0 @@ -## ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD - -from distutils.core import setup -from catkin_pkg.python_setup import generate_distutils_setup - -# fetch values from package.xml -setup_args = generate_distutils_setup( - packages=['paulboard_driver'], - package_dir={'': 'src'}, - requires=[], # TODO -) - -setup(**setup_args) \ No newline at end of file diff --git a/drivers/mil_passive_sonar/paulboard_driver/src/paulboard_driver/SimpleHyd2013.bin b/drivers/mil_passive_sonar/paulboard_driver/src/paulboard_driver/SimpleHyd2013.bin deleted file mode 100644 index 4b4c50a08d614cd4256faaceadbf2c4137bb507d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33440 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 Fe*