From 069d6943ba52e546b268fd7546cb24d6646835bf Mon Sep 17 00:00:00 2001 From: Woensug Choi Date: Tue, 8 Feb 2022 11:01:35 +0900 Subject: [PATCH 1/9] add resetPhysics() --- kinematics_ros_plugins/src/KinematicsROSPlugin.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kinematics_ros_plugins/src/KinematicsROSPlugin.cc b/kinematics_ros_plugins/src/KinematicsROSPlugin.cc index 9ac858ca..5c6fdabe 100644 --- a/kinematics_ros_plugins/src/KinematicsROSPlugin.cc +++ b/kinematics_ros_plugins/src/KinematicsROSPlugin.cc @@ -336,8 +336,10 @@ void KinematicsROSPlugin::ConveyCommands( { // Convey commands to functions this->ConveyKinematicsCommands(_msg); - this->controlMsgDetected = true; + + // Eliminate Gazebo physics + this->model->ResetPhysicsStates(); } ///////////////////////////////////////////////// From ecaa755e6e6c65a2788757be1d1edd20f0852d0a Mon Sep 17 00:00:00 2001 From: Woensug Choi Date: Fri, 11 Feb 2022 14:10:06 +0900 Subject: [PATCH 2/9] rearrange examples --- README.md | 80 +- docker/Dockerfile | 4 +- .../worlds/BuzzBay_stratified_current.world | 14 +- .../bear/simulation/initialLatLon.env | 8 - .../transientOceanCurrentDatabase.csv | 101 - .../ACT1951_1_Annual_2021_local.csv | 0 .../bear/simulation/BuzzBay.launch | 10 +- .../bear/simulation/BuzzBay.world | 18 +- .../bear/simulation/PuertoRico.launch | 14 +- .../bear/simulation/PuertoRico.world | 12 +- ...pload_glider_hybrid_whoi_kinematics.launch | 62 + ..._hybrid_whoi_default_kinematics.urdf.xacro | 31 + .../glider_hybrid_whoi_base_kinematics.xacro | 211 + ...lider_hybrid_whoi_sensors_kinematics.xacro | 93 + .../urdf/uw_hector_gps_plugin.xacro | 32 + .../urdf/uw_hector_imu_plugin.xacro | 61 + .../materials/scripts/texture.material | 18 + ...-67.010_17.950_17.960.epsg3857.texture.png | Bin 0 -> 46333 bytes ...-67.020_-67.010_17.950_17.960.epsg3857.obj | 639410 +++++++++++++++ ...020_-67.010_17.950_17.960.epsg3857.obj.mtl | 13 + .../model.config | 21 + .../model.sdf | 39 + .../transientOceanCurrentDatabase_local.csv | 15 + 23 files changed, 640082 insertions(+), 185 deletions(-) delete mode 100644 glider_launch_world_example/bear/simulation/initialLatLon.env delete mode 100644 glider_launch_world_example/bear/simulation/transientOceanCurrentDatabase.csv rename glider_launch_world_example/bear/simulation/ACT1951_1_Annual_2021.csv => local_glider_files_example/bear/simulation/ACT1951_1_Annual_2021_local.csv (100%) rename glider_launch_world_example/bear/simulation/PuertoRico_stratified_current_docker.launch => local_glider_files_example/bear/simulation/BuzzBay.launch (80%) rename glider_launch_world_example/bear/simulation/BuzzBay_stratified_current_docker.world => local_glider_files_example/bear/simulation/BuzzBay.world (89%) rename glider_launch_world_example/bear/simulation/BuzzBay_stratified_current_docker.launch => local_glider_files_example/bear/simulation/PuertoRico.launch (75%) rename glider_launch_world_example/bear/simulation/PuertoRico_stratified_current_docker.world => local_glider_files_example/bear/simulation/PuertoRico.world (91%) create mode 100644 local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/launch/upload_glider_hybrid_whoi_kinematics.launch create mode 100644 local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/robots/glider_hybrid_whoi_default_kinematics.urdf.xacro create mode 100644 local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_base_kinematics.xacro create mode 100644 local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_sensors_kinematics.xacro create mode 100644 local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/uw_hector_gps_plugin.xacro create mode 100644 local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/uw_hector_imu_plugin.xacro create mode 100644 local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/materials/scripts/texture.material create mode 100644 local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/materials/textures/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857.texture.png create mode 100644 local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/mesh/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857.obj create mode 100644 local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/mesh/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857.obj.mtl create mode 100644 local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/model.config create mode 100644 local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/model.sdf create mode 100644 local_glider_files_example/bear/simulation/transientOceanCurrentDatabase_local.csv diff --git a/README.md b/README.md index 69ea91d2..3e23012e 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,22 @@ -# Kinematics plugin for WHOI hybrid gliders -Kinematics control plugin for WHOI hybrid gliders +# (Hybrid-) AUG Simulator +```diff +- Summary Poster (2022-02-10) +``` +![Poster](https://user-images.githubusercontent.com/7955120/153356178-ad6c20a5-9418-48f7-b287-292c8a000572.png) ## Requirements + ```diff -- If not using docker environment, use bathymetry_plugin_whoi branch of the dave repo -# at dave repo -git cehckout bathymetry_plugin_whoi +- If not using docker environment, use bathymetry_plugin_whoi branch of the dave repo fork +# Use the bathymetry_plugin_whoi branch at the fork of the dave repo +git clone https://github.com/woensug-choi/dave.git +git checkout bathymetry_plugin_whoi - The IMU/GPS sensor included in this repo requires hector libraries. You may install with following command sudo apt-get install ros-noetic-hector-gazebo-plugins - The initial position setter requires python version of gdal -sudo apt-get install python3-gdal +sudo apt install python3-gdal=3.0.4+dfsg-1build3 +- GPS Viewer requires pyQt and folium modules +pip3 install folium PyQtWebEngine pyqt5-tools - The kinematics/dynamics plugin uses UwGliderStatus/UwGliderCommand msg to interact with the vehicle git clone https://github.com/Field-Robotics-Lab/frl_msgs - nps_uw_sensors_gazebo repository is required @@ -17,14 +24,22 @@ git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git ``` ## Utility guide (live document) + * https://docs.google.com/document/d/1Rlh-2ZkqkKEEsECacgi9XIiPgPHdoRVjJmTLnLg1Bu4/edit?usp=sharing ## How-to + ### Installation + * First check to make sure you meet the [System Requirements](https://github.com/Field-Robotics-Lab/dave/wiki/System-Requirements). * Then choose from one of the following two installation options: 1. **Directly on Host** 1. [Install environment and dependent repositories](https://github.com/Field-Robotics-Lab/dave/wiki/Install-Directly-on-Host) : Instructions to install ROS Noetic, Gazebo 11, UUV Simulator and DAVE directly on your host machine. + ```diff + - When cloning the dave repo, bathymetry_plugin_whoi branch of the dave repo fork + git clone https://github.com/woensug-choi/dave.git + git checkout bathymetry_plugin_whoi + ``` 2. Clone this repository in `~/uuv/src` folder and compile with `catkin_make` at `~/uuv_ws` directory. 2. **Using Docker** 1. Make sure you have Docker v19.03 or higher ([installation instructions](https://docs.docker.com/engine/install/ubuntu/)) and nvidia-container-toolkit ([installation instructions](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#setting-up-nvidia-container-toolkit)) @@ -44,29 +59,9 @@ git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git source ~/glider_hybrid_whoi/install/setup.bash ``` Fore more including docker-compose: [Docker environment description](https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/master/docker/README.MD) - 3. **Using docker-compose** - 1. Run the `build.bash` script located in the `docker` folder of this repository - ``` - ./build.bash - ``` - 2. Run the container - ``` - docker-compose up - ``` - 2. Send mission commands from another terminal - ``` - docker-compose exec glider_extctl_sim /ros_entrypoint.sh rosrun slocum_glider_extctl_sim slocum_glider_sim_console - # Ctrl+C to land on mission command terminal - run initbuzz.mi - run backse01.mi - ``` - 3. Access log CSV file - ``` - ./join.bash - tail -f /tmp/Kinematics KinematicsLog.csv ``` -### Quickstart +### Quickstart (For running simulator only) * Running the simulator (Run each commands in separate terminal window) 1. Spawn underwater world with gazebo @@ -85,11 +80,15 @@ git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git ``` rostopic echo /glider_hybrid_whoi/kinematics/UwGliderStatus ``` -## Interface + 5. Access log files + - Location of the log CSV file : `/tmp/KinematicsLog.csv` + - Location of the standalone GPS log HTML file : `/tmp/GPSViewer_log.html` + +## Interface with slocum glider driver simulator + For view/edit : [Google Drawing Raw file link](https://docs.google.com/drawings/d/1pj5O0DZ_2o480-9z-qvqAat_yXFckzXrrgTLxbgDyxo/edit?usp=sharing) ![resources](https://docs.google.com/drawings/d/e/2PACX-1vTMQxfsQmqEMxr5fZ30UBqPzI6ULpPdf2XNiF2ak633ty7KP532fMXOgHIJEqI7Z-o-Ok6vdjtgwYdC/pub?w=960&h=720) - The `slocum_glider_sim_driver` and `slocum_glider_sim_console` nodes are provided by [https://gitlab.com/sentinel-aug/ros/slocum_glider](https://gitlab.com/sentinel-aug/ros/slocum_glider) @@ -101,8 +100,6 @@ provided by [https://gitlab.com/sentinel-aug/ros/slocum_glider](https://gitlab.c - Click the `play` button on the Gazebo window and wait for the first bathymetry to be spawned. Next bathymetry tile will be spawned and the previous tile will be removed automatically according to the glider position. ```bash roslaunch glider_hybrid_whoi_gazebo BuzzBay_stratified_current.launch - # if in docker environment - roslaunch glider_hybrid_whoi_gazebo BuzzBay_stratified_current_docker.launch ``` ### Surface detection @@ -112,6 +109,20 @@ provided by [https://gitlab.com/sentinel-aug/ros/slocum_glider](https://gitlab.c - https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/pull/31 - Demo case : `roslaunch glider_hybrid_whoi_gazebo start_demo_kinematics_stratified_current_two_gliders.launch` +### GPS Viewer +```xml + + + + + + +``` +- `namespace` : name of the vehicle model +- `refresh_rate` : refresh rate for GPS position marker update in the map +- `save_html` : Save GPS log as seen on the viewer as HTML which will be saved at `/tmp/GPSViewer_log.html` which you can open with a browser +- `default_zoom` : set initial zoom (range from 0 to 15, larger mean more zoom) + ### Live Feed to Fledermaus - Live feeding to Fledermaus's Vessel Manager to visualize its location is now available using UDP connection with NMEA strings. - Assumes you are running on WSL2 at Windows machine @@ -124,7 +135,7 @@ provided by [https://gitlab.com/sentinel-aug/ros/slocum_glider](https://gitlab.c ``` and restart the WSL by `wsl --shutdown` at cmd. -### Glider dynamic parameters +### Glider kinematics/dynamics parameters - Parametes for pitch control, buoyancy induced velocity with the flight model, and thruster power is defined at [glider_hybrid_whoi_base_kinematics.xacro](https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/10524388cce32865ae051e285dbe631ea89159e4/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_base_kinematics.xacro#L139) #### Pitch control @@ -161,7 +172,4 @@ provided by [https://gitlab.com/sentinel-aug/ros/slocum_glider](https://gitlab.c | Lat/Lon | Roll-Pitch-Yaw | Heading | Depth | Altitude | Power | Rudder angle | Battery position | Pumped Volume | nav_sat_fix | | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | | :heavy_check_mark:* | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark:* | :heavy_multiplication_x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -- Lat/Lon is acquired from the GPS sensor and Altitude from the DVL sensor. Which is also sent through nav_sat_fix - -#### Code Structure Diagram -![image](https://user-images.githubusercontent.com/7955120/101485884-2ba8d400-399f-11eb-90ab-6f1be48d3f18.png) +- Lat/Lon is acquired from the GPS sensor and Altitude from the DVL sensor. Which is also sent through nav_sat_fix \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index 80a3600e..d17cf4d9 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,7 +5,7 @@ #------------------------------------------------------------------# # Dependency versions -ARG version_dave=9a7dd78aaa1bac60c63e321926e6c36539128866 +ARG version_dave=64ab207da01e0a71fd5102f8787984520c339814 ARG version_uuv_simulator=4936e739d48807527fdcd3ba3d19c147277003ce ARG version_uuv_manipulators=d324a6a6ac9f3b6c86427d7ed9795c09c14e659c ARG version_uw_sensors_gazebo=eda6787830bd2c7f31eacfe9f2aab961b879ab3e @@ -122,7 +122,7 @@ ARG version_dave ENV VERSION_DAVE=$version_dave ARG version_uw_sensors_gazebo ENV VERSION_UW_SENSORS_GAZEBO=$version_uw_sensors_gazebo -RUN curl -fsSL https://github.com/Field-Robotics-Lab/dave/archive/$VERSION_DAVE.tar.gz | tar xz \ +RUN curl -fsSL https://github.com/woensug-choi/dave/archive/$VERSION_DAVE.tar.gz | tar xz \ && curl -fsSL https://github.com/Field-Robotics-Lab/nps_uw_sensors_gazebo/archive/$VERSION_UW_SENSORS_GAZEBO.tar.gz | tar xz ARG version_uuv_simulator diff --git a/glider_hybrid_whoi_gazebo/worlds/BuzzBay_stratified_current.world b/glider_hybrid_whoi_gazebo/worlds/BuzzBay_stratified_current.world index 1db061f1..255c6475 100644 --- a/glider_hybrid_whoi_gazebo/worlds/BuzzBay_stratified_current.world +++ b/glider_hybrid_whoi_gazebo/worlds/BuzzBay_stratified_current.world @@ -87,23 +87,14 @@ stratified_current_velocity_database - transientOceanCurrentDatabase.csv - - - - + - ACT1951_1_Annual_2021.csv - - - - @@ -177,6 +168,3 @@ - - - diff --git a/glider_launch_world_example/bear/simulation/initialLatLon.env b/glider_launch_world_example/bear/simulation/initialLatLon.env deleted file mode 100644 index f1aa554c..00000000 --- a/glider_launch_world_example/bear/simulation/initialLatLon.env +++ /dev/null @@ -1,8 +0,0 @@ -# Put '-' (negative) before the value -# e.g. for (LATITUDE,LONGITUDE)=(41.5522,-70.6803) -# Correct value will be -# LATITUDE=-41.5522 -# LONGITUDE=--70.6803 - -LATITUDE=-17.92" -LONGITUDE=--67.25 \ No newline at end of file diff --git a/glider_launch_world_example/bear/simulation/transientOceanCurrentDatabase.csv b/glider_launch_world_example/bear/simulation/transientOceanCurrentDatabase.csv deleted file mode 100644 index 06e3a243..00000000 --- a/glider_launch_world_example/bear/simulation/transientOceanCurrentDatabase.csv +++ /dev/null @@ -1,101 +0,0 @@ -# Information -Information about this data can be written here (in one line without comma),, -"# Data (North direction velocity [m/s], East direction velocity [m/s], Depth [m])",, -0.541725954,0,0 -0.923985414,1,0.2 -0.972570631,2,0.4 -0.660183699,3,0.6 -0.743895893,4,0.8 -0.549277029,5,1 -0.399874821,6,1.2 -0.468006426,7,1.4 -0.98743673,8,1.6 -0.584356422,9,1.8 -1.19961304,10,2 -1.019801211,11,2.2 -1.465061972,12,2.4 -1.145591551,13,2.6 -1.613284989,14,2.8 -1.185141271,15,3 -1.468162955,16,3.2 -1.184429046,17,3.4 -1.363582537,18,3.6 -1.17278383,19,3.8 -1.227143302,20,4 -1,21,4.2 -1.059696107,22,4.4 -0.741921435,23,4.6 -1.032747623,24,4.8 -0.905036815,25,5 -1.018183603,26,5.2 -0.702910613,27,5.4 -0.89680626,28,5.6 -0.65485025,29,5.8 -1.085601548,30,6 -0.501838244,31,6.2 -1.150031851,32,6.4 -0.968356458,33,6.6 -1.224894798,34,6.8 -0.99551949,35,7 -1.164317161,36,7.2 -0.862944917,37,7.4 -0.120926673,38,7.6 -0.856735026,39,7.8 -1.054870399,40,8 -1.40051876,41,8.2 -0.985839727,42,8.4 -1.748385765,43,8.6 -0.797520941,44,8.8 -1.633353854,45,9 -1.118143404,46,9.2 -1.680419687,47,9.4 -0.871718921,48,9.6 -1.607350455,49,9.8 -1.794205974,50,10 -1.436815038,51,10.2 -2.017944604,52,10.4 -1.568525353,53,10.6 -1.776697744,54,10.8 -2.096194443,55,11 -1.656247656,56,11.2 -2.35384311,57,11.4 -1.162511652,58,11.6 -2.386203275,59,11.8 -1.163058343,60,12 -1.623175056,61,12.2 -1.032281319,62,12.4 -1.204137372,63,12.6 -2.357136685,64,12.8 -1.057120904,65,13 -2.143524815,66,13.2 -0.909844358,67,13.4 -1.753569167,68,13.6 -0.718448023,69,13.8 -0.99219574,70,14 -0.409664894,71,14.2 -1.473239812,72,14.4 -0.888004696,73,14.6 -1.777207068,74,14.8 -1.738535547,75,15 -1.369761257,76,15.2 -1.165149852,77,15.4 -2.355627359,78,15.6 -2.409780327,79,15.8 -2.48979506,80,16 -2.804524266,81,16.2 -1.273025233,82,16.4 -1.97732265,83,16.6 -2.400593598,84,16.8 -2.17964571,85,17 -2.155734892,86,17.2 -3.245998188,87,17.4 -1.500418387,88,17.6 -2.76286601,89,17.8 -3.708657651,90,18 -4.138763504,91,18.2 -3.250522624,92,18.4 -3.193428702,93,18.6 -3.381071229,94,18.8 -3.237706875,95,19 - - diff --git a/glider_launch_world_example/bear/simulation/ACT1951_1_Annual_2021.csv b/local_glider_files_example/bear/simulation/ACT1951_1_Annual_2021_local.csv similarity index 100% rename from glider_launch_world_example/bear/simulation/ACT1951_1_Annual_2021.csv rename to local_glider_files_example/bear/simulation/ACT1951_1_Annual_2021_local.csv diff --git a/glider_launch_world_example/bear/simulation/PuertoRico_stratified_current_docker.launch b/local_glider_files_example/bear/simulation/BuzzBay.launch similarity index 80% rename from glider_launch_world_example/bear/simulation/PuertoRico_stratified_current_docker.launch rename to local_glider_files_example/bear/simulation/BuzzBay.launch index c0305e86..8f7de742 100644 --- a/glider_launch_world_example/bear/simulation/PuertoRico_stratified_current_docker.launch +++ b/local_glider_files_example/bear/simulation/BuzzBay.launch @@ -5,8 +5,9 @@ - - + + + @@ -22,7 +23,6 @@ - @@ -31,8 +31,8 @@ - - + + diff --git a/glider_launch_world_example/bear/simulation/BuzzBay_stratified_current_docker.world b/local_glider_files_example/bear/simulation/BuzzBay.world similarity index 89% rename from glider_launch_world_example/bear/simulation/BuzzBay_stratified_current_docker.world rename to local_glider_files_example/bear/simulation/BuzzBay.world index a6d6334a..02385b66 100644 --- a/glider_launch_world_example/bear/simulation/BuzzBay_stratified_current_docker.world +++ b/local_glider_files_example/bear/simulation/BuzzBay.world @@ -12,11 +12,11 @@ limitations under the License. --> - + 0.1 - - 0 + 1 + 10 quick @@ -87,12 +87,14 @@ stratified_current_velocity_database - transientOceanCurrentDatabase.csv + transientOceanCurrentDatabase_local.csv + - ACT1951_1_Annual_2021.csv + + ACT1951_1_Annual_2021_local.csv @@ -130,7 +132,7 @@ 10 4 2021 - 16 + 14 52 @@ -140,7 +142,7 @@ - @@ -165,4 +167,4 @@ - \ No newline at end of file + diff --git a/glider_launch_world_example/bear/simulation/BuzzBay_stratified_current_docker.launch b/local_glider_files_example/bear/simulation/PuertoRico.launch similarity index 75% rename from glider_launch_world_example/bear/simulation/BuzzBay_stratified_current_docker.launch rename to local_glider_files_example/bear/simulation/PuertoRico.launch index 049511d8..1825fffd 100644 --- a/glider_launch_world_example/bear/simulation/BuzzBay_stratified_current_docker.launch +++ b/local_glider_files_example/bear/simulation/PuertoRico.launch @@ -5,8 +5,9 @@ - - + + + @@ -22,17 +23,15 @@ - - - + + - - + @@ -58,6 +57,7 @@ + diff --git a/glider_launch_world_example/bear/simulation/PuertoRico_stratified_current_docker.world b/local_glider_files_example/bear/simulation/PuertoRico.world similarity index 91% rename from glider_launch_world_example/bear/simulation/PuertoRico_stratified_current_docker.world rename to local_glider_files_example/bear/simulation/PuertoRico.world index d13994df..f818ecfe 100644 --- a/glider_launch_world_example/bear/simulation/PuertoRico_stratified_current_docker.world +++ b/local_glider_files_example/bear/simulation/PuertoRico.world @@ -87,12 +87,14 @@ stratified_current_velocity_database - transientOceanCurrentDatabase.csv + transientOceanCurrentDatabase_local.csv + - ACT1951_1_Annual_2021.csv + + ACT1951_1_Annual_2021_local.csv @@ -130,7 +132,7 @@ 10 4 2021 - 16 + 14 52 @@ -140,7 +142,7 @@ - @@ -165,4 +167,4 @@ - \ No newline at end of file + diff --git a/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/launch/upload_glider_hybrid_whoi_kinematics.launch b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/launch/upload_glider_hybrid_whoi_kinematics.launch new file mode 100644 index 00000000..5aaed4e9 --- /dev/null +++ b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/launch/upload_glider_hybrid_whoi_kinematics.launch @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/robots/glider_hybrid_whoi_default_kinematics.urdf.xacro b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/robots/glider_hybrid_whoi_default_kinematics.urdf.xacro new file mode 100644 index 00000000..0b283bb3 --- /dev/null +++ b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/robots/glider_hybrid_whoi_default_kinematics.urdf.xacro @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + diff --git a/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_base_kinematics.xacro b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_base_kinematics.xacro new file mode 100644 index 00000000..9ea573e3 --- /dev/null +++ b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_base_kinematics.xacro @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FirstOrder + 0.0 + + + Basic + 0.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${namespace}/thruster_${thruster_id} + ${namespace}/thruster_${thruster_id}_joint + ${thruster_id} + + + + + false + + + + + + + + + + + + + + + + + + + + + + ${namespace}/thruster_${thruster_id} + ${namespace}/thruster_${thruster_id}_joint + ${thruster_id} + + + + + false + + + + + + ${fluid_density} + true + /hydrodynamics/current_velocity/${namespace} + true + + 1.2565 + -0.055 + 0.345 + 0.2534 + 0.4160 + 1.8953 + -1.995 + 1.8701 + -0.020919 + 1.4699 + 0.97895 + + + hydrodynamics/current_velocity/${namespace} + ${namespace}/base_link + + stratified_current_velocity_database + + 0.3 + 0.0 + + + 0.3 + 0.0 + + + 0.3 + 0.0 + + + false + + + + + + /${namespace} + /${namespace}/robot_description + + + 1.0 + + + + + + + + + + + + diff --git a/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_sensors_kinematics.xacro b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_sensors_kinematics.xacro new file mode 100644 index 00000000..4618f33e --- /dev/null +++ b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_sensors_kinematics.xacro @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/uw_hector_gps_plugin.xacro b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/uw_hector_gps_plugin.xacro new file mode 100644 index 00000000..e98c06d1 --- /dev/null +++ b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/uw_hector_gps_plugin.xacro @@ -0,0 +1,32 @@ + + + + + + + + + true + 0.25 + ${body_name} + hector_gps + hector_gps_velocity + 0.0 0.0 0.0 + 0.0 0.0 0.0 + 0 0 0 + 0.0 0.0 0.0 + + 10 + + + 2 + + + + + + + + \ No newline at end of file diff --git a/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/uw_hector_imu_plugin.xacro b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/uw_hector_imu_plugin.xacro new file mode 100644 index 00000000..101e77f4 --- /dev/null +++ b/local_glider_files_example/bear/simulation/glider_hybrid_whoi_description/urdf/uw_hector_imu_plugin.xacro @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + 10 + ${parent} + hector_imu + ${namespace} + hector_imu/is_calibrated + 0.00000001 + 0 + 0 + 0 0 0 + 0 0 0 + world + + + + + + + + + diff --git a/local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/materials/scripts/texture.material b/local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/materials/scripts/texture.material new file mode 100644 index 00000000..15b5246a --- /dev/null +++ b/local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/materials/scripts/texture.material @@ -0,0 +1,18 @@ +material Bathymetry/puertoRico_sw.R_-67.020_-67.010_17.950_17.960 +{ + technique + { + pass + { + ambient 0.5 0.5 0.5 1.0 + diffuse 0.5 0.5 0.5 1.0 + specular 0.2 0.2 0.2 1.0 12.5 + + texture_unit + { + texture ../textures/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857.texture.png + scale 1 1 + } + } + } +} \ No newline at end of file diff --git a/local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/materials/textures/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857.texture.png b/local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/materials/textures/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857.texture.png new file mode 100644 index 0000000000000000000000000000000000000000..bf04d324dc71eeb8a66f7a023d8990341472bbb0 GIT binary patch literal 46333 zcmV*HKxn^-P)Q+6J& zqNAp~7g1)WJ;#@#EUvw=!T$L_{`ddm@BR&-Gsc0i z{^u=cJsP2M^lk|nRI6TBkJpZ=l%}~`b*iKFy+G>2?n$@2T91tkyKb>oWM$;)aaw&? zJ*Vz<FSBU!u6%h9~6aZc6=;Y1;fN_)vjp;&_|6G4BAk^O=*)A}F z{yxR1kPrWV!atH6wcOwGN@>#|UFQ6xT zx&aXK9Ng5DUjTRmpr(9w0SCtwfS?QGfTRn7yAYulHGybI#;tzWKT~0(COmB*0)G;Q zNi1S&xet*wu{J4pyx#$85G`A7OpSgV+Q;sWgccK>nY`Na17XngC5IE9VAE5#u zL06@M6yN~3tur%8O^%@wC+LMX+~^XzxgG`)#dO-%gP^ldaMd57a--^!k!q6>9>mN(T+4xK& zLjz#k{j|TeU1|O0&amyN1kYd`yiVUvQ&NZKbCf4&H#~_a!b7Fz#ZMXO@`bu=r&OmD z`WN4}55P$6JzmRBM>U3G_@tOkFRa``z88f}FVs0jGpQT&LYq+xzYRK)AVJ#5B5cwC zqXa$`P-jYo!=@Lo=mlc*BG4x0XIJE0W#?iN2%k(O2t(9;(nD;lafwEa())~F#XUiE{*7R7NS{eK`54rRr8(FV4Hl^Uk@g`5xkz36TCe?7+2!ohUqO0*DoUj zKLRrGhgigW6!>#s@!lPqGO!qo(N|1WW57r-2GvNVF+Y_Vl2?dc7%D}UYiEjHq|^(S zUeqQM?USMWHqHT(GKfwOM^_*UI;0AVJ<_B(+e?#UXTdV3;AmS9Y4b`F0?F6wfsWh(u*8) zoCRWZ!SwU+Khvq@oD)Q!vCVX%4h|K99=IBi(ZJj3~oTGL_1_*Fx40WGtCx-qigONx<%U>lln@)TXY&( zG;1mnp^?Z$jy@4-pWJ&fAIWIL9Ax8ZEyuH9ns#g6`6efKGa8|uglec%`}=JStMg-? z*S_?^Q7@21FT6D)+8?4Hy%3G>g+VW_Bp~RDBS1IhdvQbDIAZu-Sc_xLMYBURjJB2p zx<$X}hMY-#IFj_DCGv;Hx!V(MoNKy;#t27KvNlAFFu7%$Z*|EM{4d(_U7v>WM3_8` zl<%QEHDcD*iOm7i)NsK48CK_|n@)PF7pWzw@`@zAkPA~)tc!+Bkf19S!2L!#K)9fr zMK8=0GUx>vWj1QpHdZ>nckYuS>of1HP|95)od4r3kWVjknD!=EyZz}tagjC*m`=i1 z4SSM!;4hw7HB;k}OIXu_+Z1`lF(SPfg9~S;v3^x%?kQycDJ!1i3{)e$PJckEOYqp} znojo9)bZIhCZ5sgg&A!kMK5eU<7#+aXfjcoMd(`73qe_~o$|X&FFX@T2Mr^uW!uh4 zQHQQ+4<9*8?|WBzkqzcg@R7x?kt?PhYwEPaBg_)wWXwr6CdI7uLSpG}d5gvD-sKOX z8a`G^H3pV?WMf>KUKr6SVw;&o>4i+eqZf3eBZS<#jBZfA6eJ|QxW7>W&`F+yBLrzB zqX4Kt0a0(CR+AX=;$ArPqOPfDB57}#e(f3irC+LZEHel_34Q2Ayp#i;wcxWprk;`Y z%VT{q<{%cEiKGiYi`R;(=j=;`UK9P3KFn5sq&y%0Dn?cpSK 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 + + + puertoRico_sw.R_-67.020_-67.010_17.950_17.960 + 1.0 + model.sdf + + + M. Jakuba + mjakuba@whoi.edu + Woensug Choi + woensug.choi@gmail.com + + + + + + Simplified topography/bathymetry in the region embedded in the model name. Coordinates are EPSG:3857(UTM). + https://github.com/Field-Robotics-Lab/Bathymetry_Converter for https://github.com/Field-Robotics-Lab/dave + + diff --git a/local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/model.sdf b/local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/model.sdf new file mode 100644 index 00000000..45640240 --- /dev/null +++ b/local_glider_files_example/bear/simulation/models/PuertoRico/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/model.sdf @@ -0,0 +1,39 @@ + + + + true + 0 0 0 0 0 0 + + false + + + + + + model://puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/mesh/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857.obj + 1 1 1 + + + + + + + + + + model://puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857/mesh/puertoRico_sw.R_-67.020_-67.010_17.950_17.960.epsg3857.obj + 1 1 1 + + + + + 0xffff + + + + + + diff --git a/local_glider_files_example/bear/simulation/transientOceanCurrentDatabase_local.csv b/local_glider_files_example/bear/simulation/transientOceanCurrentDatabase_local.csv new file mode 100644 index 00000000..dc446582 --- /dev/null +++ b/local_glider_files_example/bear/simulation/transientOceanCurrentDatabase_local.csv @@ -0,0 +1,15 @@ +0, 0, 0 +0.1, -0.2, 1 +0.1, -0.2, 2 +0.1, -0.2, 3 +0.1, -0.2, 4 +0.1, -0.3, 5 +0.1, -0.3, 10 +0.1, -0.4, 20 +0.1, -0.4, 30 +0.1, -0.5, 50 +0.1, -0.5, 100 +0.1, -0.5, 200 +0.1, -0.5, 300 +0.1, -0.5, 400 +0.1, -0.5, 600 \ No newline at end of file From 5eec1a9cb15bdb594299acd83543e0551a800946 Mon Sep 17 00:00:00 2001 From: Woensug Choi Date: Fri, 11 Feb 2022 14:24:02 +0900 Subject: [PATCH 3/9] minor fixes --- README.md | 15 +++++++-------- docker/Dockerfile | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 3e23012e..d2cd429f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # (Hybrid-) AUG Simulator -```diff - Summary Poster (2022-02-10) -``` ![Poster](https://user-images.githubusercontent.com/7955120/153356178-ad6c20a5-9418-48f7-b287-292c8a000572.png) ## Requirements @@ -25,8 +23,8 @@ git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git ## Utility guide (live document) -* https://docs.google.com/document/d/1Rlh-2ZkqkKEEsECacgi9XIiPgPHdoRVjJmTLnLg1Bu4/edit?usp=sharing - +* [Utility guide (google doc, live document)](https://docs.google.com/document/d/1Rlh-2ZkqkKEEsECacgi9XIiPgPHdoRVjJmTLnLg1Bu4/edit?usp=sharing) +s ## How-to ### Installation @@ -36,7 +34,7 @@ git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git 1. **Directly on Host** 1. [Install environment and dependent repositories](https://github.com/Field-Robotics-Lab/dave/wiki/Install-Directly-on-Host) : Instructions to install ROS Noetic, Gazebo 11, UUV Simulator and DAVE directly on your host machine. ```diff - - When cloning the dave repo, bathymetry_plugin_whoi branch of the dave repo fork + - When cloning the dave repo, bathymetry_plugin_whoi branch from the fork of the dave repo git clone https://github.com/woensug-choi/dave.git git checkout bathymetry_plugin_whoi ``` @@ -59,7 +57,6 @@ git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git source ~/glider_hybrid_whoi/install/setup.bash ``` Fore more including docker-compose: [Docker environment description](https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/master/docker/README.MD) - ``` ### Quickstart (For running simulator only) @@ -81,8 +78,10 @@ git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git rostopic echo /glider_hybrid_whoi/kinematics/UwGliderStatus ``` 5. Access log files - - Location of the log CSV file : `/tmp/KinematicsLog.csv` - - Location of the standalone GPS log HTML file : `/tmp/GPSViewer_log.html` + + - Location of the log CSV file : `/tmp/KinematicsLog.csv` + - Location of the standalone GPS log HTML file : `/tmp/GPSViewer_log.html` + ## Interface with slocum glider driver simulator diff --git a/docker/Dockerfile b/docker/Dockerfile index d17cf4d9..f2a8c2da 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,7 +5,7 @@ #------------------------------------------------------------------# # Dependency versions -ARG version_dave=64ab207da01e0a71fd5102f8787984520c339814 +ARG version_dave=076856502d2a71d2ecd07d080dff9968fd94da8d ARG version_uuv_simulator=4936e739d48807527fdcd3ba3d19c147277003ce ARG version_uuv_manipulators=d324a6a6ac9f3b6c86427d7ed9795c09c14e659c ARG version_uw_sensors_gazebo=eda6787830bd2c7f31eacfe9f2aab961b879ab3e From 66d29f105b0fd6100c14f09135800ca864509b02 Mon Sep 17 00:00:00 2001 From: Woensug Choi Date: Fri, 11 Feb 2022 14:43:34 +0900 Subject: [PATCH 4/9] toc --- README.md | 103 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 79 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index d2cd429f..d8ac34f7 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,34 @@ # (Hybrid-) AUG Simulator -- Summary Poster (2022-02-10) -![Poster](https://user-images.githubusercontent.com/7955120/153356178-ad6c20a5-9418-48f7-b287-292c8a000572.png) -## Requirements +## Contents + + +* [Summary Poster](#summary-poster) +* [Utility Guide](#utility-guide) +* [How-to](#how-to) + * [Installation](#installation) + * [Quickstart](#Quickstart) + * [Interface with slocum glider driver](#Interface-with-slocum-glider-driver-simulator) + * [Features](#Features) + * [Bathymetry included](#Bathymetry-included) + * [Surface detection](#Surface-detection) + * [Multiple gliders support](#Multiple-gliderssupport) + * [Live Feed to Fledermaus](#Live-Feed-to-Fledermaus) + * [Glider control parameters](#Glider-control-parameters) + * [Hybrid Glider 6DOF dynamics](#Hybrid-Glider-6DOF-dynamics) + +## Summary Poster (2022-02-10) -```diff -- If not using docker environment, use bathymetry_plugin_whoi branch of the dave repo fork -# Use the bathymetry_plugin_whoi branch at the fork of the dave repo -git clone https://github.com/woensug-choi/dave.git -git checkout bathymetry_plugin_whoi -- The IMU/GPS sensor included in this repo requires hector libraries. You may install with following command -sudo apt-get install ros-noetic-hector-gazebo-plugins -- The initial position setter requires python version of gdal -sudo apt install python3-gdal=3.0.4+dfsg-1build3 -- GPS Viewer requires pyQt and folium modules -pip3 install folium PyQtWebEngine pyqt5-tools -- The kinematics/dynamics plugin uses UwGliderStatus/UwGliderCommand msg to interact with the vehicle -git clone https://github.com/Field-Robotics-Lab/frl_msgs -- nps_uw_sensors_gazebo repository is required -git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git -``` +![Poster](https://user-images.githubusercontent.com/7955120/153356178-ad6c20a5-9418-48f7-b287-292c8a000572.png) -## Utility guide (live document) +- Parent repo : [Project DAVE](https://github.com/Field-Robotics-Lab/dave) + +## Utility guide * [Utility guide (google doc, live document)](https://docs.google.com/document/d/1Rlh-2ZkqkKEEsECacgi9XIiPgPHdoRVjJmTLnLg1Bu4/edit?usp=sharing) -s + ## How-to ### Installation @@ -37,8 +41,19 @@ s - When cloning the dave repo, bathymetry_plugin_whoi branch from the fork of the dave repo git clone https://github.com/woensug-choi/dave.git git checkout bathymetry_plugin_whoi + - The IMU/GPS sensor included in this repo requires hector libraries. You may install with following command + sudo apt-get install ros-noetic-hector-gazebo-plugins + - The initial position setter requires python version of gdal + sudo apt install python3-gdal=3.0.4+dfsg-1build3 + - GPS Viewer requires pyQt and folium modules + pip3 install folium PyQtWebEngine pyqt5-tools + - The kinematics/dynamics plugin uses UwGliderStatus/UwGliderCommand msg to interact with the vehicle + git clone https://github.com/Field-Robotics-Lab/frl_msgs + - nps_uw_sensors_gazebo repository is required + git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git ``` 2. Clone this repository in `~/uuv/src` folder and compile with `catkin_make` at `~/uuv_ws` directory. + 2. **Using Docker** 1. Make sure you have Docker v19.03 or higher ([installation instructions](https://docs.docker.com/engine/install/ubuntu/)) and nvidia-container-toolkit ([installation instructions](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#setting-up-nvidia-container-toolkit)) 2. Run the `build.bash` script located in the `docker` folder of this repository @@ -58,7 +73,9 @@ s ``` Fore more including docker-compose: [Docker environment description](https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/master/docker/README.MD) -### Quickstart (For running simulator only) +## Quickstart + +- This is for running the simulator only * Running the simulator (Run each commands in separate terminal window) 1. Spawn underwater world with gazebo @@ -134,7 +151,7 @@ provided by [https://gitlab.com/sentinel-aug/ros/slocum_glider](https://gitlab.c ``` and restart the WSL by `wsl --shutdown` at cmd. -### Glider kinematics/dynamics parameters +### Glider control parameters - Parametes for pitch control, buoyancy induced velocity with the flight model, and thruster power is defined at [glider_hybrid_whoi_base_kinematics.xacro](https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/10524388cce32865ae051e285dbe631ea89159e4/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_base_kinematics.xacro#L139) #### Pitch control @@ -171,4 +188,42 @@ provided by [https://gitlab.com/sentinel-aug/ros/slocum_glider](https://gitlab.c | Lat/Lon | Roll-Pitch-Yaw | Heading | Depth | Altitude | Power | Rudder angle | Battery position | Pumped Volume | nav_sat_fix | | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | ------------- | | :heavy_check_mark:* | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark:* | :heavy_multiplication_x: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -- Lat/Lon is acquired from the GPS sensor and Altitude from the DVL sensor. Which is also sent through nav_sat_fix \ No newline at end of file +- Lat/Lon is acquired from the GPS sensor and Altitude from the DVL sensor. Which is also sent through nav_sat_fix + +### Hybrid Glider 6DOF dynamics +```diff +- It's yet a draft PR +``` +- [EPIC-DAUG Glider dynamics Overleaf](https://www.overleaf.com/read/pqstymzccttj) + +#### Quickstart +```diff +- Change to 'dynamics_working' branch. `` handle is on by default. +``` +````bash +roslaunch glider_hybrid_whoi_gazebo start_demo_kinematics_stratified_current.launch +# At another terminal window +rostopic pub /glider_hybrid_whoi/kinematics/UwGliderCommand frl_vehicle_msgs/UwGliderCommand "pitch_cmd_type: 1 +target_pitch_value: -0.0001 +motor_cmd_type: 2 +target_motor_cmd: 0.1 +rudder_control_mode: 2 +rudder_angle: 4 +target_rudder_angle: 0.5 +target_pumped_volume: -220.0" +```` +![image](https://user-images.githubusercontent.com/7955120/135945104-810f4e2d-aa2e-4ade-aed8-0d7cb216085c.png) +Here, you see the glider ascending and yawing at a constant angle. As it rotates, the roll is also affected as seen in the bottom left camera feed. You can also see that the rotation of the propeller graphically according to the thruster power command input. + +- For dynamics calculation, + - Pitch command type of battery position `frl_vehicle_msgs::UwGliderCommand::PITCH_CMD_BATT_POS` should be used + - Dynamics flag should be on https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/6d3a6cf6998e5cad4a4460e5b58c564262e5fbd2/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_base_kinematics.xacro#L162 + - Dynamics properties should be defined at `.xacro` file https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/6d3a6cf6998e5cad4a4460e5b58c564262e5fbd2/glider_hybrid_whoi_description/urdf/glider_hybrid_whoi_base_kinematics.xacro#L164-L186 + +#### Limitations and To-dos +- Rudder hydrodynamics coefficients + - Currently, Rudder hydrodynamics force is modeled with a simple copy&paste of the Hull hydrodynamics (Graver's theory). Area 1/10, Lift and Drag 1/10, Moment *10. Just to check the system stability. There is much to improve how to model this including how to include the effect of ocean current. +- Heading Control + - Currently, controlling with target heading is not included since it requires a control algorithm for target yaw in the vehicle frame. +- Elevation wing : Not included yet. It could be modeled similar to that of the rudder. + From 3976f513df2b7fac178c46b397126ca43680298a Mon Sep 17 00:00:00 2001 From: Woensug Choi Date: Fri, 11 Feb 2022 14:45:05 +0900 Subject: [PATCH 5/9] toc clean-up --- README.md | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index d8ac34f7..54245e1f 100644 --- a/README.md +++ b/README.md @@ -7,17 +7,16 @@ --> * [Summary Poster](#summary-poster) * [Utility Guide](#utility-guide) -* [How-to](#how-to) - * [Installation](#installation) - * [Quickstart](#Quickstart) - * [Interface with slocum glider driver](#Interface-with-slocum-glider-driver-simulator) - * [Features](#Features) - * [Bathymetry included](#Bathymetry-included) - * [Surface detection](#Surface-detection) - * [Multiple gliders support](#Multiple-gliderssupport) - * [Live Feed to Fledermaus](#Live-Feed-to-Fledermaus) - * [Glider control parameters](#Glider-control-parameters) - * [Hybrid Glider 6DOF dynamics](#Hybrid-Glider-6DOF-dynamics) +* [Installation](#installation) +* [Quickstart](#Quickstart) +* [Interface with slocum glider driver](#Interface-with-slocum-glider-driver-simulator) +* [Features](#Features) + * [Bathymetry included](#Bathymetry-included) + * [Surface detection](#Surface-detection) + * [Multiple gliders support](#Multiple-gliderssupport) + * [Live Feed to Fledermaus](#Live-Feed-to-Fledermaus) + * [Glider control parameters](#Glider-control-parameters) + * [Hybrid Glider 6DOF dynamics](#Hybrid-Glider-6DOF-dynamics) ## Summary Poster (2022-02-10) @@ -29,9 +28,7 @@ * [Utility guide (google doc, live document)](https://docs.google.com/document/d/1Rlh-2ZkqkKEEsECacgi9XIiPgPHdoRVjJmTLnLg1Bu4/edit?usp=sharing) -## How-to - -### Installation +## Installation * First check to make sure you meet the [System Requirements](https://github.com/Field-Robotics-Lab/dave/wiki/System-Requirements). * Then choose from one of the following two installation options: From a9c2021a58aee486af2f6738b0dfd4f25415cf7e Mon Sep 17 00:00:00 2001 From: Woensug Choi Date: Fri, 11 Feb 2022 16:17:56 +0900 Subject: [PATCH 6/9] all tutorials tested --- README.md | 146 +++++++++++------- docker/Dockerfile | 3 + docker/Dockerfile.dev | 7 + docker/run-local.bash | 87 +++++++++++ glider_hybrid_whoi_control/CMakeLists.txt | 2 +- .../launch/BuzzBay_stratified_current.launch | 2 +- .../scripts/test_directKinematics.py | 4 +- 7 files changed, 190 insertions(+), 61 deletions(-) create mode 100755 docker/run-local.bash diff --git a/README.md b/README.md index 54245e1f..c643c2a7 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ * [Utility Guide](#utility-guide) * [Installation](#installation) * [Quickstart](#Quickstart) + * [Bundled files](#Bundled-files) + * [Local custom files](#Local-custom-files) * [Interface with slocum glider driver](#Interface-with-slocum-glider-driver-simulator) * [Features](#Features) * [Bathymetry included](#Bathymetry-included) @@ -32,70 +34,100 @@ * First check to make sure you meet the [System Requirements](https://github.com/Field-Robotics-Lab/dave/wiki/System-Requirements). * Then choose from one of the following two installation options: - 1. **Directly on Host** - 1. [Install environment and dependent repositories](https://github.com/Field-Robotics-Lab/dave/wiki/Install-Directly-on-Host) : Instructions to install ROS Noetic, Gazebo 11, UUV Simulator and DAVE directly on your host machine. - ```diff - - When cloning the dave repo, bathymetry_plugin_whoi branch from the fork of the dave repo - git clone https://github.com/woensug-choi/dave.git - git checkout bathymetry_plugin_whoi - - The IMU/GPS sensor included in this repo requires hector libraries. You may install with following command - sudo apt-get install ros-noetic-hector-gazebo-plugins - - The initial position setter requires python version of gdal - sudo apt install python3-gdal=3.0.4+dfsg-1build3 - - GPS Viewer requires pyQt and folium modules - pip3 install folium PyQtWebEngine pyqt5-tools - - The kinematics/dynamics plugin uses UwGliderStatus/UwGliderCommand msg to interact with the vehicle - git clone https://github.com/Field-Robotics-Lab/frl_msgs - - nps_uw_sensors_gazebo repository is required - git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git - ``` - 2. Clone this repository in `~/uuv/src` folder and compile with `catkin_make` at `~/uuv_ws` directory. - - 2. **Using Docker** - 1. Make sure you have Docker v19.03 or higher ([installation instructions](https://docs.docker.com/engine/install/ubuntu/)) and nvidia-container-toolkit ([installation instructions](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#setting-up-nvidia-container-toolkit)) - 2. Run the `build.bash` script located in the `docker` folder of this repository - ``` - ./build.bash - ``` - 3. Run the container with `run.bash` script - ``` - ./run.bash - source ~/glider_hybrid_whoi/install/setup.bash - ``` - * Opening additional terminals - ``` - ./join.bash - source /opt/ros/noetic/setup.bash - source ~/glider_hybrid_whoi/install/setup.bash - ``` - Fore more including docker-compose: [Docker environment description](https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/master/docker/README.MD) - -## Quickstart - -- This is for running the simulator only - -* Running the simulator (Run each commands in separate terminal window) - 1. Spawn underwater world with gazebo - ```bash - roslaunch glider_hybrid_whoi_gazebo start_demo_kinematics_stratified_current.launch - # or - roslaunch glider_hybrid_whoi_gazebo BuzzBay_stratified_current.launch - # Bathymetry for Buzzbay is included in this repo - # The range is (lat,lon) = (41.50, -70.70) to (41.56, -70.65) + 1. **Directly on Host** + 1. [Install environment and dependent repositories](https://github.com/Field-Robotics-Lab/dave/wiki/Install-Directly-on-Host) : Instructions to install ROS Noetic, Gazebo 11, UUV Simulator and DAVE directly on your host machine. + ```diff + - When cloning the dave repo, bathymetry_plugin_whoi branch from the fork of the dave repo + git clone https://github.com/woensug-choi/dave.git + git checkout bathymetry_plugin_whoi + - The IMU/GPS sensor included in this repo requires hector libraries. You may install with following command + sudo apt-get install ros-noetic-hector-gazebo-plugins + - The initial position setter requires python version of gdal + sudo apt install python3-gdal=3.0.4+dfsg-1build3 + - GPS Viewer requires pyQt and folium modules + pip3 install folium PyQtWebEngine pyqt5-tools + - The kinematics/dynamics plugin uses UwGliderStatus/UwGliderCommand msg to interact with the vehicle + git clone https://github.com/Field-Robotics-Lab/frl_msgs + - nps_uw_sensors_gazebo repository is required + git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git + ``` + 2. Clone this repository in `~/uuv/src` folder and compile with `catkin_make` at `~/uuv_ws` directory. + + 2. **Using Docker** + 1. Make sure you have Docker v19.03 or higher ([installation instructions](https://docs.docker.com/engine/install/ubuntu/)) and nvidia-container-toolkit ([installation instructions](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#setting-up-nvidia-container-toolkit)) + 2. Run the `build.bash` script located in the `docker` folder of this repository + ``` + ./build.bash ``` - 2. Control glider with ROS + 3. Run the container with `run.bash` script ``` - rosrun kinematics_ros_plugins test_directKinematics.py + ./run.bash + source ~/glider_hybrid_whoi/install/setup.bash ``` - 4. Glider status + * Opening additional terminals ``` - rostopic echo /glider_hybrid_whoi/kinematics/UwGliderStatus + ./join.bash + source /opt/ros/noetic/setup.bash + source ~/glider_hybrid_whoi/install/setup.bash ``` - 5. Access log files + Fore more including docker-compose: [Docker environment description](https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/master/docker/README.MD) + +## Quickstart + +- This is for running the simulator only + +![image](https://user-images.githubusercontent.com/7955120/153543724-512330bb-83af-4c3c-9a3f-3f66f1672fed.png) - - Location of the log CSV file : `/tmp/KinematicsLog.csv` - - Location of the standalone GPS log HTML file : `/tmp/GPSViewer_log.html` +### Bundled files +* Running the simulator (Run each commands in separate terminal window) + 1. Spawn underwater world with gazebo + ```bash + roslaunch glider_hybrid_whoi_gazebo start_demo_kinematics_stratified_current.launch + # or + roslaunch glider_hybrid_whoi_gazebo BuzzBay_stratified_current.launch + # Bathymetry for Buzzbay is included in this repo. + # The glider may look as if they are teard apart and shiver. It's rendering error. + # All sensors should work as if thay are in place just fine. + # If it hits the surface, it will reset its orietation + # To dive back down from the sruface, you may need to pich down and push hard. + # The range is (lat,lon) = (41.50, -70.70) to (41.56, -70.65) + ``` + 2. Control glider with ROS + ``` + rosrun kinematics_ros_plugins test_directKinematics.py + ``` + 4. Glider status + ``` + rostopic echo /glider_hybrid_whoi/kinematics/UwGliderStatus + ``` + 5. Access log files + + - Location of the log CSV file : `/tmp/KinematicsLog.csv` + - Location of the standalone GPS log HTML file : `/tmp/GPSViewer_log.html` (Open with Chrome) + +### Local custom files +1. **Directly on Host** + - There's a template at `local_glider_files_example/bear/simulation` + - You may launch the launch/world/vehicle description inside it with + ```bash + roslaunch glider_hybrid_whoi/local_glider_files_example/bear/simulation/PuertoRico.launch + # The glider may look as if they are teard apart and shiver. It's rendering error. + # All sensors should work as if thay are in place just fine. + ``` +2. **Using Docker** + - If using docker, you need to mount the local files into the docker container + - instead of using `./run.bash`, launch docker image with `./run-local.bash` + - The host machine's parent directory of the `docker`, which is `glider_hybrid_whoi`, will be mounted at `/home/ros/local_glider_files`. + - There's a template at `local_glider_files_example/bear/simulation` + - You may launch the launch/world/vehicle description inside it with + ```bash + ./run-local.bash + source ~/glider_hybrid_whoi/install/setup.bash + roslaunch /home/ros/local_glider_files/local_glider_files_example/bear/simulation/PuertoRico.launch + # The glider may look as if they are teard apart and shiver. It's rendering error. + # All sensors should work as if thay are in place just fine. + ``` ## Interface with slocum glider driver simulator diff --git a/docker/Dockerfile b/docker/Dockerfile index f2a8c2da..7cb4dffd 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -344,6 +344,9 @@ RUN apt-get update \ && apt-get autoremove -y \ && rm -rf /var/lib/apt/lists/* +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir pynmea2 folium PyQtWebEngine pyqt5-tools + # Carry forward the dependency versions ARG version_dave ENV VERSION_DAVE=$version_dave diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index 06aa3aaa..fd924d26 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -208,6 +208,7 @@ RUN apt-get update \ python3-rosinstall \ python3-rosinstall-generator \ python3-vcstool \ + python3-gdal \ ros-noetic-gazebo-plugins \ ros-noetic-gazebo-ros \ ros-noetic-gazebo-ros-control \ @@ -241,6 +242,9 @@ RUN apt-get update \ && apt-get autoremove -y \ && rm -rf /var/lib/apt/lists/* +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir pynmea2 folium PyQtWebEngine pyqt5-tools + #------------------------------------------------------------------# # source-deps-builder stage #------------------------------------------------------------------# @@ -332,6 +336,9 @@ RUN apt-get update \ && apt-get autoremove -y \ && rm -rf /var/lib/apt/lists/* +RUN pip install --no-cache-dir --upgrade pip && \ + pip install --no-cache-dir pynmea2 folium PyQtWebEngine pyqt5-tools + # Carry forward the dependency versions ARG version_dave ENV VERSION_DAVE=$version_dave diff --git a/docker/run-local.bash b/docker/run-local.bash new file mode 100755 index 00000000..79574170 --- /dev/null +++ b/docker/run-local.bash @@ -0,0 +1,87 @@ +#!/usr/bin/env bash + +# +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# + +# Runs a docker container with the image created by build.bash +# Requires: +# docker 19.03 or higher +# an X server +# Recommended: +# A joystick mounted to /dev/input/js0 or /dev/input/js1 + +# Determine if we have the nvidia runtime enabled. If so, default to exposing +# all gpus. +if docker info -f '{{ range $key, $value := .Runtimes }}{{ $key }}{{ end }}' | grep nvidia > /dev/null 2>&1; then + GPUS="--gpus all" +fi + +IMG="glider_hybrid_whoi:latest" +RUN_ARGS="" + +while [[ $# -gt 0 ]] +do +key="$1" + +case $key in + -i) + IMG="$2" + shift 2 + ;; + --without-nvidia) + GPUS="" + shift + ;; + --nvidia) + GPUS="--gpus all" + shift + ;; + --run-args) + RUN_ARGS="$RUN_ARGS $2" + shift 2 + ;; + --name) + RUN_ARGS="$RUN_ARGS --name $2" + shift 2 + ;; + --) + shift + break + ;; + *) # unknown option + echo "Unknown option" >&2 + exit 1 + ;; +esac +done + +USERID=$(id -u) +GROUPID=$(id -g) + +docker run -it \ + -e DISPLAY \ + -e QT_X11_NO_MITSHM=1 \ + -v "/tmp/.X11-unix:/tmp/.X11-unix" \ + -v "/etc/localtime:/etc/localtime:ro" \ + -v "$(pwd)/../:/home/ros/local_glider_files" \ + --privileged \ + --rm \ + --security-opt seccomp=unconfined \ + -u "$USERID:$GROUPID" \ + $RUN_ARGS \ + $GPUS \ + "$IMG" \ + "$@" diff --git a/glider_hybrid_whoi_control/CMakeLists.txt b/glider_hybrid_whoi_control/CMakeLists.txt index fe326cb3..b3c1e3f3 100644 --- a/glider_hybrid_whoi_control/CMakeLists.txt +++ b/glider_hybrid_whoi_control/CMakeLists.txt @@ -5,6 +5,6 @@ find_package(catkin REQUIRED) catkin_package() -install(DIRECTORY launch +install(DIRECTORY launch rviz DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} PATTERN "*~" EXCLUDE) diff --git a/glider_hybrid_whoi_gazebo/launch/BuzzBay_stratified_current.launch b/glider_hybrid_whoi_gazebo/launch/BuzzBay_stratified_current.launch index 49892204..19c82ce2 100644 --- a/glider_hybrid_whoi_gazebo/launch/BuzzBay_stratified_current.launch +++ b/glider_hybrid_whoi_gazebo/launch/BuzzBay_stratified_current.launch @@ -25,7 +25,7 @@ - + diff --git a/kinematics_ros_plugins/scripts/test_directKinematics.py b/kinematics_ros_plugins/scripts/test_directKinematics.py index 14d00559..4dcd976d 100755 --- a/kinematics_ros_plugins/scripts/test_directKinematics.py +++ b/kinematics_ros_plugins/scripts/test_directKinematics.py @@ -27,7 +27,7 @@ def command(startTime): command.rudder_control_mode = 1 command.target_heading = math.pi/2.0 command.motor_cmd_type = 1 - command.target_motor_cmd = 100.0 + command.target_motor_cmd = 10.0 rospy.loginfo(command) pub.publish(command) time.sleep(8) @@ -55,7 +55,7 @@ def command(startTime): command.rudder_control_mode = 1 command.target_heading = math.pi/2 command.motor_cmd_type = 1 - command.target_motor_cmd = 50.0 + command.target_motor_cmd = 10.0 rospy.loginfo(command) pub.publish(command) time.sleep(5) From 9e113dd6d574d149ee939080966060ac288ddd2b Mon Sep 17 00:00:00 2001 From: Woensug Choi Date: Fri, 11 Feb 2022 16:30:20 +0900 Subject: [PATCH 7/9] add header --- .../bear/simulation/transientOceanCurrentDatabase_local.csv | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/local_glider_files_example/bear/simulation/transientOceanCurrentDatabase_local.csv b/local_glider_files_example/bear/simulation/transientOceanCurrentDatabase_local.csv index dc446582..95411f5a 100644 --- a/local_glider_files_example/bear/simulation/transientOceanCurrentDatabase_local.csv +++ b/local_glider_files_example/bear/simulation/transientOceanCurrentDatabase_local.csv @@ -1,4 +1,7 @@ -0, 0, 0 +# Information,, +Information about this data can be written here (in one line without comma),, +"# Data (North direction velocity [m/s], East direction velocity [m/s], Depth [m])",, +0, 0, 0 0.1, -0.2, 1 0.1, -0.2, 2 0.1, -0.2, 3 From ecf6c1121d546cb0ae5da1841231fc87f79a9577 Mon Sep 17 00:00:00 2001 From: Woensug Choi Date: Fri, 11 Feb 2022 16:37:56 +0900 Subject: [PATCH 8/9] indent fixes --- README.md | 83 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index c643c2a7..2ae207c7 100644 --- a/README.md +++ b/README.md @@ -34,43 +34,47 @@ * First check to make sure you meet the [System Requirements](https://github.com/Field-Robotics-Lab/dave/wiki/System-Requirements). * Then choose from one of the following two installation options: - 1. **Directly on Host** - 1. [Install environment and dependent repositories](https://github.com/Field-Robotics-Lab/dave/wiki/Install-Directly-on-Host) : Instructions to install ROS Noetic, Gazebo 11, UUV Simulator and DAVE directly on your host machine. - ```diff - - When cloning the dave repo, bathymetry_plugin_whoi branch from the fork of the dave repo - git clone https://github.com/woensug-choi/dave.git - git checkout bathymetry_plugin_whoi - - The IMU/GPS sensor included in this repo requires hector libraries. You may install with following command - sudo apt-get install ros-noetic-hector-gazebo-plugins - - The initial position setter requires python version of gdal - sudo apt install python3-gdal=3.0.4+dfsg-1build3 - - GPS Viewer requires pyQt and folium modules - pip3 install folium PyQtWebEngine pyqt5-tools - - The kinematics/dynamics plugin uses UwGliderStatus/UwGliderCommand msg to interact with the vehicle - git clone https://github.com/Field-Robotics-Lab/frl_msgs - - nps_uw_sensors_gazebo repository is required - git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git - ``` - 2. Clone this repository in `~/uuv/src` folder and compile with `catkin_make` at `~/uuv_ws` directory. - - 2. **Using Docker** - 1. Make sure you have Docker v19.03 or higher ([installation instructions](https://docs.docker.com/engine/install/ubuntu/)) and nvidia-container-toolkit ([installation instructions](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#setting-up-nvidia-container-toolkit)) - 2. Run the `build.bash` script located in the `docker` folder of this repository - ``` - ./build.bash - ``` - 3. Run the container with `run.bash` script - ``` - ./run.bash - source ~/glider_hybrid_whoi/install/setup.bash - ``` - * Opening additional terminals - ``` - ./join.bash - source /opt/ros/noetic/setup.bash - source ~/glider_hybrid_whoi/install/setup.bash - ``` - Fore more including docker-compose: [Docker environment description](https://github.com/Field-Robotics-Lab/glider_hybrid_whoi/blob/master/docker/README.MD) + 1. **Directly on Host** + 1. [Install environment and dependent repositories](https://github.com/Field-Robotics-Lab/dave/wiki/Install-Directly-on-Host) : Instructions to install ROS Noetic, Gazebo 11, UUV Simulator and DAVE directly on your host machine. + + ```diff + - When cloning the dave repo, bathymetry_plugin_whoi branch from the fork of the dave repo + git clone https://github.com/woensug-choi/dave.git + git checkout bathymetry_plugin_whoi + - The IMU/GPS sensor included in this repo requires hector libraries. You may install with following command + sudo apt-get install ros-noetic-hector-gazebo-plugins + - The initial position setter requires python version of gdal + sudo apt install python3-gdal=3.0.4+dfsg-1build3 + - GPS Viewer requires pyQt and folium modules + pip3 install folium PyQtWebEngine pyqt5-tools + - The kinematics/dynamics plugin uses UwGliderStatus/UwGliderCommand msg to interact with the vehicle + git clone https://github.com/Field-Robotics-Lab/frl_msgs + - nps_uw_sensors_gazebo repository is required + git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git + ``` + 2. Clone this repository in `~/uuv/src` folder and compile with `catkin_make` at `~/uuv_ws` directory. + + 2. **Usin`g Docker** + 1. Make sure you have Docker v19.03 or higher ([installation instructions](https://docs.docker.com/engine/install/ubuntu/)) and nvidia-container-toolkit ([installation instructions](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#setting-up-nvidia-container-toolkit)) + 2. Run the `build.bash` script located in the `docker` folder of this repository + + ``` + ./build.bash + ``` + 3. Run the container with `run.bash` script + + ``` + ./run.bash + source ~/glider_hybrid_whoi/install/setup.bash + ``` + * Opening additional terminals + + ``` + ./join.bash + source /opt/ros/noetic/setup.bash + source ~/glider_hybrid_whoi/install/setup.bash + ``` + Fore more including docker-compose: [Docker environment description](https://github.com/Field`-Robotics-Lab/glider_hybrid_whoi/blob/master/docker/README.MD) ## Quickstart @@ -81,6 +85,7 @@ ### Bundled files * Running the simulator (Run each commands in separate terminal window) 1. Spawn underwater world with gazebo + ```bash roslaunch glider_hybrid_whoi_gazebo start_demo_kinematics_stratified_current.launch # or @@ -93,10 +98,12 @@ # The range is (lat,lon) = (41.50, -70.70) to (41.56, -70.65) ``` 2. Control glider with ROS + ``` rosrun kinematics_ros_plugins test_directKinematics.py ``` 4. Glider status + ``` rostopic echo /glider_hybrid_whoi/kinematics/UwGliderStatus ``` @@ -109,6 +116,7 @@ 1. **Directly on Host** - There's a template at `local_glider_files_example/bear/simulation` - You may launch the launch/world/vehicle description inside it with + ```bash roslaunch glider_hybrid_whoi/local_glider_files_example/bear/simulation/PuertoRico.launch # The glider may look as if they are teard apart and shiver. It's rendering error. @@ -121,6 +129,7 @@ - The host machine's parent directory of the `docker`, which is `glider_hybrid_whoi`, will be mounted at `/home/ros/local_glider_files`. - There's a template at `local_glider_files_example/bear/simulation` - You may launch the launch/world/vehicle description inside it with + ```bash ./run-local.bash source ~/glider_hybrid_whoi/install/setup.bash From 34de24c7d535d32251050edd4720933ad92f74d6 Mon Sep 17 00:00:00 2001 From: Woensug Choi Date: Fri, 11 Feb 2022 16:39:25 +0900 Subject: [PATCH 9/9] readability fixes --- README.md | 73 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 2ae207c7..889f9ca1 100644 --- a/README.md +++ b/README.md @@ -37,21 +37,22 @@ 1. **Directly on Host** 1. [Install environment and dependent repositories](https://github.com/Field-Robotics-Lab/dave/wiki/Install-Directly-on-Host) : Instructions to install ROS Noetic, Gazebo 11, UUV Simulator and DAVE directly on your host machine. - ```diff - - When cloning the dave repo, bathymetry_plugin_whoi branch from the fork of the dave repo - git clone https://github.com/woensug-choi/dave.git - git checkout bathymetry_plugin_whoi - - The IMU/GPS sensor included in this repo requires hector libraries. You may install with following command - sudo apt-get install ros-noetic-hector-gazebo-plugins - - The initial position setter requires python version of gdal - sudo apt install python3-gdal=3.0.4+dfsg-1build3 - - GPS Viewer requires pyQt and folium modules - pip3 install folium PyQtWebEngine pyqt5-tools - - The kinematics/dynamics plugin uses UwGliderStatus/UwGliderCommand msg to interact with the vehicle - git clone https://github.com/Field-Robotics-Lab/frl_msgs - - nps_uw_sensors_gazebo repository is required - git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git - ``` + ```diff + - When cloning the dave repo, bathymetry_plugin_whoi branch from the fork of the dave repo + git clone https://github.com/woensug-choi/dave.git + git checkout bathymetry_plugin_whoi + - The IMU/GPS sensor included in this repo requires hector libraries. You may install with following command + sudo apt-get install ros-noetic-hector-gazebo-plugins + - The initial position setter requires python version of gdal + sudo apt install python3-gdal=3.0.4+dfsg-1build3 + - GPS Viewer requires pyQt and folium modules + pip3 install folium PyQtWebEngine pyqt5-tools + - The kinematics/dynamics plugin uses UwGliderStatus/UwGliderCommand msg to interact with the vehicle + git clone https://github.com/Field-Robotics-Lab/frl_msgs + - nps_uw_sensors_gazebo repository is required + git clone git@github.com:Field-Robotics-Lab/nps_uw_sensors_gazebo.git + ``` + 2. Clone this repository in `~/uuv/src` folder and compile with `catkin_make` at `~/uuv_ws` directory. 2. **Usin`g Docker** @@ -86,27 +87,27 @@ * Running the simulator (Run each commands in separate terminal window) 1. Spawn underwater world with gazebo - ```bash - roslaunch glider_hybrid_whoi_gazebo start_demo_kinematics_stratified_current.launch - # or - roslaunch glider_hybrid_whoi_gazebo BuzzBay_stratified_current.launch - # Bathymetry for Buzzbay is included in this repo. - # The glider may look as if they are teard apart and shiver. It's rendering error. - # All sensors should work as if thay are in place just fine. - # If it hits the surface, it will reset its orietation - # To dive back down from the sruface, you may need to pich down and push hard. - # The range is (lat,lon) = (41.50, -70.70) to (41.56, -70.65) - ``` + ```bash + roslaunch glider_hybrid_whoi_gazebo start_demo_kinematics_stratified_current.launch + # or + roslaunch glider_hybrid_whoi_gazebo BuzzBay_stratified_current.launch + # Bathymetry for Buzzbay is included in this repo. + # The glider may look as if they are teard apart and shiver. It's rendering error. + # All sensors should work as if thay are in place just fine. + # If it hits the surface, it will reset its orietation + # To dive back down from the sruface, you may need to pich down and push hard. + # The range is (lat,lon) = (41.50, -70.70) to (41.56, -70.65) + ``` 2. Control glider with ROS - ``` - rosrun kinematics_ros_plugins test_directKinematics.py - ``` + ``` + rosrun kinematics_ros_plugins test_directKinematics.py + ``` 4. Glider status - ``` - rostopic echo /glider_hybrid_whoi/kinematics/UwGliderStatus - ``` + ``` + rostopic echo /glider_hybrid_whoi/kinematics/UwGliderStatus + ``` 5. Access log files - Location of the log CSV file : `/tmp/KinematicsLog.csv` @@ -152,9 +153,10 @@ provided by [https://gitlab.com/sentinel-aug/ros/slocum_glider](https://gitlab.c - Buzzbay bathymetry is included - Roughly 1500x1500 m tiles with 50 m overlap regions are included (almost 780 MB) - Click the `play` button on the Gazebo window and wait for the first bathymetry to be spawned. Next bathymetry tile will be spawned and the previous tile will be removed automatically according to the glider position. - ```bash - roslaunch glider_hybrid_whoi_gazebo BuzzBay_stratified_current.launch - ``` + + ```bash + roslaunch glider_hybrid_whoi_gazebo BuzzBay_stratified_current.launch + ``` ### Surface detection - If the glider reach the surface, the pitch value is set to zero and the position is kept on surface unless it's heading back down. @@ -183,6 +185,7 @@ provided by [https://gitlab.com/sentinel-aug/ros/slocum_glider](https://gitlab.c - Uses custom NMEA msg format that can include not only lat/lon/depth but also roll/pitch/heading. - Networking with WSL is tricky since the Windows and the Ubuntu in WSL recognize `localhost` differently. This is hacked by using the host window machine's public ip. Maybe you have to add this to C:\Users/User/.wslconfig + ``` [wsl2] localhostForwarding=true