diff --git a/README.md b/README.md index 5de0c33b27e3cc8a7763cd2f3e5a38747a192672..f32421d08bdbd2f9e3a6a693ec39eb4e5a368e31 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# autonomy-payload : a ROS-based stack for cooperative aerial robot autonomy +# swarm-autonomy : a ROS-based stack for cooperative aerial robot autonomy ## License @@ -16,19 +16,19 @@ A collection of ROS nodes for perception, path planning, safety monitoring, etc, ## Requirements -_Note: Typically this software is installed using a script (see deploy/odroid-installer.sh or the acs-installer repository). The following instructions won't generally be used and are only provided for reference._ +This is currently being developed against ROS Indigo (Ubuntu 14.04) and Kinetic (Ubuntu 16.06) on an Ubuntu-esque system. For best compatibility, use Ubuntu 14.04 LTS or newer (Xubuntu, etc should be fine as well). -This is currently being developed against ROS Hydro on an Ubuntu-esque system. For best compatibility, use Ubuntu 12.04 LTS or newer (Xubuntu, etc should be fine as well). +_Note: Typically this software is installed using a script (see deploy/odroid-installer-14.04.sh, deploy/odroid-installer-16.04 or the acs-installer repository). The following instructions won't generally be used and are only provided for reference._ You will need the following ROS packages for your distribution: - sudo apt-get install ros-hydro-ros-base ros-hydro-sensor-msgs ros-hydro-robot-pose-ekf + sudo apt-get install ros-[distro]-ros-base ros-[distro]-sensor-msgs ros-[distro]-robot-pose-ekf See your distribution's ROS documentation for install instructions. The short version, which generally works: sudo rosdep init rosdep update - echo "source /opt/ros/hydro/setup.bash" >> ~/.bashrc + echo "source /opt/ros/[distro]/setup.bash" >> ~/.bashrc source /opt/ros/hydro/setup.bash In addition, to interface with MAVLink-based autopilots, you will need: diff --git a/ap_lib/src/ap_lib/ap_enumerations.py b/ap_lib/src/ap_lib/ap_enumerations.py index 0cedc0733930870551e37606ae04fafe4d606a91..71e82e65a3d07cc957941e090253d2f519b8dcff 100644 --- a/ap_lib/src/ap_lib/ap_enumerations.py +++ b/ap_lib/src/ap_lib/ap_enumerations.py @@ -277,17 +277,16 @@ GAME_MODE_VALUES = { 'Inactive': GAME_INACTIVE, # Battle Arena Parameters BATTLE_CUBE_SW_LAT = 35.721147 # Latitude of the battle cube SW corner BATTLE_CUBE_SW_LON = -120.773008 # Longitude of the battle cube SW corner -BATTLE_CUBE_LENGTH = 575 # N/S dimension (meters) of the battle cube -BATTLE_CUBE_WIDTH = 750 # E/W dimension (meters) of the battle cube -BATTLE_CUBE_ORIENT = 25.183537917993224 -BATTLE_CUBE_MIN_ALT = 354 # Battle cube floor (meters MSL) -BATTLE_CUBE_MAX_ALT = 854 # Battle cube ceiling (meters MSL) +BATTLE_CUBE_LENGTH = 575 # N/S dimension (meters) of the battle cube +BATTLE_CUBE_WIDTH = 750 # E/W dimension (meters) of the battle cube +BATTLE_CUBE_ORIENT = 25.183537917993224 # Orientation (degrees) of the battle cube +BATTLE_CUBE_MIN_ALT = 354 # Battle cube floor (meters MSL) +BATTLE_CUBE_MAX_ALT = 854 # Battle cube ceiling (meters MSL) BATTLE_CUBE_CTR_LAT, BATTLE_CUBE_CTR_LON = \ gps.gps_newpos(BATTLE_CUBE_SW_LAT, BATTLE_CUBE_SW_LON, \ math.radians(BATTLE_CUBE_ORIENT) + math.pi/2.0, \ BATTLE_CUBE_WIDTH / 2.0) - STAGE_CUBE_WIDTH = 200 BLUE_STAGE_SW_LAT = 35.721911488829534 BLUE_STAGE_SW_LON = -120.77501064637208 diff --git a/ap_lib/src/ap_lib/bitmapped_bytes.py b/ap_lib/src/ap_lib/bitmapped_bytes.py index 82a4fe6495590d117c2b1d092c387810c1e97e36..313dd1bc4ba985b54bb3a96b2b1e27a4473c7043 100644 --- a/ap_lib/src/ap_lib/bitmapped_bytes.py +++ b/ap_lib/src/ap_lib/bitmapped_bytes.py @@ -197,7 +197,7 @@ class ShortParser(BitmappedBytes): ''' Sets parameter values from a bitmapped byte array @param bytes: bitmapped byte array ''' - self.value = struct.unpack_from(type(self).fmt, bytes, 0) + self.value, = struct.unpack_from(type(self).fmt, bytes, 0) class UShortParser(ShortParser): @@ -466,7 +466,7 @@ class BoxPatrolParser(BitmappedBytes): class SearchOrderParser(BitmappedBytes): ''' Parser swarm search orders ''' - fmt = ">ffffBB" + fmt = ">fffff" def __init__(self): ''' Initializes parameters with default values @@ -475,8 +475,7 @@ class SearchOrderParser(BitmappedBytes): self.lon = 0.0 self.areaLength = 0.0 self.areaWidth = 0.0 - self.masterID = 0 - self.algorithmNumber = 0 + self.areaOrientation = 0.0 def pack(self): @@ -485,16 +484,16 @@ class SearchOrderParser(BitmappedBytes): ''' return struct.pack(type(self).fmt, self.lat, self.lon, \ self.areaLength, self.areaWidth, \ - self.masterID, self.algorithmNumber) + self.areaOrientation) def unpack(self, bytes): ''' Sets parameter values from a bitmapped byte array @param bytes: bitmapped byte array ''' - self.lat, self.lon, self.areaLength, self.areaWidth, \ - self.masterID, self.algorithmNumber = \ - struct.unpack_from(type(self).fmt, bytes, 0) + self.lat, self.lon, \ + self.areaLength, self.areaWidth, self.areaOrientation = \ + struct.unpack_from(type(self).fmt, bytes, 0) class SearchWaypointParser(VariableLengthBitmappedBytes): @@ -1020,7 +1019,6 @@ class WingmanParser(BitmappedBytes): #------------------------------------------------ - class AuctionSearchBasicAreaParser(BitmappedBytes): ''' Parser for an AuctionSearch geobox message (specifies a rectangular box @@ -1036,12 +1034,14 @@ class AuctionSearchBasicAreaParser(BitmappedBytes): self.width = 0 self.orientation = 0.0 + def pack(self): tupl = (int(self.latitude * 1e07), \ int(self.longitude * 1e07), \ int(self.length), int(self.width), self.orientation) return struct.pack(type(self).fmt, *tupl) + def unpack(self, bytes): fields = struct.unpack_from(type(self).fmt, bytes, 0) self.latitude = fields[0] / 1e07 @@ -1051,7 +1051,6 @@ class AuctionSearchBasicAreaParser(BitmappedBytes): self.orientation = fields[4] - class NewAuctionParser(BitmappedBytes): fmt = ">BB???" @@ -1062,14 +1061,15 @@ class NewAuctionParser(BitmappedBytes): self.claim_next_cell= False self.target_found = False + def pack(self): return struct.pack(type(self).fmt, self.source_id, self.next_cell_id, self.search_auction, self.claim_next_cell, self.target_found) + def unpack(self, bytes): self.source_id, self.next_cell_id, self.search_auction, self.claim_next_cell, self.target_found = struct.unpack_from(type(self).fmt, bytes, 0) - class AuctionSearchBidParser(BitmappedBytes): fmt = '>BBbf' @@ -1079,14 +1079,15 @@ class AuctionSearchBidParser(BitmappedBytes): self.bid_cell_id = 0 self.bid_value = 0.0 + def pack(self): return struct.pack(type(self).fmt, self.source_id, self.round_id, self.bid_cell_id, self.bid_value) + def unpack(self, bytes): self.source_id, self.round_id, self.bid_cell_id, self.bid_value = struct.unpack_from(type(self).fmt, bytes, 0) - class AuctionSearchCellsParser(BitmappedBytes): fmt_base = ">HHH" fmt_base_sz = struct.calcsize(fmt_base) @@ -1098,6 +1099,7 @@ class AuctionSearchCellsParser(BitmappedBytes): self.round_id = 0 self.cell_list = [ ] # format: [ [cell_id, cell_status, cell_owner, cell_cost], ... ] + def pack(self): num_cells = len(self.cell_list) tupl = (self.source_id, self.round_id, num_cells) @@ -1106,6 +1108,7 @@ class AuctionSearchCellsParser(BitmappedBytes): fmt = type(self).fmt_base + num_cells * type(self).data_fmt.lstrip('>') return struct.pack(fmt, *tupl) + def unpack(self, bytes): [self.source_id, self.round_id, num_cells] = struct.unpack_from(type(self).fmt_base, bytes, 0) self.cell_list = [ ] @@ -1115,12 +1118,3 @@ class AuctionSearchCellsParser(BitmappedBytes): self.cell_list.append( [data[0], data[1], data[2], data[3]] ) offset += type(self).data_fmt_sz - -''' -BONEYARD - -''' - - - -