diff --git a/README.md b/README.md index bf208757..f66a415f 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,10 @@ License ------- The source code is released under a [BSD 3-Clause license](https://github.com/ethz-asl/ethz_piksi_ros/blob/master/LICENSE). +Build Status +------- +[![Build Status](https://ci.leggedrobotics.com/buildStatus/icon?job=github_ethz-asl/ethz_piksi_ros/master)](https://ci.leggedrobotics.com/job/github_ethz-asl/job/ethz_piksi_ros/job/master/) + Credits ------- Marco Tranzatto, Kai Holtmann, Michael Pantic - ETHZ ASL & RSL - 30 November 2017 diff --git a/ethz_piksi_ros/package.xml b/ethz_piksi_ros/package.xml index 790f70ae..b0080d75 100644 --- a/ethz_piksi_ros/package.xml +++ b/ethz_piksi_ros/package.xml @@ -1,7 +1,7 @@ ethz_piksi_ros - 1.5.0 + 1.6.0 Meta-package for the ethz_piksi_ros repository. Marco Tranzatto diff --git a/jenkins-pipeline b/jenkins-pipeline new file mode 100644 index 00000000..b4df4a60 --- /dev/null +++ b/jenkins-pipeline @@ -0,0 +1,2 @@ +library 'continuous_integration_pipeline' +ciPipeline("--ignore ethz_piksi_ros piksi_v2_rtk_ros rqt_gps_rtk_plugin utils") \ No newline at end of file diff --git a/piksi_multi_rtk_ros/CMakeLists.txt b/piksi_multi_rtk_ros/CMakeLists.txt index eee3bda2..0ef070c3 100644 --- a/piksi_multi_rtk_ros/CMakeLists.txt +++ b/piksi_multi_rtk_ros/CMakeLists.txt @@ -4,10 +4,11 @@ project(piksi_multi_rtk_ros) ## Find catkin macros and libraries find_package(catkin REQUIRED COMPONENTS - rospy + geometry_msgs piksi_rtk_msgs sensor_msgs - geometry_msgs + roslib + rospy ) ################################### @@ -23,8 +24,26 @@ catkin_package( # INCLUDE_DIRS # LIBRARIES CATKIN_DEPENDS - piksi_rtk_msgs - sensor_msgs geometry_msgs + sensor_msgs + piksi_rtk_msgs + roslib + rospy # DEPENDS ) + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +catkin_python_setup() + +############# +## Install ## +############# + catkin_install_python(PROGRAMS bin/piksi_multi bin/geodetic_survey + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +install(DIRECTORY cfg launch log_surveys rosbag_record_scripts + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +) diff --git a/piksi_multi_rtk_ros/bin/geodetic_survey b/piksi_multi_rtk_ros/bin/geodetic_survey new file mode 100755 index 00000000..c82f902e --- /dev/null +++ b/piksi_multi_rtk_ros/bin/geodetic_survey @@ -0,0 +1,6 @@ +#! /usr/bin/env python + +from piksi_multi_rtk_ros import GeodeticSurvey + +if __name__ == '__main__': + geodetic_survey = GeodeticSurvey() diff --git a/piksi_multi_rtk_ros/bin/piksi_multi b/piksi_multi_rtk_ros/bin/piksi_multi new file mode 100755 index 00000000..1c38b954 --- /dev/null +++ b/piksi_multi_rtk_ros/bin/piksi_multi @@ -0,0 +1,6 @@ +#! /usr/bin/env python + +from piksi_multi_rtk_ros import PiksiMulti + +if __name__ == '__main__': + piksi_multi = PiksiMulti() diff --git a/piksi_multi_rtk_ros/launch/geodetic_survey.launch b/piksi_multi_rtk_ros/launch/geodetic_survey.launch index dbfc3c1e..6c7607a4 100644 --- a/piksi_multi_rtk_ros/launch/geodetic_survey.launch +++ b/piksi_multi_rtk_ros/launch/geodetic_survey.launch @@ -14,7 +14,7 @@ - + diff --git a/piksi_multi_rtk_ros/launch/piksi_multi_base_station.launch b/piksi_multi_rtk_ros/launch/piksi_multi_base_station.launch index a02a695c..6acf8331 100644 --- a/piksi_multi_rtk_ros/launch/piksi_multi_base_station.launch +++ b/piksi_multi_rtk_ros/launch/piksi_multi_base_station.launch @@ -13,7 +13,7 @@ - + diff --git a/piksi_multi_rtk_ros/launch/piksi_multi_rover.launch b/piksi_multi_rtk_ros/launch/piksi_multi_rover.launch index 694a04f1..5bc83662 100644 --- a/piksi_multi_rtk_ros/launch/piksi_multi_rover.launch +++ b/piksi_multi_rtk_ros/launch/piksi_multi_rover.launch @@ -16,7 +16,7 @@ - + diff --git a/piksi_multi_rtk_ros/package.xml b/piksi_multi_rtk_ros/package.xml index dbeac31d..0df2968b 100644 --- a/piksi_multi_rtk_ros/package.xml +++ b/piksi_multi_rtk_ros/package.xml @@ -1,7 +1,7 @@ piksi_multi_rtk_ros - 1.5.0 + 1.6.0 ROS driver for Piksi Multi RTK GPS Receiver. @@ -15,9 +15,10 @@ catkin - rospy + geometry_msgs piksi_rtk_msgs sensor_msgs - geometry_msgs + roslib + rospy diff --git a/piksi_multi_rtk_ros/setup.py b/piksi_multi_rtk_ros/setup.py new file mode 100644 index 00000000..f1e45ca6 --- /dev/null +++ b/piksi_multi_rtk_ros/setup.py @@ -0,0 +1,12 @@ +## ! 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=['piksi_multi_rtk_ros'], + scripts=['bin/geodetic_survey', 'bin/piksi_multi'], + package_dir={'': 'src'}) + +setup(**setup_args) diff --git a/piksi_multi_rtk_ros/src/UdpHelpers.py b/piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/UdpHelpers.py similarity index 100% rename from piksi_multi_rtk_ros/src/UdpHelpers.py rename to piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/UdpHelpers.py diff --git a/piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/__init__.py b/piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/__init__.py new file mode 100644 index 00000000..90bfceed --- /dev/null +++ b/piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/__init__.py @@ -0,0 +1,3 @@ +from piksi_multi import PiksiMulti +from geodetic_survey import GeodeticSurvey + diff --git a/piksi_multi_rtk_ros/src/geodetic_survey.py b/piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/geodetic_survey.py similarity index 93% rename from piksi_multi_rtk_ros/src/geodetic_survey.py rename to piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/geodetic_survey.py index 44a5757f..f8afbf0e 100755 --- a/piksi_multi_rtk_ros/src/geodetic_survey.py +++ b/piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/geodetic_survey.py @@ -6,6 +6,7 @@ # import rospy +import roslib.packages from piksi_rtk_msgs.srv import * import std_srvs.srv from sensor_msgs.msg import (NavSatFix, NavSatStatus) @@ -14,11 +15,13 @@ class GeodeticSurvey: + kRosPackageName = "piksi_multi_rtk_ros" kServiceTimeOutSeconds = 10.0 kWaitBetweenReadReqAndResSeconds = 1.0 kRelativeTolleranceGeodeticComparison = 1e-10 def __init__(self): + rospy.init_node('geodetic_survey') rospy.loginfo(rospy.get_name() + " start") self.latitude_accumulator = 0.0 @@ -74,7 +77,7 @@ def navsatfix_callback(self, msg): rospy.loginfo( "Creating ENU frame on surveyed position and substructing specified height of base station.") self.log_enu_origin_position(lat0, lon0, alt0) - rospy.signal_shutdown("Base station position set correctly.") + rospy.signal_shutdown("Base station position set correctly. Stop this node and launch base station node.") else: rospy.logerr("Base station position not set correctly.") rospy.signal_shutdown("Base station position not set correctly.") @@ -188,22 +191,22 @@ def read_settings_from_piksi(self, section_setting, setting): return False, -1 def log_surveyed_position(self, lat0, lon0, alt0): - # current path of geodetic_survey.py file - script_path = os.path.dirname(os.path.realpath(sys.argv[0])) - now = time.strftime("%Y_%m_%d_%H_%M_%S") - desired_path = "%s/../log_surveys/base_station_survey_%s.txt" % (script_path, now) + now = time.strftime("%Y-%m-%d-%H-%M-%S") + package_path = roslib.packages.get_pkg_dir(self.kRosPackageName) + desired_path = "%s/log_surveys/base_station_survey_%s.txt" % (package_path, now) file_obj = open(desired_path, 'w') file_obj.write("# File automatically generated on %s\n\n" % now) file_obj.write("latitude0_deg: %.10f\n" % lat0) file_obj.write("longitude0_deg: %.10f\n" % lon0) file_obj.write("altitude0: %.2f\n" % alt0) file_obj.close() + rospy.loginfo("Surveyed position saved in \'" + desired_path + "\'") def log_enu_origin_position(self, lat0, lon0, alt0): # current path of geodetic_survey.py file - script_path = os.path.dirname(os.path.realpath(sys.argv[0])) - now = time.strftime("%Y_%m_%d_%H_%M_%S") - desired_path = "%s/../log_surveys/enu_origin_%s.txt" % (script_path, now) + now = time.strftime("%Y-%m-%d-%H-%M-%S") + package_path = roslib.packages.get_pkg_dir(self.kRosPackageName) + desired_path = "%s/log_surveys/enu_origin_%s.txt" % (package_path, now) file_obj = open(desired_path, 'w') file_obj.write("# File automatically generated on %s\n" % now) file_obj.write( @@ -212,18 +215,8 @@ def log_enu_origin_position(self, lat0, lon0, alt0): file_obj.write("longitude0_deg: %.10f\n" % lon0) file_obj.write("altitude0: %.2f\n" % (alt0 - self.height_base_station_from_ground)) file_obj.close() + rospy.loginfo("ENU origin saved in \'" + desired_path + "\'") # https://www.python.org/dev/peps/pep-0485/#proposed-implementation def is_close(self, a, b, rel_tol=1e-09, abs_tol=0.0): return abs(a - b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) - - -# Main function. -if __name__ == '__main__': - rospy.init_node('geodetic_survey') - - # Go to class functions that do all the heavy lifting. Do error checking. - try: - geodetic_survey = GeodeticSurvey() - except rospy.ROSInterruptException: - pass diff --git a/piksi_multi_rtk_ros/src/piksi_multi.py b/piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/piksi_multi.py similarity index 99% rename from piksi_multi_rtk_ros/src/piksi_multi.py rename to piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/piksi_multi.py index 0539f2c6..3d5d5922 100755 --- a/piksi_multi_rtk_ros/src/piksi_multi.py +++ b/piksi_multi_rtk_ros/src/piksi_multi_rtk_ros/piksi_multi.py @@ -63,6 +63,7 @@ class PiksiMulti: def __init__(self): # Print info. + rospy.init_node('piksi') rospy.sleep(0.5) # Wait for a while for init to complete before printing. rospy.loginfo(rospy.get_name() + " start") @@ -1124,14 +1125,3 @@ def clear_last_setting_read(self): self.last_section_setting_read = [] self.last_setting_read = [] self.last_value_read = [] - - -# Main function. -if __name__ == '__main__': - rospy.init_node('piksi') - - # Go to class functions that do all the heavy lifting. Do error checking. - try: - piksi_multi = PiksiMulti() - except rospy.ROSInterruptException: - pass diff --git a/piksi_rtk_kml/.gitignore b/piksi_rtk_kml/.gitignore new file mode 100644 index 00000000..c949506e --- /dev/null +++ b/piksi_rtk_kml/.gitignore @@ -0,0 +1,2 @@ +# KML files +kml/* diff --git a/piksi_rtk_kml/CMakeLists.txt b/piksi_rtk_kml/CMakeLists.txt index d4790aa1..a578096d 100644 --- a/piksi_rtk_kml/CMakeLists.txt +++ b/piksi_rtk_kml/CMakeLists.txt @@ -4,9 +4,10 @@ project(piksi_rtk_kml) ## Find catkin macros and libraries find_package(catkin REQUIRED COMPONENTS - rospy - piksi_rtk_msgs geometry_msgs + piksi_rtk_msgs + roslib + rospy ) ################################### @@ -22,7 +23,25 @@ catkin_package( # INCLUDE_DIRS # LIBRARIES CATKIN_DEPENDS - piksi_rtk_msgs geometry_msgs + piksi_rtk_msgs + roslib + rospy # DEPENDS ) + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +catkin_python_setup() + +############# +## Install ## +############# + catkin_install_python(PROGRAMS bin/piksi_rtk_kml + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + +install(DIRECTORY cfg launch kml + DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +) diff --git a/piksi_rtk_kml/bin/piksi_rtk_kml b/piksi_rtk_kml/bin/piksi_rtk_kml new file mode 100755 index 00000000..35cad187 --- /dev/null +++ b/piksi_rtk_kml/bin/piksi_rtk_kml @@ -0,0 +1,7 @@ +#! /usr/bin/env python + +from piksi_rtk_kml import PiksiRtkKml + +# Main function. +if __name__ == '__main__': + piksi_rtk_kml = PiksiRtkKml() diff --git a/piksi_rtk_kml/launch/piksi_rtk_kml.launch b/piksi_rtk_kml/launch/piksi_rtk_kml.launch index bfd389e5..9ff7183e 100644 --- a/piksi_rtk_kml/launch/piksi_rtk_kml.launch +++ b/piksi_rtk_kml/launch/piksi_rtk_kml.launch @@ -2,11 +2,13 @@ - + + - + + diff --git a/piksi_rtk_kml/package.xml b/piksi_rtk_kml/package.xml index ba614b21..640e3dbb 100644 --- a/piksi_rtk_kml/package.xml +++ b/piksi_rtk_kml/package.xml @@ -1,7 +1,7 @@ piksi_rtk_kml - 1.5.0 + 1.6.0 ROS node to write KML file from Piksi messages. @@ -13,8 +13,9 @@ catkin - rospy - piksi_rtk_msgs geometry_msgs + piksi_rtk_msgs + roslib + rospy diff --git a/piksi_rtk_kml/setup.py b/piksi_rtk_kml/setup.py new file mode 100644 index 00000000..6288c5a1 --- /dev/null +++ b/piksi_rtk_kml/setup.py @@ -0,0 +1,12 @@ +## ! 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=['piksi_rtk_kml'], + scripts=['bin/piksi_rtk_kml'], + package_dir={'': 'src'}) + +setup(**setup_args) diff --git a/piksi_rtk_kml/src/piksi_rtk_kml/__init__.py b/piksi_rtk_kml/src/piksi_rtk_kml/__init__.py new file mode 100644 index 00000000..14e4fd81 --- /dev/null +++ b/piksi_rtk_kml/src/piksi_rtk_kml/__init__.py @@ -0,0 +1 @@ +from piksi_rtk_kml import PiksiRtkKml \ No newline at end of file diff --git a/piksi_rtk_kml/src/piksi_rtk_kml.py b/piksi_rtk_kml/src/piksi_rtk_kml/piksi_rtk_kml.py similarity index 88% rename from piksi_rtk_kml/src/piksi_rtk_kml.py rename to piksi_rtk_kml/src/piksi_rtk_kml/piksi_rtk_kml.py index c8b25963..e08ba447 100755 --- a/piksi_rtk_kml/src/piksi_rtk_kml.py +++ b/piksi_rtk_kml/src/piksi_rtk_kml/piksi_rtk_kml.py @@ -6,7 +6,7 @@ # import rospy -import os +import roslib.packages import time from piksi_rtk_msgs.msg import * from sensor_msgs.msg import NavSatFix @@ -14,12 +14,15 @@ class PiksiRtkKml: + kRosPackageName = "piksi_rtk_kml" + def __init__(self): + rospy.init_node('piksi_rtk_kml') # KML file - script_path = os.path.dirname(os.path.realpath(sys.argv[0])) + package_path = roslib.packages.get_pkg_dir(self.kRosPackageName) kml_file_name = rospy.get_param('~kml_file_prefix_name', "Piksi") + '-' + time.strftime("%Y-%m-%d-%H-%M-%S") - desired_path = "%s/../kml/%s.kml" % (script_path, kml_file_name) - self.file_obj = open(desired_path, 'w') + self.kml_file_path = "%s/kml/%s.kml" % (package_path, kml_file_name) + self.file_obj = open(self.kml_file_path, 'w') self.file_obj.write(self.kml_head(rospy.get_param('~document_name', "PiksiRtkKml"))) # Settings. @@ -86,7 +89,7 @@ def enu_point_callback(self, msg): def close_kml_file_handler(self): self.file_obj.write(self.kml_tail()) self.file_obj.close() - rospy.loginfo(rospy.get_name() + ' KML file written in "kml" folder.') + rospy.loginfo(rospy.get_name() + ' KML file written in \'%s\'' % self.kml_file_path) # Adapted from: https://github.com/hitzg/bag_tools/blob/master/bag_to_kml.py def kml_head(self, name): @@ -117,14 +120,3 @@ def kml_placemark(self, name, timestamp, lat, lon, alt=0, description=''): ''' % (name, timestamp, self.extrude_point, self.kml_altitude_mode, lon, lat, alt, description) # KML wants first lon and then lat. - - -# Main function. -if __name__ == '__main__': - rospy.init_node('piksi_rtk_kml') - - # Go to class functions that do all the heavy lifting. Do error checking. - try: - piksi_rtk_kml = PiksiRtkKml() - except rospy.ROSInterruptException: - pass diff --git a/piksi_rtk_msgs/package.xml b/piksi_rtk_msgs/package.xml index cc55bcc1..399a7c42 100644 --- a/piksi_rtk_msgs/package.xml +++ b/piksi_rtk_msgs/package.xml @@ -1,7 +1,7 @@ piksi_rtk_msgs - 1.5.0 + 1.6.0 Package containing messages for Piksi RTK GPS ROS Driver. diff --git a/piksi_v2_rtk_ros/package.xml b/piksi_v2_rtk_ros/package.xml index 0ca57b45..1af635c4 100644 --- a/piksi_v2_rtk_ros/package.xml +++ b/piksi_v2_rtk_ros/package.xml @@ -1,7 +1,7 @@ piksi_v2_rtk_ros - 1.5.0 + 1.6.0 ROS driver for Piksi V2 RTK GPS Receiver. diff --git a/rqt_gps_rtk_plugin/package.xml b/rqt_gps_rtk_plugin/package.xml index da58a222..7932a9c8 100644 --- a/rqt_gps_rtk_plugin/package.xml +++ b/rqt_gps_rtk_plugin/package.xml @@ -1,7 +1,7 @@ rqt_gps_rtk_plugin - 1.5.0 + 1.6.0 The rqt_gps_rtk_plugin package Kai Holtmann