diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml
index be95548ccb..871d91043e 100644
--- a/.github/workflows/docs.yaml
+++ b/.github/workflows/docs.yaml
@@ -8,7 +8,7 @@ on:
jobs:
build_and_push_docs:
- runs-on: ubuntu-latest
+ runs-on: ubuntu-18.04
steps:
- name: Checkout
@@ -22,9 +22,10 @@ jobs:
ref: gh-pages
- name: Install dependencies
run: |
- sudo apt-get install python-bson
- sudo apt-get install flex
- sudo apt-get install graphviz
+ sudo apt-get install -y bison
+ sudo apt-get install -y flex
+ sudo apt-get install -y graphviz
+ sudo apt-get install -y python-setuptools
- name: Install doxygen
run: |
wget 'https://sourceforge.net/projects/doxygen/files/rel-1.8.20/doxygen-1.8.20.src.tar.gz'
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 479fbdb383..605c3394b2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,7 +18,7 @@
cmake_minimum_required(VERSION 3.0)
project(Astrobee)
-set(ASTROBEE_VERSION 0.14.1)
+set(ASTROBEE_VERSION 0.14.3)
# Define our options
option(USE_CCACHE
@@ -209,9 +209,17 @@ find_package(Gflags REQUIRED)
ADD_DEFINITIONS(-DFREEFLYER_GFLAGS_NAMESPACE=${GFLAGS_NAMESPACE})
enable_testing()
+if (USE_CTC)
+ find_program(LSB_RELEASE_EXEC lsb_release)
+ execute_process(COMMAND "${LSB_RELEASE_EXEC}" --short --codename OUTPUT_VARIABLE LSB_RELEASE_VERSION_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE)
+ if("${LSB_RELEASE_VERSION_SHORT}" STREQUAL "bionic")
+ set(Protobuf_PROTOC_EXECUTABLE /usr/local/bin/protoc)
+ endif()
+endif (USE_CTC)
+
find_package(Protobuf REQUIRED)
if (NOT PROTOBUF_PROTOC_EXECUTABLE)
- message(FATAL_ERROR "Could not find system's protoc execuable")
+ message(FATAL_ERROR "Could not find system's protoc executable")
endif (NOT PROTOBUF_PROTOC_EXECUTABLE)
find_package(Ceres REQUIRED)
@@ -239,6 +247,11 @@ if (${OpenCV_VERSION} MATCHES "3.3.1")
endif()
endforeach(__cvcomponent)
endif()
+if (USE_CTC)
+ foreach(__cvcomponent ${OpenCV_LIB_COMPONENTS})
+ set(OpenCV_LIBS ${OpenCV_LIBS} "${OpenCV_INSTALL_PATH}/lib/arm-linux-gnueabihf/lib${__cvcomponent}3.so")
+ endforeach(__cvcomponent)
+endif (USE_CTC)
set(OpenCV_LIBRARIES ${OpenCV_LIBS})
find_package(dbow2 REQUIRED)
@@ -308,7 +321,13 @@ if (USE_CTC)
endif (USE_CTC)
if (USE_ROS)
set(ENV{ROS_LANG_DISABLE} "genlisp:gennodejs:geneus:$ENV{ROS_LANG_DISABLE}")
- find_package(catkin2 COMPONENTS roscpp message_generation std_msgs geometry_msgs sensor_msgs cv_bridge image_transport tf tf2 tf2_ros rosbag nodelet rviz)
+
+ if (USE_CTC)
+ find_package(catkin2 COMPONENTS roscpp message_generation std_msgs geometry_msgs sensor_msgs cv_bridge image_transport tf tf2 tf2_ros rosbag nodelet)
+ else ()
+ find_package(catkin2 COMPONENTS roscpp message_generation std_msgs geometry_msgs sensor_msgs cv_bridge image_transport tf tf2 tf2_ros rosbag nodelet rviz)
+ endif (USE_CTC)
+
find_package(Qt5 ${rviz_QT_VERSION} REQUIRED Core Widgets)
if (IS_BAMBOO_BUILD)
diff --git a/RELEASE.md b/RELEASE.md
index be7678d663..33d595ce71 100644
--- a/RELEASE.md
+++ b/RELEASE.md
@@ -1,5 +1,12 @@
# Releases
+## Release 0.14.3
+
+ * Rotation fallback fix
+ * Unified install instructions and Ubuntu 18 nasa install
+ * Various other minor fixes
+ * Note, Perching does not work in this release, use another version for this.
+
## Release 0.14.1
* Dynamic IMU Filtering
diff --git a/astrobee.doxyfile b/astrobee.doxyfile
index 114b3f615a..15399fef38 100644
--- a/astrobee.doxyfile
+++ b/astrobee.doxyfile
@@ -39,7 +39,7 @@ PROJECT_NAME = "NASA Astrobee Robot Software"
# control system is used.
-PROJECT_NUMBER = 0.14.1
+PROJECT_NUMBER = 0.14.3
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
@@ -912,7 +912,8 @@ EXAMPLE_RECURSIVE = NO
# \image command).
IMAGE_PATH = doc/images \
- doc/gen/png
+ doc/gen/png \
+ localization/sparse_mapping
# The INPUT_FILTER tag can be used to specify a program that doxygen should
# invoke to filter for each input file. Doxygen will invoke the filter program
diff --git a/astrobee/commands/freeFlyerPlanSchema.json b/astrobee/commands/freeFlyerPlanSchema.json
index 5097536bd0..ac53e1149c 100644
--- a/astrobee/commands/freeFlyerPlanSchema.json
+++ b/astrobee/commands/freeFlyerPlanSchema.json
@@ -50,17 +50,6 @@
]
},
- {
- "type": "ParamSpec",
- "id": "Data.DownloadMethod",
- "valueType": "string",
- "notes": "Specifies which log to operate on. Typically, the \"Immediate\" log is for high-priority telemetry that should be downloaded immediately after the activity, and the \"Delayed\" log is for other telemetry.",
- "choices": [
- ["Immediate", "Immediate"],
- ["Delayed", "Delayed"]
- ]
- },
-
{
"type": "ParamSpec",
"id": "Settings.FlightMode",
@@ -132,7 +121,7 @@
"type": "ParamSpec",
"id": "Settings.PlannerType",
"valueType": "string",
- "notes": "Which planner to use:
- Trapezoidal planner: Generates a straight-line trajectory from the start position to the target position, with a trapezoidal velocity profile. If not in holonomic mode, the robot will rotate to face the target position before beginning to translate. After translating to the target position, the robot will turn to face the target attitude.
- QP planner: An experimental planner that generates a curved trajectory from start to target, avoiding intervening obstacles. As of 10/2020, using the QP planner is not recommended, because it has not yet been tested on the ISS.
",
+ "notes": "Which planner to use:- Trapezoidal planner: Generates a straight-line trajectory from the start position to the target position, using trapezoidal velocity profiles for translation and rotation. If holonomic mode is disabled (usual case), the robot will (1) rotate to face the target position, (2) translate to the target position while facing forward, (3) rotate to the target attitude. If holonomic mode is enabled, the robot will simultaneously translate along a straight line to the target position while rotating to the target attitude.
- QP planner: An experimental planner that generates a curved trajectory from start to target, avoiding intervening obstacles. As of 10/2020, using the QP planner is not recommended, because it has not yet been tested on the ISS.
",
"choices": [
["trapezoidal", "Trapezoidal"],
["qp", "QuadraticProgram"]
@@ -192,7 +181,7 @@
"type": "CommandSpec",
"id": "Mobility.simpleMove6DOF",
"isRapidNative": true,
- "notes": "Moves the robot to the specified pose.Using the default trapezoidal planner, the move has the following steps:
- If not in holonomic mode, the robot rotates to face the target position.
- Once rotation is complete, the robot translates in a straight line to the target position.
- Once translation is complete, the robot rotates to the target attitude.",
+ "notes": "Moves the robot to the specified pose.Using the default trapezoidal planner, the move works as follows:
- If holonomic mode is disabled (usual case), the robot will sequentially (1) rotate to face the target position, (2) translate to the target position while facing forward, (3) rotate to the target attitude.
- If holonomic mode is enabled, the robot will simultaneously translate along a straight line to the target position while rotating to the target attitude.",
"availableContexts": [
"teleop"
],
@@ -356,19 +345,6 @@
"params": []
},
- {
- "type": "CommandSpec",
- "id": "Admin.wipeHlp",
- "isRapidNative": false,
- "notes": "Not implemented. This command is intended to erase certain data on the Astrobee HLP's local storage.",
- "javaNotes": "Do not use this command. It will erase your running APK.",
- "availableContexts": [
- "teleop"
- ],
- "parent": "Command",
- "params": []
- },
-
{
"type": "CommandSpec",
"id": "Mobility.idlePropulsion",
@@ -382,66 +358,6 @@
"params": []
},
- {
- "type": "CommandSpec",
- "id": "Data.downloadData",
- "isRapidNative": false,
- "oldFswAlias": "startDownload",
- "notes": "Not implemented. This command is intended to start downloading certain data logs stored onboard the robot.Currently, downlink is initiated manually via SSH and rsync, managed by a terminal menu configured in the astrobee_ops repo. See also IRG-FFTEST217 Astrobee Wrap-Up and Shutdown.",
- "javaNotes": "Data can only be downloaded when docked.",
- "availableContexts": [
- "teleop",
- "planner"
- ],
- "parent": "Command",
- "params": [
- {
- "type": "ParamSpec",
- "id": "dataMethod",
- "parent": "Data.DownloadMethod"
- }
- ]
- },
-
- {
- "type": "CommandSpec",
- "id": "Data.stopDownload",
- "isRapidNative": false,
- "isStopCommand": true,
- "stopCommandType": "Data.downloadData",
- "notes": "Not implemented. This command is intended to stop downloading data. See Data.downloadData.",
- "availableContexts": [
- "teleop"
- ],
- "parent": "Command",
- "params": [
- {
- "type": "ParamSpec",
- "id": "dataMethod",
- "parent": "Data.DownloadMethod"
- }
- ]
- },
-
- {
- "type": "CommandSpec",
- "id": "Data.clearData",
- "isRapidNative": false,
- "notes": "Not implemented. This command is intended to clear certain data logs onboard the robot after they have been downloaded, in order to free storage space.Currently, onboard storage is managed as follows:- Prior to an activity, review what files have been downloaded after previous activities, and specify which files are ready be deleted from onboard storage in the Test Readiness Review notes on the FFFSW Confluence wiki.
- Manually delete those files (via SSH session) at the start of the commanding window, before executing the activity.
See also IRG-FFTEST207a Astrobee Quick Wakeup and Checkout.",
- "availableContexts": [
- "teleop",
- "planner"
- ],
- "parent": "Command",
- "params": [
- {
- "type": "ParamSpec",
- "id": "dataMethod",
- "parent": "Data.DownloadMethod"
- }
- ]
- },
-
{
"type": "CommandSpec",
"id": "Mobility.dock",
@@ -772,7 +688,7 @@
"type": "ParamSpec",
"id": "targetAngularVelocity",
"valueType": "float",
- "unit": "deg/s",
+ "unit": "rad/s",
"minimum": 0,
"notes": "The maximum angular velocity to target while rotating"
},
@@ -780,7 +696,7 @@
"type": "ParamSpec",
"id": "targetAngularAcceleration",
"valueType": "float",
- "unit": "deg/s^2",
+ "unit": "rad/s^2",
"minimum": 0,
"notes": "The maximum angular acceleration to target while rotating"
},
@@ -799,7 +715,7 @@
"type": "CommandSpec",
"id": "Settings.setHolonomicMode",
"isRapidNative": false,
- "notes": "Enables/disables holonomic mode.Holonomic mode is sometimes called 'blind flying' because it relaxes the constraint to always point the HazCam forward in order to enable obstacle detection. When in holonomic mode, the default trapezoidal planner will skip its usual first step of slewing attitude to face toward the target position. Instead, it will generate a trajectory that maintains the robot's previous attitude during translation to the target position.",
+ "notes": "Enables/disables holonomic mode.Holonomic mode is sometimes called 'blind flying' because it relaxes the constraint to always point the HazCam in the direction of motion while translating in order to enable obstacle detection. When holonomic mode is enabled, the default trapezoidal planner will simultaneously translate to the target position and rotate to the target attitude.",
"availableContexts": [
"teleop",
"planner"
@@ -986,18 +902,6 @@
]
},
- {
- "type": "CommandSpec",
- "id": "Admin.shutdown",
- "isRapidNative": true,
- "notes": "Not implemented. This command is intended to put Astrobee in hibernate power mode.An Astrobee that is hibernating can't receive Astrobee API commands. However, it can later be remotely awakened, if it is on the dock and not physically switched off. See the procedure IRG-FFTEST217 Astrobee Wrap-Up and Shutdown for current instructions on how to shut down an Astrobee, using a terminal session.",
- "availableContexts": [
- "teleop"
- ],
- "parent": "Command",
- "params": []
- },
-
{
"type": "CommandSpec",
"id": "Mobility.stopAllMotion",
@@ -1132,32 +1036,6 @@
"params": []
},
- {
- "type": "CommandSpec",
- "id": "Settings.genericCommand",
- "isRapidNative": false,
- "notes": "Invokes a 'generic' command, i.e., one that was added to the Astrobee API after the Astrobee control station code freeze. At present, no such commands are defined.",
- "availableContexts": [
- "teleop",
- "planner"
- ],
- "parent": "Command",
- "params": [
- {
- "type": "ParamSpec",
- "id": "commandName",
- "valueType": "string",
- "notes": "Which generic command to invoke."
- },
- {
- "type": "ParamSpec",
- "id": "param",
- "valueType": "string",
- "notes": "The parameters for the generic command, usually formatted as a JSON dictionary. This allows any number of parameters, with arbitrary types."
- }
- ]
- },
-
{
"type": "CommandSpec",
"id": "Admin.loadNodelet",
@@ -1240,7 +1118,7 @@
"type": "CommandSpec",
"id": "Settings.setEnableImmediate",
"isRapidNative": false,
- "notes": "For expert use only. Changes the semantics of how Astrobee executes fplan trajectory segments.A segment specifies the motion trajectory between stations in the plan. Within the segment, desired pose and velocity are smoothly interpolated functions of time over a time interval [t0, t1]. Plans created by the Astrobee control station plan editor always specify each segment's time values relative to the start of that segment's execution (i.e. t0 = 0). These plans must be executed in immediate mode, so called because when execution reaches a new segment, the executive and choreographer immediately 'start the clock' on executing the timed trajectory. In principle, if you want to synchronize motion of multiple robots, it could be useful to have the interval [t0, t1] specified using absolute timestamps. That is the behavior when immediate mode is disabled. The timestamp t0 is interpreted as absolute time using ROS conventions (usually UNIX epoch when running on real hardware, but could be any arbitrary time scale when running in simulation), and the start of motion on the segment would be delayed until the current time t = t0.At this time, we cannot recommend disabling immediate mode to achieve synchronization, due to the following concerns: (1) execution with absolute timestamps has never really been tested, and may be buggy, (2) the control station plan editor doesn't provide any way to generate segments with absolute timestamps, (3) since it is seldom possible to predict exactly when ISS conditions will be right to begin a multi-robot activity, it would be awkward in practice to have the exact absolute timing of segments hard-coded into the plans.As an alternative way to synchronize motion, you can execute with immediate mode enabled as usual, but take special care to minimize any skew in start time. Upload the plans in advance, use the Mobility.prepare command to get the robots ready to move, and then run the plans simultaneously. There could be up to a half a second of delay between the robots starting their plans. See also Settings.setTimeSync. Astrobee to Astrobee communication is also in the works, and may eventually enable synchronizing Astrobees in a better way.Note: Immediate mode motion control is not related to immediate download (as in Data.setDataToDisk).",
+ "notes": "For expert use only. Changes the semantics of how Astrobee executes fplan trajectory segments.A segment specifies the motion trajectory between stations in the plan. Within the segment, desired pose and velocity are smoothly interpolated functions of time over a time interval [t0, t1]. Plans created by the Astrobee control station plan editor always specify each segment's time values relative to the start of that segment's execution (i.e. t0 = 0). These plans must be executed in immediate mode, so called because when execution reaches a new segment, the executive and choreographer immediately 'start the clock' on executing the timed trajectory. In principle, if you want to synchronize motion of multiple robots, it could be useful to have the interval [t0, t1] specified using absolute timestamps. That is the behavior when immediate mode is disabled. The timestamp t0 is interpreted as absolute time using ROS conventions (usually UNIX epoch when running on real hardware, but could be any arbitrary time scale when running in simulation), and the start of motion on the segment would be delayed until the current time t = t0.At this time, we cannot recommend disabling immediate mode to achieve synchronization, due to the following concerns: (1) execution with absolute timestamps has never really been tested, and may be buggy, (2) the control station plan editor doesn't provide any way to generate segments with absolute timestamps, (3) since it is seldom possible to predict exactly when ISS conditions will be right to begin a multi-robot activity, it would be awkward in practice to have the exact absolute timing of segments hard-coded into the plans.As an alternative way to synchronize motion, you can execute with immediate mode enabled as usual, but take special care to minimize any skew in start time. Upload the plans in advance, use the Mobility.prepare command to get the robots ready to move, and then run the plans simultaneously. Astrobee to Astrobee communication is in the works, and may eventually enable synchronizing Astrobees in a better way.",
"availableContext": [
"teleop"
],
@@ -1257,28 +1135,28 @@
{
"type": "CommandSpec",
- "id": "Settings.setTimeSync",
+ "id": "Settings.setPlanner",
"isRapidNative": false,
- "notes": "For expert use only. Enables 'discrete time unit' synchronization for multiple Astrobees.Enabling time sync changes how Astrobee initiates motion along each trajectory segment. It delays the start of motion until the time is an integer multiple of the discrete time unit, a configurable value that is currently set to five seconds. The idea is that if an operator tries to start two robots moving at the same time, even if there is some differential delay in how long the command takes to arrive at each robot, as long as both robots receive the command within the same discrete time unit window, they will start at the same moment (i.e., the beginning of the next window).However, we can not recommend enabling time sync to achieve synchronization at this time, due to the following concerns: (1) execution with time sync has never really been tested, and may be buggy, (2) the synchronization protocol is not robust: one can not guarantee that the different robots will receive the command within the same discrete time unit window.",
+ "notes": "Switches which trajectory planner is used when Astrobee needs to generate a trajectory to reach a target pose. Astrobee uses its trajectory planner when it receives a teleoperation motion command. However, when an fplan is generated by the Astrobee control station plan editor, it normally contains pre-computed trajectories for its motion segments; when Astrobee executes these fplans, the onboard trajectory planner is not used.",
"availableContext": [
- "teleop"
+ "teleop",
+ "planner"
],
"parent": "Command",
"params": [
{
"type": "ParamSpec",
- "id": "setTimeSync",
- "valueType": "boolean",
- "notes": "Set to true/false to enable/disable discrete time unit synchronization."
+ "id": "planner",
+ "parent": "Settings.PlannerType"
}
]
},
{
"type": "CommandSpec",
- "id": "Settings.setPlanner",
+ "id": "Settings.setEnableReplan",
"isRapidNative": false,
- "notes": "Switches which trajectory planner is used when Astrobee needs to generate a trajectory to reach a target pose. Astrobee uses its trajectory planner when it receives a teleoperation motion command. However, when an fplan is generated by the Astrobee control station plan editor, it normally contains pre-computed trajectories for its motion segments; when Astrobee executes these fplans, the onboard trajectory planner is not used.",
+ "notes": "Allows Astrobee to re-plan if it detects an obstacle too close to its forward trajectory. Enabling replanning only makes sense when you are using a planner that is able to plan around obstacles. (See Setting.setPlanner. As of 5/2021, only the QP planner can plan around obstacles).",
"availableContext": [
"teleop",
"planner"
@@ -1287,8 +1165,9 @@
"params": [
{
"type": "ParamSpec",
- "id": "planner",
- "parent": "Settings.PlannerType"
+ "id": "enableReplan",
+ "valueType": "boolean",
+ "notes": "If true, when Astrobee detects an obstacle too close to its forward trajectory, after the robot comes to a stop, the choreographer will automatically request a new trajectory from the current configured planner. If false, the robot will stop and wait for operator assistance."
}
]
},
diff --git a/astrobee/config/commands.config b/astrobee/config/commands.config
index 06b8302128..aa69b5bba6 100644
--- a/astrobee/config/commands.config
+++ b/astrobee/config/commands.config
@@ -66,10 +66,6 @@ commandConfig = {
name="resetEkf",
parameters={}
},
- {
- name="shutdown",
- parameters={}
- },
{
name="switchLocalization",
parameters={
@@ -113,10 +109,6 @@ commandConfig = {
type="RAPID_INT"
}
}
- },
- {
- name="wipeHlp",
- parameters={}
}
},
name="AdminType"
@@ -162,24 +154,6 @@ commandConfig = {
},
{
commands={
- {
- name="clearData",
- parameters={
- {
- key="dataMethod",
- type="RAPID_STRING"
- }
- }
- },
- {
- name="downloadData",
- parameters={
- {
- key="dataMethod",
- type="RAPID_STRING"
- }
- }
- },
{
name="setDataToDisk",
parameters={}
@@ -193,15 +167,6 @@ commandConfig = {
}
}
},
- {
- name="stopDownload",
- parameters={
- {
- key="dataMethod",
- type="RAPID_STRING"
- }
- }
- },
{
name="stopRecording",
parameters={}
@@ -363,19 +328,6 @@ commandConfig = {
},
{
commands={
- {
- name="genericCommand",
- parameters={
- {
- key="commandName",
- type="RAPID_STRING"
- },
- {
- key="param",
- type="RAPID_STRING"
- }
- }
- },
{
name="setCamera",
parameters={
@@ -463,6 +415,15 @@ commandConfig = {
}
}
},
+ {
+ name="setEnableReplan",
+ parameters={
+ {
+ key="enableReplan",
+ type="RAPID_BOOL"
+ }
+ }
+ },
{
name="setFlashlightBrightness",
parameters={
@@ -561,15 +522,6 @@ commandConfig = {
}
}
},
- {
- name="setTimeSync",
- parameters={
- {
- key="setTimeSync",
- type="RAPID_BOOL"
- }
- }
- },
{
name="setZones",
parameters={}
diff --git a/astrobee/config/graph_localizer.config b/astrobee/config/graph_localizer.config
index b955234454..ad6f5d842f 100644
--- a/astrobee/config/graph_localizer.config
+++ b/astrobee/config/graph_localizer.config
@@ -17,7 +17,7 @@
require "context"
-- Graph Value Options
-ideal_duration = 3.5
+ideal_duration = 3.25
-- Don't leave less than min_num_states in window if possible
min_num_states = 3
max_num_states = 20
@@ -42,7 +42,6 @@ huber_k = world_huber_k
ignore_gravity = true
estimate_world_T_dock_using_loc = true
-- Applies to factor adders but not standstill detection
-optical_flow_measurement_spacing = 2
-- Sanity Checker options
-- TODO(rsoussan): Create seperate config for sanity checker?
check_pose_difference = true
@@ -58,15 +57,19 @@ starting_prior_quaternion_stddev = 0.01
starting_prior_velocity_stddev = 0.01
starting_prior_accel_bias_stddev = 0.001
starting_prior_gyro_bias_stddev = 0.001
+-- Threshold Bias Uncertainies
+threshold_bias_uncertainty = true
+accel_bias_stddev_threshold = 0.025
+gyro_bias_stddev_threshold = 0.025
-- Lost Threshold
position_cov_log_det_lost_threshold = 0
orientation_cov_log_det_lost_threshold = 0
-- Feature Tracker
-feature_tracker_sliding_window_duration = 3.5
+feature_tracker_sliding_window_duration = 3.25
-- Standstill
max_standstill_feature_track_avg_distance_from_mean = 0.075
standstill_min_num_points_per_track = 4
-standstill_feature_tracker_sliding_window_duration = 1
+standstill_feature_track_duration = 1
standstill_adder_add_velocity_prior = true
standstill_adder_add_pose_between_factor = true
standstill_adder_prior_velocity_stddev = 0.01
@@ -82,13 +85,16 @@ smart_projection_adder_dynamic_outlier_rejection_threshold = 50
smart_projection_adder_retriangulation_threshold = 1e-5
smart_projection_adder_verbose_cheirality = false
smart_projection_adder_robust = true
-smart_projection_adder_max_num_factors = 10
+smart_projection_adder_max_num_factors = 13
smart_projection_adder_min_num_points = 2
-smart_projection_adder_max_num_points_per_factor = 5
-smart_projection_adder_rotation_only_fallback = false
+smart_projection_adder_max_num_points_per_factor = 7
+smart_projection_adder_measurement_spacing = 2
+smart_projection_adder_feature_track_min_separation = 0
+smart_projection_adder_rotation_only_fallback = true
smart_projection_adder_splitting = true
smart_projection_adder_scale_noise_with_num_points = true
smart_projection_adder_noise_scale = 2
+smart_projection_adder_use_allowed_timestamps = true
-- Optical Flow Projection Factors
projection_adder_enabled = false
projection_adder_enable_EPI = false
@@ -101,8 +107,8 @@ projection_adder_point_prior_translation_stddev = 0.1
-- Loc Factors
loc_adder_add_pose_priors = false
loc_adder_add_projections = true
-loc_adder_prior_translation_stddev = 0.01
-loc_adder_prior_quaternion_stddev = 0.01
+loc_adder_prior_translation_stddev = 0.06
+loc_adder_prior_quaternion_stddev = 0.06
loc_adder_min_num_matches = 5
loc_adder_max_num_factors = 50
loc_adder_scale_pose_noise_with_num_landmarks = true
diff --git a/astrobee/config/hw/pmc_actuator.config b/astrobee/config/hw/pmc_actuator.config
index dd64e97042..482b2fef27 100644
--- a/astrobee/config/hw/pmc_actuator.config
+++ b/astrobee/config/hw/pmc_actuator.config
@@ -42,6 +42,9 @@ i2c_retries = 3
-- Control rate in Hz
control_rate_hz = 62.5
+-- Maximum PMC time without control input
+max_timeout = 2.0
+
-- The null speed and nozzle positions
null_speed = 0
null_nozzle_positions = {128, 128, 128, 128, 128, 128}
diff --git a/astrobee/config/management/data_bagger.config b/astrobee/config/management/data_bagger.config
index 1f3bed440e..f68b3e38c0 100644
--- a/astrobee/config/management/data_bagger.config
+++ b/astrobee/config/management/data_bagger.config
@@ -51,6 +51,7 @@ default_topics = {{topic="gnc/ctl/traj", downlink="immediate", frequency=-1},
{topic="command", downlink="immediate", frequency=-1},
{topic="mgt/ack", downlink="immediate", frequency=-1},
{topic="mgt/sys_monitor/time_diff", downlink="immediate", frequency=-1},
+ {topic="rosout", downlink="immediate", frequency=-1},
{topic="robot_name", downlink="immediate", frequency=-1}}
require "context"
diff --git a/astrobee/config/robots/bumble.config b/astrobee/config/robots/bumble.config
index 7f6784240b..10d235a4e3 100644
--- a/astrobee/config/robots/bumble.config
+++ b/astrobee/config/robots/bumble.config
@@ -25,16 +25,15 @@ robot_i2c_bus = "/dev/i2c-1"
robot_imu_drdy_pin = 4
robot_geometry = {
--- Placeholder transforms, not accurate!
- hazcam_to_navcam_transform = transform(vec3(0.08017845188659993, 0.0015130070850712233, -0.0037397072731650606), quat4(-0.010795173083773568, -0.020686270289023867, 0.99972637753705862, -0.0016469718428887884)),
- scicam_to_hazcam_transform = transform(vec3(0.039812511450892832, 0.017762378646844504, -0.0039477526753304197), quat4(-0.0017211102261497006, -0.023078433050076921, 0.99972939958575946, -0.0023561221189618764)),
+ hazcam_to_navcam_transform = transform(vec3(0.070656217, -0.0053120391, -0.0086391367), quat4(-0.0033938631, 0.011939978, 0.99990009, -0.0067619677)),
+ scicam_to_hazcam_transform = transform(vec3(0.043949838, -0.026925687, -0.14459291), quat4(-0.009399956, 0.015955961, 0.99982772, -0.0012581665)),
navcam_to_hazcam_timestamp_offset = -0.02,
- scicam_to_hazcam_timestamp_offset = -0.31,
- hazcam_depth_to_image_transform = {
- 0.9672, 0.0017, 0.0111, -0.0060,
- -0.0016, 0.9672, -0.0065, 0.0040,
- -0.0112, 0.0065, 0.9672, -0.0133,
- 0.0, 0.0, 0.0, 1.0},
+ scicam_to_hazcam_timestamp_offset = 0.5,
+ hazcam_depth_to_image_transform = {
+ 0.91122714, -0.00020224138, -0.00066071236, 0.00091477566,
+ 0.00020680677, 0.91120557, 0.0063030044, -0.0072143461,
+ 0.00065929762, -0.0063031525, 0.91120536, -0.0035329091,
+ 0, 0, 0, 1},
-- Engineering positions with idealized orientations
perch_cam_transform = transform(vec3(-0.1331, 0.0509, -0.0166), quat4(0.000, -0.70710678118, 0.000, 0.70710678118)),-- placeholder, not valid!
@@ -77,10 +76,10 @@ robot_camera_calibrations = {
exposure=150
},
haz_cam = {
- distortion_coeff = {-0.411106, 0.375288, -0.00080993, -0.00817328},
+ distortion_coeff = {-0.050689743, -1.1461691, -0.001373226, -0.00056427513},
intrinsic_matrix = {
- 188.27394, 0.0, 117.94881,
- 0.0, 186.18359, 87.740547,
+ 215.88697, 0.0, 114.12908,
+ 0.0, 215.88697, 86.547331,
0.0, 0.0, 1.0
},
gain=50,
@@ -88,10 +87,10 @@ robot_camera_calibrations = {
},
-- Placeholder for sci_cam, not accurate!
sci_cam = {
- distortion_coeff = {0.128628, -0.167456, 0.00213421, -0.00262211},
+ distortion_coeff = {0.10733913, -0.10935864, 0.0010663099, 0.0010407278},
intrinsic_matrix = {
- 859.44015, 0.0, 754.24485,
- 0.0, 849.35466, 487.7349,
+ 1138.4943, 0.0, 680.36447,
+ 0.0, 1138.4943, 534.00133,
0.0, 0.0, 1.0
},
gain=50,
diff --git a/astrobee/config/tools/graph_bag.config b/astrobee/config/tools/graph_bag.config
index cac1ad6826..55969624f5 100644
--- a/astrobee/config/tools/graph_bag.config
+++ b/astrobee/config/tools/graph_bag.config
@@ -33,4 +33,5 @@ ar_min_msg_spacing = 0
-- graph_localizer_simulator
optimization_time = 0.30
-- Other
-save_optical_flow_images = false;
+save_optical_flow_images = false
+log_relative_time = false
diff --git a/astrobee/config/worlds/granite.config b/astrobee/config/worlds/granite.config
index 00baead1cc..65895a872c 100755
--- a/astrobee/config/worlds/granite.config
+++ b/astrobee/config/worlds/granite.config
@@ -151,9 +151,9 @@ world_flight_modes = {
speed = 2;
-- Tolerances
- tolerance_pos = 0.15; -- Position (10 cm)
+ tolerance_pos = 0.2; -- Position (20 cm)
tolerance_vel = 0; -- Velocity (disabled)
- tolerance_att = 0.1745; -- Attitude (10 degrees)
+ tolerance_att = 0.3491; -- Attitude (20 degrees)
tolerance_omega = 0; -- Omega (disabled)
tolerance_time = 1.0; -- Time (for sync check)
diff --git a/astrobee/config/worlds/iss.config b/astrobee/config/worlds/iss.config
index 7f43b0c3c1..73c70dae7a 100755
--- a/astrobee/config/worlds/iss.config
+++ b/astrobee/config/worlds/iss.config
@@ -160,9 +160,9 @@ world_flight_modes = {
speed = 2;
-- Tolerances
- tolerance_pos = 0.1; -- Position (10 cm)
+ tolerance_pos = 0.4; -- Position (40 cm)
tolerance_vel = 0; -- Velocity (disabled)
- tolerance_att = 0.1745; -- Attitude (10 degrees)
+ tolerance_att = 0.3491; -- Attitude (20 degrees)
tolerance_omega = 0; -- Omega (disabled)
tolerance_time = 1.0; -- Time (for sync check)
diff --git a/astrobee/launch/astrobee.launch b/astrobee/launch/astrobee.launch
index e00b14a02b..41c5ca138f 100644
--- a/astrobee/launch/astrobee.launch
+++ b/astrobee/launch/astrobee.launch
@@ -134,9 +134,9 @@
name="ROS_HOSTNAME" value="$(arg mlp)" />
-
-
diff --git a/astrobee/launch/sim.launch b/astrobee/launch/sim.launch
index 2ad5ebf0a2..aaeb06ae2c 100644
--- a/astrobee/launch/sim.launch
+++ b/astrobee/launch/sim.launch
@@ -50,7 +50,7 @@
-
+
@@ -142,7 +142,7 @@
-
+
@@ -221,4 +221,7 @@
+
+
+
diff --git a/astrobee/scripts/cpu_print_version.sh b/astrobee/scripts/cpu_print_version.sh
index 53dd8a1158..190127cd6c 100755
--- a/astrobee/scripts/cpu_print_version.sh
+++ b/astrobee/scripts/cpu_print_version.sh
@@ -15,12 +15,14 @@ echo "Kernel: $(uname -r)"
lsb_release -r
echo "Ros $(rosversion -d) $(rosversion roscpp)"
echo "Debians:"
-echo " astrobee0: $(deb_version astrobee0)"
+echo " astrobee-comms: $(deb_version astrobee-comms)"
+echo " astrobee0: $(deb_version astrobee0)"
echo " astrobee-config: $(deb_version astrobee-config)"
echo " astrobee-avionics: $(deb_version astrobee-avionics)"
echo "FSW Version:"
cat /opt/astrobee/version.txt | sed 's/^/ /'
echo "Modified Files:"
+dpkg -V astrobee-comms | sed 's/^/ /'
dpkg -V astrobee0 | sed 's/^/ /'
dpkg -V astrobee-config | sed 's/^/ /'
dpkg -V astrobee-avionics | sed 's/^/ /'
diff --git a/communications/dds_msgs/idl/AstrobeeCommandConstants.idl b/communications/dds_msgs/idl/AstrobeeCommandConstants.idl
index 912b3d88fa..4a65e11e47 100644
--- a/communications/dds_msgs/idl/AstrobeeCommandConstants.idl
+++ b/communications/dds_msgs/idl/AstrobeeCommandConstants.idl
@@ -96,9 +96,6 @@ module rapid {
const rapid::String32 ADMIN_METHOD_WAKE_SAFE_PARAM_BERTH_NUMBER = "berthNumber";
const rapid::DataType ADMIN_METHOD_WAKE_SAFE_DTYPE_BERTH_NUMBER = rapid::RAPID_INT;
- //@copy-declaration /** Not implemented. This command is intended to erase certain data on the Astrobee HLP's local storage. */
- const rapid::String32 ADMIN_METHOD_WIPE_HLP = "wipeHlp";
-
const rapid::String32 ARM = "Arm";
//@copy-declaration /** Moves Astrobee's arm.The arm has two joints. The tilt joint is used to deploy/stow the arm and adjust the SciCam tilt angle while perched. The pitch joint is used to adjust the SciCam pan angle while perched.The (pan, tilt) = (0, 0) reference position is defined to have the arm fully deployed and aligned with the robot's -X axis. If perched on a handrail on an ISS wall, this position should nominally make the SciCam camera axis point directly toward the opposite wall. Increasing the tilt angle tilts the SciCam up, and increasing the pan angle pans the SciCam to the right. The arm's stowed position is (pan, tilt) = (0, 180).The arm joints will be moved sequentially:- Pan: If which is "Pan" or "Both", pan to the specified pan angle.
- Tilt: If which is "Tilt" or "Both", tilt to the specified tilt angle.
Naturally, if you prefer to tilt first, you can issue a tilt-only move, followed by a pan-only move.Some mistakes to avoid include:- While the arm is partially within its payload bay (tilt > 90), the pan angle must be 0 to avoid the arm colliding with its payload bay.
- While the arm is close to its fully stowed state (tilt > 160), the gripper must be closed to avoid colliding with the arm's payload bay.
- While perched, the nominal tilt range of motion is restricted to -20 .. +90.
- While perched, the arm may not be able to realize its full nominal range of motion without causing Astrobee's body to collide with the wall. The actual range of motion depends on clutter and how far the handrail projects from the wall.
*/
@@ -131,20 +128,6 @@ module rapid {
const rapid::String32 DATA = "Data";
- //@copy-declaration /** Not implemented. This command is intended to clear certain data logs onboard the robot after they have been downloaded, in order to free storage space.Currently, onboard storage is managed as follows:- Prior to an activity, review what files have been downloaded after previous activities, and specify which files are ready be deleted from onboard storage in the Test Readiness Review notes on the FFFSW Confluence wiki.
- Manually delete those files (via SSH session) at the start of the commanding window, before executing the activity.
See also IRG-FFTEST207a Astrobee Quick Wakeup and Checkout. */
- const rapid::String32 DATA_METHOD_CLEAR_DATA = "clearData";
-
- //@copy-declaration /** Specifies which log to operate on. Typically, the "Immediate" log is for high-priority telemetry that should be downloaded immediately after the activity, and the "Delayed" log is for other telemetry. */
- const rapid::String32 DATA_METHOD_CLEAR_DATA_PARAM_DATA_METHOD = "dataMethod";
- const rapid::DataType DATA_METHOD_CLEAR_DATA_DTYPE_DATA_METHOD = rapid::RAPID_STRING;
-
- //@copy-declaration /** Not implemented. This command is intended to start downloading certain data logs stored onboard the robot.Currently, downlink is initiated manually via SSH and rsync, managed by a terminal menu configured in the astrobee_ops repo. See also IRG-FFTEST217 Astrobee Wrap-Up and Shutdown. */
- const rapid::String32 DATA_METHOD_DOWNLOAD_DATA = "downloadData";
-
- //@copy-declaration /** Specifies which log to operate on. Typically, the "Immediate" log is for high-priority telemetry that should be downloaded immediately after the activity, and the "Delayed" log is for other telemetry. */
- const rapid::String32 DATA_METHOD_DOWNLOAD_DATA_PARAM_DATA_METHOD = "dataMethod";
- const rapid::DataType DATA_METHOD_DOWNLOAD_DATA_DTYPE_DATA_METHOD = rapid::RAPID_STRING;
-
//@copy-declaration /** Sets the data-to-disk configuration, which specifies how to log ROS telemetry topics to the robot's onboard storage.The configuration is specified in a JSON-formatted file that contains a list of topic entries. For each logged topic, one specifies:- frequency: Throttles the maximum rate at which to record messages on the topic. Specify -1 to disable throttling. Note: Currently, throttling is not implemented. You must specify -1.
- downlinkOption: Which log to store messages in, which must be "Immediate" or "Delayed". The intent is that the "Immediate" log is for high-priority data, which can then be prioritized for downlink after the activity. Note: Currently, you must specify "Delayed" ("Immediate" downlink is currently reserved for internal use by the flight software stack).
Sample data-to-disk configuration files can be found in astrobee_ops/gds/ControlStationConfig.The Astrobee control station implements the protocol for managing onboard telemetry recording:- Uplink a new data-to-disk file using the RAPID compressed file protocol over DDS. (File uplink is not considered a command, so it does not appear in this command dictionary).
- Send this Data.setDataToDisk command to load the uplinked file. Any errors in the file will be reported at this time.
- Use the Data.startRecording / Data.stopRecording commands to start / stop onboard telemetry logging.
*/
const rapid::String32 DATA_METHOD_SET_DATA_TO_DISK = "setDataToDisk";
@@ -155,13 +138,6 @@ module rapid {
const rapid::String32 DATA_METHOD_START_RECORDING_PARAM_DESCRIPTION = "description";
const rapid::DataType DATA_METHOD_START_RECORDING_DTYPE_DESCRIPTION = rapid::RAPID_STRING;
- //@copy-declaration /** Not implemented. This command is intended to stop downloading data. See Data.downloadData. */
- const rapid::String32 DATA_METHOD_STOP_DOWNLOAD = "stopDownload";
-
- //@copy-declaration /** Specifies which log to operate on. Typically, the "Immediate" log is for high-priority telemetry that should be downloaded immediately after the activity, and the "Delayed" log is for other telemetry. */
- const rapid::String32 DATA_METHOD_STOP_DOWNLOAD_PARAM_DATA_METHOD = "dataMethod";
- const rapid::DataType DATA_METHOD_STOP_DOWNLOAD_DTYPE_DATA_METHOD = rapid::RAPID_STRING;
-
//@copy-declaration /** Stops logging ROS telemetry to onboard storage, as initiated by Data.startRecording. See also Data.setDataToDisk. */
const rapid::String32 DATA_METHOD_STOP_RECORDING = "stopRecording";
@@ -258,17 +234,6 @@ module rapid {
const rapid::String32 SETTINGS = "Settings";
- //@copy-declaration /** Invokes a 'generic' command, i.e., one that was added to the Astrobee API after the Astrobee control station code freeze. At present, no such commands are defined. */
- const rapid::String32 SETTINGS_METHOD_GENERIC_COMMAND = "genericCommand";
-
- //@copy-declaration /** Which generic command to invoke. */
- const rapid::String32 SETTINGS_METHOD_GENERIC_COMMAND_PARAM_COMMAND_NAME = "commandName";
- const rapid::DataType SETTINGS_METHOD_GENERIC_COMMAND_DTYPE_COMMAND_NAME = rapid::RAPID_STRING;
-
- //@copy-declaration /** The parameters for the generic command, usually formatted as a JSON dictionary. This allows any number of parameters, with arbitrary types. */
- const rapid::String32 SETTINGS_METHOD_GENERIC_COMMAND_PARAM_PARAM = "param";
- const rapid::DataType SETTINGS_METHOD_GENERIC_COMMAND_DTYPE_PARAM = rapid::RAPID_STRING;
-
//@copy-declaration /** Sets camera parameters.The Astrobee camera control life cycle is as follows:- When the Astrobee flight software stack is started, recording and streaming are initially disabled for all cameras, and the default camera parameters are as specified in the astrobee/config/cameras.config file.
- For each camera, while recording and streaming are disabled, you may use this Settings.setCamera command to adjust its parameters.
- For each camera, you may enable/disable recording imagery to onboard storage using Settings.setCameraRecording.
- For each camera, you may enable/disable live imagery downlink using Settings.setCameraStreaming.
*/
const rapid::String32 SETTINGS_METHOD_SET_CAMERA = "setCamera";
@@ -335,13 +300,20 @@ module rapid {
const rapid::String32 SETTINGS_METHOD_SET_ENABLE_AUTO_RETURN_PARAM_ENABLE_AUTO_RETURN = "enableAutoReturn";
const rapid::DataType SETTINGS_METHOD_SET_ENABLE_AUTO_RETURN_DTYPE_ENABLE_AUTO_RETURN = rapid::RAPID_BOOL;
- //@copy-declaration /** For expert use only. Changes the semantics of how Astrobee executes fplan trajectory segments.A segment specifies the motion trajectory between stations in the plan. Within the segment, desired pose and velocity are smoothly interpolated functions of time over a time interval [t0, t1]. Plans created by the Astrobee control station plan editor always specify each segment's time values relative to the start of that segment's execution (i.e. t0 = 0). These plans must be executed in immediate mode, so called because when execution reaches a new segment, the executive and choreographer immediately 'start the clock' on executing the timed trajectory. In principle, if you want to synchronize motion of multiple robots, it could be useful to have the interval [t0, t1] specified using absolute timestamps. That is the behavior when immediate mode is disabled. The timestamp t0 is interpreted as absolute time using ROS conventions (usually UNIX epoch when running on real hardware, but could be any arbitrary time scale when running in simulation), and the start of motion on the segment would be delayed until the current time t = t0.At this time, we cannot recommend disabling immediate mode to achieve synchronization, due to the following concerns: (1) execution with absolute timestamps has never really been tested, and may be buggy, (2) the control station plan editor doesn't provide any way to generate segments with absolute timestamps, (3) since it is seldom possible to predict exactly when ISS conditions will be right to begin a multi-robot activity, it would be awkward in practice to have the exact absolute timing of segments hard-coded into the plans.As an alternative way to synchronize motion, you can execute with immediate mode enabled as usual, but take special care to minimize any skew in start time. Upload the plans in advance, use the Mobility.prepare command to get the robots ready to move, and then run the plans simultaneously. There could be up to a half a second of delay between the robots starting their plans. See also Settings.setTimeSync. Astrobee to Astrobee communication is also in the works, and may eventually enable synchronizing Astrobees in a better way.Note: Immediate mode motion control is not related to immediate download (as in Data.setDataToDisk). */
+ //@copy-declaration /** For expert use only. Changes the semantics of how Astrobee executes fplan trajectory segments.A segment specifies the motion trajectory between stations in the plan. Within the segment, desired pose and velocity are smoothly interpolated functions of time over a time interval [t0, t1]. Plans created by the Astrobee control station plan editor always specify each segment's time values relative to the start of that segment's execution (i.e. t0 = 0). These plans must be executed in immediate mode, so called because when execution reaches a new segment, the executive and choreographer immediately 'start the clock' on executing the timed trajectory. In principle, if you want to synchronize motion of multiple robots, it could be useful to have the interval [t0, t1] specified using absolute timestamps. That is the behavior when immediate mode is disabled. The timestamp t0 is interpreted as absolute time using ROS conventions (usually UNIX epoch when running on real hardware, but could be any arbitrary time scale when running in simulation), and the start of motion on the segment would be delayed until the current time t = t0.At this time, we cannot recommend disabling immediate mode to achieve synchronization, due to the following concerns: (1) execution with absolute timestamps has never really been tested, and may be buggy, (2) the control station plan editor doesn't provide any way to generate segments with absolute timestamps, (3) since it is seldom possible to predict exactly when ISS conditions will be right to begin a multi-robot activity, it would be awkward in practice to have the exact absolute timing of segments hard-coded into the plans.As an alternative way to synchronize motion, you can execute with immediate mode enabled as usual, but take special care to minimize any skew in start time. Upload the plans in advance, use the Mobility.prepare command to get the robots ready to move, and then run the plans simultaneously. Astrobee to Astrobee communication is in the works, and may eventually enable synchronizing Astrobees in a better way. */
const rapid::String32 SETTINGS_METHOD_SET_ENABLE_IMMEDIATE = "setEnableImmediate";
//@copy-declaration /** Set to true/false to enable/disable immediate mode motion control. */
const rapid::String32 SETTINGS_METHOD_SET_ENABLE_IMMEDIATE_PARAM_ENABLE_IMMEDIATE = "enableImmediate";
const rapid::DataType SETTINGS_METHOD_SET_ENABLE_IMMEDIATE_DTYPE_ENABLE_IMMEDIATE = rapid::RAPID_BOOL;
+ //@copy-declaration /** Allows Astrobee to re-plan if it detects an obstacle too close to its forward trajectory. Enabling replanning only makes sense when you are using a planner that is able to plan around obstacles. (See Setting.setPlanner. As of 5/2021, only the QP planner can plan around obstacles). */
+ const rapid::String32 SETTINGS_METHOD_SET_ENABLE_REPLAN = "setEnableReplan";
+
+ //@copy-declaration /** If true, when Astrobee detects an obstacle too close to its forward trajectory, after the robot comes to a stop, the choreographer will automatically request a new trajectory from the current configured planner. If false, the robot will stop and wait for operator assistance. */
+ const rapid::String32 SETTINGS_METHOD_SET_ENABLE_REPLAN_PARAM_ENABLE_REPLAN = "enableReplan";
+ const rapid::DataType SETTINGS_METHOD_SET_ENABLE_REPLAN_DTYPE_ENABLE_REPLAN = rapid::RAPID_BOOL;
+
//@copy-declaration /** Sets flashlight brightness. */
const rapid::String32 SETTINGS_METHOD_SET_FLASHLIGHT_BRIGHTNESS = "setFlashlightBrightness";
@@ -353,7 +325,7 @@ module rapid {
const rapid::String32 SETTINGS_METHOD_SET_FLASHLIGHT_BRIGHTNESS_PARAM_BRIGHTNESS = "brightness";
const rapid::DataType SETTINGS_METHOD_SET_FLASHLIGHT_BRIGHTNESS_DTYPE_BRIGHTNESS = rapid::RAPID_FLOAT;
- //@copy-declaration /** Enables/disables holonomic mode.Holonomic mode is sometimes called 'blind flying' because it relaxes the constraint to always point the HazCam forward in order to enable obstacle detection. When in holonomic mode, the default trapezoidal planner will skip its usual first step of slewing attitude to face toward the target position. Instead, it will generate a trajectory that maintains the robot's previous attitude during translation to the target position. */
+ //@copy-declaration /** Enables/disables holonomic mode.Holonomic mode is sometimes called 'blind flying' because it relaxes the constraint to always point the HazCam in the direction of motion while translating in order to enable obstacle detection. When holonomic mode is enabled, the default trapezoidal planner will simultaneously translate to the target position and rotate to the target attitude. */
const rapid::String32 SETTINGS_METHOD_SET_HOLONOMIC_MODE = "setHolonomicMode";
//@copy-declaration /** Set to true/false to enable/disable holonomic mode. */
@@ -413,7 +385,7 @@ module rapid {
//@copy-declaration /** Switches which trajectory planner is used when Astrobee needs to generate a trajectory to reach a target pose. Astrobee uses its trajectory planner when it receives a teleoperation motion command. However, when an fplan is generated by the Astrobee control station plan editor, it normally contains pre-computed trajectories for its motion segments; when Astrobee executes these fplans, the onboard trajectory planner is not used. */
const rapid::String32 SETTINGS_METHOD_SET_PLANNER = "setPlanner";
- //@copy-declaration /** Which planner to use:- Trapezoidal planner: Generates a straight-line trajectory from the start position to the target position, with a trapezoidal velocity profile. If not in holonomic mode, the robot will rotate to face the target position before beginning to translate. After translating to the target position, the robot will turn to face the target attitude.
- QP planner: An experimental planner that generates a curved trajectory from start to target, avoiding intervening obstacles. As of 10/2020, using the QP planner is not recommended, because it has not yet been tested on the ISS.
*/
+ //@copy-declaration /** Which planner to use:- Trapezoidal planner: Generates a straight-line trajectory from the start position to the target position, using trapezoidal velocity profiles for translation and rotation. If holonomic mode is disabled (usual case), the robot will (1) rotate to face the target position, (2) translate to the target position while facing forward, (3) rotate to the target attitude. If holonomic mode is enabled, the robot will simultaneously translate along a straight line to the target position while rotating to the target attitude.
- QP planner: An experimental planner that generates a curved trajectory from start to target, avoiding intervening obstacles. As of 10/2020, using the QP planner is not recommended, because it has not yet been tested on the ISS.
*/
const rapid::String32 SETTINGS_METHOD_SET_PLANNER_PARAM_PLANNER = "planner";
const rapid::DataType SETTINGS_METHOD_SET_PLANNER_DTYPE_PLANNER = rapid::RAPID_STRING;
@@ -428,13 +400,6 @@ module rapid {
const rapid::String32 SETTINGS_METHOD_SET_TELEMETRY_RATE_PARAM_RATE = "rate";
const rapid::DataType SETTINGS_METHOD_SET_TELEMETRY_RATE_DTYPE_RATE = rapid::RAPID_FLOAT;
- //@copy-declaration /** For expert use only. Enables 'discrete time unit' synchronization for multiple Astrobees.Enabling time sync changes how Astrobee initiates motion along each trajectory segment. It delays the start of motion until the time is an integer multiple of the discrete time unit, a configurable value that is currently set to five seconds. The idea is that if an operator tries to start two robots moving at the same time, even if there is some differential delay in how long the command takes to arrive at each robot, as long as both robots receive the command within the same discrete time unit window, they will start at the same moment (i.e., the beginning of the next window).However, we can not recommend enabling time sync to achieve synchronization at this time, due to the following concerns: (1) execution with time sync has never really been tested, and may be buggy, (2) the synchronization protocol is not robust: one can not guarantee that the different robots will receive the command within the same discrete time unit window. */
- const rapid::String32 SETTINGS_METHOD_SET_TIME_SYNC = "setTimeSync";
-
- //@copy-declaration /** Set to true/false to enable/disable discrete time unit synchronization. */
- const rapid::String32 SETTINGS_METHOD_SET_TIME_SYNC_PARAM_SET_TIME_SYNC = "setTimeSync";
- const rapid::DataType SETTINGS_METHOD_SET_TIME_SYNC_DTYPE_SET_TIME_SYNC = rapid::RAPID_BOOL;
-
//@copy-declaration /** Loads the most recently uplinked keepout zones file.The Astrobee control station implements the protocol for managing keepout zones:- Uplink a new keepout zone file using the RAPID compressed file protocol over DDS. (File uplink is not considered a command, so it does not appear in this command dictionary).
- Send this Settings.setZones command to load the uplinked zones file. Any errors in the file will be reported at this time.
- Use the Settings.setCheckZones command to enable/disable keepout zone checking.
*/
const rapid::String32 SETTINGS_METHOD_SET_ZONES = "setZones";
@@ -449,9 +414,6 @@ module rapid {
const rapid::String32 ARM_ACTION_TYPE_TILT = "Tilt";
const rapid::String32 ARM_ACTION_TYPE_BOTH = "Both";
- const rapid::String32 DATA_DOWNLOAD_METHOD_IMMEDIATE = "Immediate";
- const rapid::String32 DATA_DOWNLOAD_METHOD_DELAYED = "Delayed";
-
const rapid::String32 POWER_POWERED_COMPONENT_LASER_POINTER = "Laser Pointer";
const rapid::String32 POWER_POWERED_COMPONENT_PAYLOAD_TOP_AFT = "Payload Top Aft";
const rapid::String32 POWER_POWERED_COMPONENT_PAYLOAD_BOTTOM_AFT = "Payload Bottom Aft";
diff --git a/communications/dds_msgs/idl/MobilitySettingsState.idl b/communications/dds_msgs/idl/MobilitySettingsState.idl
index 7efcc0f4de..985e2f44d6 100644
--- a/communications/dds_msgs/idl/MobilitySettingsState.idl
+++ b/communications/dds_msgs/idl/MobilitySettingsState.idl
@@ -60,16 +60,17 @@ module rapid {
//@copy-declaration * a LOS. */
public boolean enableAutoReturn;
- //@copy-declaration /** Set this to true to allow mobility to possibly
- //@copy-declaration * help sync moves between multiple Astrobees. */
- public boolean timeSyncEnabled;
-
//@copy-declaration /** Set this to false if mobility should start the
//@copy-declaration * a segment based on its time stamp. */
public boolean immediateEnabled;
//@copy-declaration /** Sets the planner mobility uses. */
public string planner;
+
+ //@copy-declaration /** Setting this to true allows Astrobee to re-plan
+ //@copy-declaration * if there is an obstacle to close to the robot's
+ //@copy-declaration * forward trajectory. */
+ public boolean replanningEnabled;
};
};
};
diff --git a/communications/dds_ros_bridge/src/ros_agent_state.cc b/communications/dds_ros_bridge/src/ros_agent_state.cc
index ea19a338b9..170810c518 100644
--- a/communications/dds_ros_bridge/src/ros_agent_state.cc
+++ b/communications/dds_ros_bridge/src/ros_agent_state.cc
@@ -172,8 +172,8 @@ void ff::RosAgentStateToRapid::Callback(
mob_msg.checkObstacles = status->check_obstacles;
mob_msg.checkKeepouts = status->check_zones;
mob_msg.enableAutoReturn = status->auto_return_enabled;
- mob_msg.timeSyncEnabled = status->time_sync_enabled;
mob_msg.immediateEnabled = status->immediate_enabled;
+ mob_msg.replanningEnabled = status->replanning_enabled;
// Currently the code only supports planners 32 characters long
if (status->planner.size() > 32) {
diff --git a/communications/dds_ros_bridge/src/ros_compressed_image_rapid_image.cc b/communications/dds_ros_bridge/src/ros_compressed_image_rapid_image.cc
index 22496e7199..079e385d49 100644
--- a/communications/dds_ros_bridge/src/ros_compressed_image_rapid_image.cc
+++ b/communications/dds_ros_bridge/src/ros_compressed_image_rapid_image.cc
@@ -63,8 +63,12 @@ std::string RosCompressedImageRapidImage::GetRapidMimeType(
// only two accepted values jpeg or png
if (ros_format.compare("jpeg") == 0)
return rapid::MIME_IMAGE_JPEG;
+ if (ros_format.compare("mono8; jpeg compressed ") == 0)
+ return rapid::MIME_IMAGE_JPEG;
if (ros_format.compare("png") == 0)
return rapid::MIME_IMAGE_PNG;
+
+ ROS_ERROR_STREAM("DDS ROS Bridge: Unknown camera format: " << ros_format << ".");
return "";
}
diff --git a/communications/ff_msgs/msg/AgentStateStamped.msg b/communications/ff_msgs/msg/AgentStateStamped.msg
index 1d9fa16173..43e84455d6 100644
--- a/communications/ff_msgs/msg/AgentStateStamped.msg
+++ b/communications/ff_msgs/msg/AgentStateStamped.msg
@@ -76,10 +76,6 @@ bool check_zones
# it will auto return without checking this flag
bool auto_return_enabled
-# Specifies whether timesync is enabled. Hopefully this will be used to
-# synchronize movements between Astrobees.
-bool time_sync_enabled
-
# Specifies whether the choreographer should execute a segment immediately or
# based on the time stamp in the segement
bool immediate_enabled
@@ -87,6 +83,9 @@ bool immediate_enabled
# Specifies the current planner being used
string planner
+# Specifies whether re-planning is allowed
+bool replanning_enabled
+
# Specifies the current world being used
string world
diff --git a/communications/ff_msgs/msg/CommandConstants.msg b/communications/ff_msgs/msg/CommandConstants.msg
index 5e05585372..f84a319a60 100644
--- a/communications/ff_msgs/msg/CommandConstants.msg
+++ b/communications/ff_msgs/msg/CommandConstants.msg
@@ -11,8 +11,6 @@ string PARAM_NAME_LOCALIZATION_MODE_TRUTH = Truth
string PARAM_NAME_ACTION_TYPE_PAN = Pan
string PARAM_NAME_ACTION_TYPE_TILT = Tilt
string PARAM_NAME_ACTION_TYPE_BOTH = Both
-string PARAM_NAME_DOWNLOAD_METHOD_IMMEDIATE = Immediate
-string PARAM_NAME_DOWNLOAD_METHOD_DELAYED = Delayed
string PARAM_NAME_POWERED_COMPONENT_LASER_POINTER = Laser Pointer
string PARAM_NAME_POWERED_COMPONENT_PAYLOAD_TOP_AFT = Payload Top Aft
string PARAM_NAME_POWERED_COMPONENT_PAYLOAD_BOTTOM_AFT = Payload Bottom Aft
@@ -61,22 +59,17 @@ string CMD_NAME_LOAD_NODELET = loadNodelet
string CMD_NAME_NO_OP = noOp
string CMD_NAME_REACQUIRE_POSITION = reacquirePosition
string CMD_NAME_RESET_EKF = resetEkf
-string CMD_NAME_SHUTDOWN = shutdown
string CMD_NAME_SWITCH_LOCALIZATION = switchLocalization
string CMD_NAME_UNLOAD_NODELET = unloadNodelet
string CMD_NAME_UNTERMINATE = unterminate
string CMD_NAME_WAKE = wake
string CMD_NAME_WAKE_SAFE = wakeSafe
-string CMD_NAME_WIPE_HLP = wipeHlp
string CMD_NAME_ARM_PAN_AND_TILT = armPanAndTilt
string CMD_NAME_GRIPPER_CONTROL = gripperControl
string CMD_NAME_STOP_ARM = stopArm
string CMD_NAME_STOW_ARM = stowArm
-string CMD_NAME_CLEAR_DATA = clearData
-string CMD_NAME_DOWNLOAD_DATA = downloadData
string CMD_NAME_SET_DATA_TO_DISK = setDataToDisk
string CMD_NAME_START_RECORDING = startRecording
-string CMD_NAME_STOP_DOWNLOAD = stopDownload
string CMD_NAME_STOP_RECORDING = stopRecording
string CMD_NAME_CUSTOM_GUEST_SCIENCE = customGuestScience
string CMD_NAME_START_GUEST_SCIENCE = startGuestScience
@@ -97,7 +90,6 @@ string CMD_NAME_SKIP_PLAN_STEP = skipPlanStep
string CMD_NAME_WAIT = wait
string CMD_NAME_POWER_OFF_ITEM = powerOffItem
string CMD_NAME_POWER_ON_ITEM = powerOnItem
-string CMD_NAME_GENERIC_COMMAND = genericCommand
string CMD_NAME_SET_CAMERA = setCamera
string CMD_NAME_SET_CAMERA_RECORDING = setCameraRecording
string CMD_NAME_SET_CAMERA_STREAMING = setCameraStreaming
@@ -105,13 +97,13 @@ string CMD_NAME_SET_CHECK_OBSTACLES = setCheckObstacles
string CMD_NAME_SET_CHECK_ZONES = setCheckZones
string CMD_NAME_SET_ENABLE_AUTO_RETURN = setEnableAutoReturn
string CMD_NAME_SET_ENABLE_IMMEDIATE = setEnableImmediate
+string CMD_NAME_SET_ENABLE_REPLAN = setEnableReplan
string CMD_NAME_SET_FLASHLIGHT_BRIGHTNESS = setFlashlightBrightness
string CMD_NAME_SET_HOLONOMIC_MODE = setHolonomicMode
string CMD_NAME_SET_INERTIA = setInertia
string CMD_NAME_SET_OPERATING_LIMITS = setOperatingLimits
string CMD_NAME_SET_PLANNER = setPlanner
string CMD_NAME_SET_TELEMETRY_RATE = setTelemetryRate
-string CMD_NAME_SET_TIME_SYNC = setTimeSync
string CMD_NAME_SET_ZONES = setZones
string CMD_SUBSYS_ACCESS_CONTROL = AccessControl
diff --git a/debian/.gitignore b/debian/.gitignore
index 0297c35c51..dbddbc6754 100644
--- a/debian/.gitignore
+++ b/debian/.gitignore
@@ -1,5 +1,6 @@
tmp
astrobee0
+astrobee-comms
astrobee-dev
astrobee-config
files
diff --git a/debian/astrobee-comms.dirs b/debian/astrobee-comms.dirs
new file mode 100644
index 0000000000..cdd16ade47
--- /dev/null
+++ b/debian/astrobee-comms.dirs
@@ -0,0 +1,4 @@
+opt/astrobee
+opt/astrobee/lib
+opt/astrobee/lib/pkgconfig
+opt/astrobee/share
diff --git a/debian/astrobee-comms.files b/debian/astrobee-comms.files
new file mode 100644
index 0000000000..074fa03445
--- /dev/null
+++ b/debian/astrobee-comms.files
@@ -0,0 +1,3 @@
+opt/astrobee/lib/libdds_ros_bridge.so
+opt/astrobee/lib/librapidExtAstrobee.so
+opt/astrobee/share/dds_ros_bridge
diff --git a/debian/changelog b/debian/changelog
index 23894fbaa1..f8a55d4ccb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,12 @@
+astrobee (0.14.3) testing; urgency=medium
+
+ * Rotation fallback fix
+ * Unified install instructions and Ubuntu 18 nasa install
+ * Various other minor fixes
+ * Note, Perching does not work in this release, use another version for this.
+
+ -- Astrobee Flight Software Mon, 24 May 2021 23:17:32 -0700
+
astrobee (0.14.1) testing; urgency=medium
* Dynamic IMU Filtering
diff --git a/debian/control b/debian/control
index 5053260b57..9b314c5631 100644
--- a/debian/control
+++ b/debian/control
@@ -28,10 +28,26 @@ Depends: ${misc:Depends}
Description: Astrobee flight software configuration.
The Astrobee flight software configuration files.
+Package: astrobee-comms
+Section: comm
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+ astrobee-config (>= ${binary:Version}),
+ rti (>=1.0), libmiro0 (>=0.1), libsoracore1 (>=1.0),
+ ros-kinetic-ros-base, ros-kinetic-cpp-common,
+ ros-kinetic-common-msgs, ros-kinetic-nodelet, ros-kinetic-image-transport,
+ ros-kinetic-compressed-image-transport, ros-kinetic-tf2,
+ ros-kinetic-tf2-geometry-msgs, ros-kinetic-tf2-msgs, ros-kinetic-tf2-ros,
+ ros-kinetic-tf2-sensor-msgs,
+ libgoogle-glog0v5
+Description: The communications for Astrobee flight software.
+ The communications portion of the Astrobee flight software.
+
Package: astrobee0
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
astrobee-config (>= ${binary:Version}),
+ astrobee-comms (>= ${binary:Version}),
libalvar2 (>=2.0), libdbow21 (>=0.1), libgtsam (>=4.0), libopenmvg1 (>=1.0), libroyale1 (>=1.0),
libceres1 (>=1.0), rti (>=1.0), libmiro0 (>=0.1), libsoracore1 (>=1.0),
libdecomputil0 (>=0.1), libjps3d0 (>=0.1),
diff --git a/debian/rules b/debian/rules
index 67dde28591..9ac1033ac5 100755
--- a/debian/rules
+++ b/debian/rules
@@ -23,6 +23,8 @@ ifeq ($(DEB_HOST_ARCH),armhf)
export LIB_SEARCH_OPTIONS = -l$(ARMHF_CHROOT_DIR)/opt/rti/ndds/lib/armv6vfphLinux3.xgcc4.7.2:$(ARMHF_CHROOT_DIR)/opt/ros/kinetic/lib:$(ARMHF_CHROOT_DIR)/opt/ros/kinetic/lib/arm-linux-gnueabihf:$(ARMHF_CHROOT_DIR)/lib:$(ARMHF_CHROOT_DIR)/usr/lib:$(ARMHF_CHROOT_DIR)/usr/lib/arm-linux-gnueabihf:$(ARMHF_CHROOT_DIR)/lib/arm-linux-gnueabihf -- --ignore-missing-info --admindir=$(ARMHF_CHROOT_DIR)/var/lib/dpkg
export DEB_MAINT_CC_SET = $(ARMHF_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc
export DEB_MAINT_CXX_SET = $(ARMHF_TOOLCHAIN)/bin/arm-linux-gnueabihf-g++
+else
+ export LIB_SEARCH_OPTIONS = -l/opt/ros/kinetic/lib:/opt/ros/kinetic/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/gazebo-7/plugins
endif
# skip build for config files
@@ -37,6 +39,10 @@ override_dh_auto_configure:
mkdir -p build
cd build && cmake .. -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_INSTALL_PREFIX:PATH=/opt/astrobee -DCMAKE_BUILD_TYPE=Release $(EXTRA_CMAKE_OPTS) && cd ..
+override_dh_install:
+ dh_movefiles
+ dh_install
+
override_dh_auto_test: ;
#override_dh_auto_install-idep:
diff --git a/description/description/readme.md b/description/description/readme.md
index f129657bc1..6de9890f9b 100644
--- a/description/description/readme.md
+++ b/description/description/readme.md
@@ -5,16 +5,16 @@ The Universal Robot Description Format (URDF) is a language for describing a rob
This folder contains only the Xacro files for the free-flyer model. The dock, ISS and granite models are static URDFs that are included in the media distribution. This design choice enables us to load these entities from a world file, preventing race conditions in loading environmental elements with free-flyers in a simulated context.
The way URDF works is best illustrated by this example, which is actually loosely representative of how the project's launch files actually work:
-
-
-
-
-
-
-
-
+```xml
+
+
+
+
+
+
+```
Line (1) specifies the namespace on which the robot will operate.
Line (2) creates the namespace.
Line (3) invokes xacro to write URDF to parameter /honey/robot_description.
diff --git a/doc/general_documentation/INSTALL.md b/doc/general_documentation/INSTALL.md
index 4d73b9545d..b2d69fcb16 100644
--- a/doc/general_documentation/INSTALL.md
+++ b/doc/general_documentation/INSTALL.md
@@ -31,6 +31,7 @@ At this point you need to decide where you'd like to put the source code
First, clone the flight software repository and media:
git clone https://github.com/nasa/astrobee.git $SOURCE_PATH
+ pushd $SOURCE_PATH
git submodule update --init --depth 1 description/media
@@ -46,12 +47,14 @@ Clone the android repository:
git clone https://github.com/nasa/astrobee_android.git $ANDROID_PATH
-### Dependencies Ubuntu 16 + ROS Melodic
+### Dependencies
Next, install all required dependencies:
+
*Note: `root` access is necessary to install the compiled debian packages below*
+
*Note: Before running this please ensure that your system is completely updated
- by running 'sudo apt-get update' and then 'sudo apt-get upgrade'*
+by running 'sudo apt-get update' and then 'sudo apt-get upgrade'*
pushd $SOURCE_PATH
cd scripts/setup
@@ -60,50 +63,11 @@ Next, install all required dependencies:
cd debians
./build_install_debians.sh
cd ../
- ./install_desktop_16_04_packages.sh
+ ./install_desktop_packages.sh
sudo rosdep init
rosdep update
popd
-**Important**: you can safely ignore the following error messages, as they are simply letting you know that certain libraries cannot be found. These libraries are for internal NASA use only, and are not required by public users provided that software is launched with DDS disabled.
-
- E: Unable to locate package libroyale1
- E: Unable to locate package rti
- E: Unable to locate package libmiro0
- E: Unable to locate package libsoracore1
- E: Unable to locate package libroyale-dev
- E: Unable to locate package rti-dev
- E: Unable to locate package libsoracore-dev
- E: Unable to locate package libmiro-dev
-
-### Dependencies Ubuntu 18 + ROS melodic
-
-Next, install all required dependencies:
-*Note: `root` access is necessary to install the compiled debian packages below*
-*Note: You should instal ROS melodic beforehand following the [Installation Instructions](http://wiki.ros.org/melodic/Installation/Ubuntu)*
-*Note: Before running this please ensure that your system is completely updated
- by running 'sudo apt-get update' and then 'sudo apt-get upgrade'*
-
- pushd $SOURCE_PATH
- cd scripts/setup
- ./add_ros_repository.sh
- sudo apt-get update
-
-Install OpenCV 3.3.1, you can parse the argument -p to change install directory. By default, install directory is in /usr/local. If you do so, make sure CMake can find it.
-
- ./install_opencv.sh
-
-Install Luajit, it will be installed in /usr/local
-
- ./install_luajit.sh
-
- cd debians
- ./build_install_debians_18_04.sh
- cd ../
- ./install_desktop_18_04_packages.sh
- sudo rosdep init
- rosdep update
- popd
**Important**: you can safely ignore the following error messages, as they are simply letting you know that certain libraries cannot be found. These libraries are for internal NASA use only, and are not required by public users provided that software is launched with DDS disabled.
@@ -116,7 +80,6 @@ Install Luajit, it will be installed in /usr/local
E: Unable to locate package libsoracore-dev
E: Unable to locate package libmiro-dev
-
## Configuring the build
### Note for the build setup
@@ -169,5 +132,10 @@ rebuilt, and not the entire code base.
If you configured your virtual machine with more than the baseline resources,
you can adjust the number of threads (eg. -j4) to speed up the build.
+## Cross Compiling
+
+Please contact your Astrobee point of contact if you need to cross compile the
+code.
+
For more information on running the simulator and moving the robot, please see
the [simulation instructions](simulation/sim_overview.md).
diff --git a/doc/general_documentation/NASA_INSTALL.md b/doc/general_documentation/NASA_INSTALL.md
index c83ea761c4..1e7ad29b18 100644
--- a/doc/general_documentation/NASA_INSTALL.md
+++ b/doc/general_documentation/NASA_INSTALL.md
@@ -83,12 +83,12 @@ First, clone the flight software repository:
git clone https://github.com/nasa/astrobee.git --branch develop $SOURCE_PATH
git submodule update --init --depth 1 description/media
+ git submodule update --init --depth 1 submodules/platform
You can either choose which optional submodules to clone and log depth with:
git submodule update --init --depth 1 submodules/android
git submodule update --init --depth 1 submodules/avionics
- git submodule update --init --depth 1 submodules/platform
Or checkout all the submodules as:
@@ -99,14 +99,20 @@ The android module is necessary for guest science code; the avionics and platfor
module is used when cross-compiling to test on the robot hardware.
### Dependencies
+For *Ubuntu 18 only*: install openCV and Luajit beforehand with:
+
+ pushd $SOURCE_PATH
+ cd scripts/setup
+ ./debians/install_luajit.sh
+ ./debians/install_opencv.sh
-Next, install all required dependencies:
+Next, install all remaining dependencies dependencies:
pushd $SOURCE_PATH
cd scripts/setup
./add_local_repository.sh
./add_ros_repository.sh
- ./install_desktop_16_04_packages.sh
+ ./install_desktop_packages.sh
popd
#### Extra options to install the dependencies
@@ -117,11 +123,9 @@ dependencies, you can use the `NDC_USERNAME` variable.
If you prefer to install them at a different location, you can use the
`ARS_DEB_DIR` variable.
-```
-export NDC_USERNAME=jdoe
-export ARS_DEB_DIR=$HOME/astrobee_debs
-./add_local_repository.sh
-```
+ export NDC_USERNAME=jdoe
+ export ARS_DEB_DIR=$HOME/astrobee_debs
+ ./add_local_repository.sh
### Cross-compile setup
diff --git a/doc/general_documentation/adding_a_command.md b/doc/general_documentation/adding_a_command.md
index cc9e8a7e6e..4aa1a2f60e 100644
--- a/doc/general_documentation/adding_a_command.md
+++ b/doc/general_documentation/adding_a_command.md
@@ -2,49 +2,84 @@
# Introduction
-Adding a ground command to the flight software is a pretty involved task so please make sure you have a full understanding of the system before you attempt it. There are four parts to adding a command: adding the command to the command spreedsheet, adding the command to the plan schema, generating the fsw and Android files, and adding the command to the executive. Please make sure to complete all four parts to ensure your command is fully intergrated into the system.
+Adding a ground command to the flight software is a pretty involved task so
+please make sure you have a full understanding of the system before you attempt
+it. There are four parts to adding a command: adding the command to the command
+spreedsheet, adding the command to the plan schema, generating the fsw and
+Android files, and adding the command to the executive. Please make sure to
+complete all four parts to ensure your command is fully intergrated into the
+system.
# Update the Commands Spreadsheet
-The command spreadsheet can be found in freeflyer_docs/FlightSoftware and is named commands.xml. This spreadsheet keeps track of the ground commands the fsw accepts, which commands can run while other commands are running, the operating and mobility states the commands are accepted in, whether the command is accept in a plan or not, and the status of the command in the fsw. Please make sure to add your command to each of the relevant sheets. If you have questions, please contact Katie Hamilton.
+The command spreadsheet can be found in freeflyer_docs/FlightSoftware and is
+named commands.xml. This spreadsheet keeps track of the ground commands the fsw
+accepts, which commands can run while other commands are running, the operating
+and mobility states the commands are accepted in, whether the command is accept
+in a plan or not, and the status of the command in the fsw. Please make sure to
+add your command to each of the relevant sheets. If you have questions, please
+contact Katie Hamilton.
# Add Command to the Plan Schema
-The plan schema can be found in astrobee/commands. Please add your command to the freeFlyerPlanSchema.json file. Make sure to folloow the json format for a command.
+The plan schema can be found in astrobee/commands. Please add your command to
+the freeFlyerPlanSchema.json file. Make sure to follow the json format for a
+command.
# File Generation
-When adding a command, some fsw and GDS files need to be updated. There are scripts that will update everything for you. After adding your command to the plan schema, please follow the next three subsections to generate the files.
+When adding a command, some fsw and GDS files need to be updated. There are
+scripts that will update everything for you. After adding your command to the
+plan schema, please follow the next three subsections to generate the files.
## Setup
-To use the scripts, you will need to checkout the xgds2 repo and install some python and geocam tools.
+To use the scripts, you will need to checkout the xgds2 repo and install some
+python and geocam tools.
cd astrobee/commands/
git clone https://github.com/xgds/xgds_planner2.git
sudo apt-get install python-pip python-iso8601
sudo pip install git+https://github.com/geocam/geocamUtilWeb
-In order to generate the Android files, the xpjson planner parser needs to be changed to keep the parent field for each command parameter. To do this, open the astrobee/commands/xgds_planner2/xgds_planner2/xpjson.py file in your preferred text editor. Find the KEEP_PARAM_PARENT parameter (around line 114) and set it to true. Then save and close the file.
+In order to generate the Android files, the xpjson planner parser needs to be
+changed to keep the parent field for each command parameter. To do this, open
+the astrobee/commands/xgds_planner2/xgds_planner2/xpjson.py file in your
+preferred text editor. Find the KEEP_PARAM_PARENT parameter (around line 114)
+and set it to true. Then save and close the file.
## Generate FSW files
-To generate the fsw files and copy them to correct location, please run the following line from the top level directory of astrobee:
+To generate the fsw files and copy them to correct location, please run the
+following line from the top level directory of astrobee:
./scripts/build/processCommandSchema.sh
-After running this script, please make sure your changes compile. To do this, navigate to the folder you build the fsw in, rebuild the cache, and then compile the code. Don't forget to commit and push your changes. If you want your command incorporated into GDS, please let whoever is in charge of GDS know that the command constants idl has changed.
+After running this script, please make sure your changes compile. To do this,
+navigate to the folder you build the fsw in, rebuild the cache, and then compile
+the code. Don't forget to commit and push your changes. If you want your command
+incorporated into GDS, please let whoever is in charge of GDS know that the
+command constants idl has changed.
## Generate Android files
-Make sure you have the Astrobee Android repo. If you don't, please see the install instructions on how to get it. Navigate to the astrobee api scripts folder in the astrobee Android repo (astrobee_api/scripts). These scripts assume that the android repo is located in the fsw submodules folder. If it is located outside of the fsw, please set the $SOURCE_PATH environment variable to the fsw location. Also if you added a new enum command type, you will need to add an include line to both the genBaseRobot and genBaseRobotImpl scripts. To generate the android files, please run the following in the scripts folder:
+Make sure you have the Astrobee Android repo. If you don't, please see the
+install instructions on how to get it. Navigate to the astrobee api scripts
+folder in the astrobee Android repo (astrobee_api/scripts). These scripts assume
+that the android repo is located in the fsw submodules folder. If it is located
+outside of the fsw, please set the $SOURCE_PATH environment variable to the fsw
+location. Also if you added a new enum command type, you will need to add an
+include line to both the genBaseRobot and genBaseRobotImpl scripts. To generate
+the android files, please run the following in the scripts folder:
cd astrobee_api/scripts
# if needed, set the source path
export SOURCE_PATH=path/to/astrobee
./processCommandSchema.sh
-The script will copy the generated files to the correct locations. Please make sure that the astrobee_api builds with no errors. To do this, go to the top level astrobee api directory and build the code:
+The script will copy the generated files to the correct locations. Please make
+sure that the astrobee_api builds with no errors. To do this, go to the top
+level astrobee api directory and build the code:
cd astrobee_api/
./gradlew build
@@ -54,7 +89,6 @@ Once everything compiles, make sure you commit and push your changes.
# Add to Executive
-The last step is to add the command to the executive. Please make sure you have a full understanding of the executive and operating state classes before adding the command. If you have questions, please contact Katie Hamilton.
-
-
-
+The last step is to add the command to the executive. Please make sure you have
+a full understanding of the executive and operating state classes before adding
+the command. If you have questions, please contact Katie Hamilton.
diff --git a/gnc/ctl/test/test_ctl.test b/gnc/ctl/test/test_ctl.test
index d7391d150c..b5383985ef 100644
--- a/gnc/ctl/test/test_ctl.test
+++ b/gnc/ctl/test/test_ctl.test
@@ -19,6 +19,5 @@
-
diff --git a/hardware/pmc_actuator/src/pmc_actuator_nodelet/pmc_actuator_nodelet.cc b/hardware/pmc_actuator/src/pmc_actuator_nodelet/pmc_actuator_nodelet.cc
index 2fb25e5648..da46bda40e 100644
--- a/hardware/pmc_actuator/src/pmc_actuator_nodelet/pmc_actuator_nodelet.cc
+++ b/hardware/pmc_actuator/src/pmc_actuator_nodelet/pmc_actuator_nodelet.cc
@@ -37,6 +37,7 @@
// Services
#include
+#include
#include
#include
@@ -106,6 +107,10 @@ class PmcActuatorNodelet : public ff_util::FreeFlyerNodelet {
srv_ = nh->advertiseService(
SERVICE_HARDWARE_PMC_ENABLE, &PmcActuatorNodelet::EnableService, this);
+ // Update PMC watchdog timer timeout
+ update_timeout_srv_ = nh->advertiseService(
+ SERVICE_HARDWARE_PMC_TIMOUT, &PmcActuatorNodelet::IdlingTimoutService, this);
+
// Watchdog timer
timer_ = nh->createTimer(
watchdog_period_, &PmcActuatorNodelet::TimerCallback, this, false, true);
@@ -189,6 +194,12 @@ class PmcActuatorNodelet : public ff_util::FreeFlyerNodelet {
return false;
}
+ // get minimum allowed control rate
+ if (!config_params.GetPosReal("max_timeout", &max_timeout_)) {
+ ROS_FATAL("PMC Actuator: minimum control rate not specified!");
+ return false;
+ }
+
// get initial fan speed
if (!config_params.GetInt("null_speed", &null_fan_speed_)) {
ROS_FATAL("PMC Actuator: null fan speed not specified!");
@@ -468,15 +479,33 @@ class PmcActuatorNodelet : public ff_util::FreeFlyerNodelet {
return true;
}
+ // Update Minimum Control Frequency (and cutoff time)
+ bool IdlingTimoutService(ff_msgs::SetFloat::Request &req,
+ ff_msgs::SetFloat::Response &res) { // NOLINT
+ double new_timeout = req.data;
+ // Check if the new rate is within the safe and default limits
+ if (new_timeout < max_timeout_ && new_timeout >= (20.0/control_rate_hz_)) {
+ watchdog_period_ = ros::Duration(new_timeout);
+ timer_.setPeriod(watchdog_period_);
+ ROS_INFO("PMC idling timeout updated.");
+ res.success = true;
+ } else {
+ ROS_INFO("Selected timeout is not within the safe timeout bounds.");
+ res.success = false;
+ }
+ return true;
+ }
+
private:
config_reader::ConfigReader config_params; // LUA configuration reader
ros::Subscriber sub_command_; // Command flight mode sub
ros::Publisher pub_telemetry_, pub_state_; // Telemetry publisher
ros::ServiceServer srv_; // Enable / disable service
+ ros::ServiceServer update_timeout_srv_; // Update minimum control rate service
ros::Timer timer_; // Watchdog timer
ros::Duration watchdog_period_; // Watchdog period
ff_hw_msgs::PmcTelemetry telemetry_vector_; // Telemetry message
- uint32_t num_pmcs_; // Number of PMCs to control
+ uint32_t num_pmcs_; // Number of PMCs to control
int sub_queue_size_; // Subscriber queue size
int pub_queue_size_; // Publisher queue size
std::string frame_id_; // Frame ID
@@ -484,6 +513,7 @@ class PmcActuatorNodelet : public ff_util::FreeFlyerNodelet {
std::vector i2c_addrs_; // 7-bit I2C addresses
int i2c_retries_; // Number of I2C bus retries
double control_rate_hz_; // Control rate in Hz.
+ double max_timeout_; // Maximum idling timeout allowed
int null_fan_speed_; // Initial fan speed.
std::vector null_nozzle_positions_; // Initial nozzle positions
uint8_t trims_[NUM_PMC][NUM_TRIM][NUM_NOZZLE]; // Trims for each nozzle
diff --git a/localization/CMakeLists.txt b/localization/CMakeLists.txt
index 2c6b79981b..7e207b201f 100644
--- a/localization/CMakeLists.txt
+++ b/localization/CMakeLists.txt
@@ -16,6 +16,7 @@
# under the License.
add_subdirectory(camera)
+add_subdirectory(graph_optimizer)
add_subdirectory(imu_integration)
add_subdirectory(interest_point)
add_subdirectory(localization_common)
@@ -31,7 +32,7 @@ if (USE_ROS)
add_subdirectory(handrail_detect)
add_subdirectory(localization_manager)
add_subdirectory(localization_node)
- if (ENABLE_VIVE_SOLVER)
+ if (ENABLE_VIVE_SOLVER AND ENABLE_VIVE)
add_subdirectory(vive_localization)
endif()
endif (USE_ROS)
diff --git a/localization/graph_localizer/CMakeLists.txt b/localization/graph_localizer/CMakeLists.txt
index 15eebabd31..fee4dc0d2a 100644
--- a/localization/graph_localizer/CMakeLists.txt
+++ b/localization/graph_localizer/CMakeLists.txt
@@ -21,14 +21,14 @@ if (USE_ROS)
# include ff_nodelet to get ff_util header files since these aren't exposed elsewhere
catkin_package(
- LIBRARIES ${PROJECT_NAME} ${GLOG_LIBRARIES} ${GTSAM_LIBRARIES} camera config_reader ff_nodelet imu_integration localization_common localization_measurements msg_conversions
+ LIBRARIES ${PROJECT_NAME} ${GLOG_LIBRARIES} ${GTSAM_LIBRARIES} camera config_reader ff_nodelet graph_optimizer imu_integration localization_common localization_measurements msg_conversions
INCLUDE_DIRS include ${GLOG_INCLUDE_DIRS} ${GTSAM_INCLUDE_DIR}
CATKIN_DEPENDS roscpp
DEPENDS gtsam ff_msgs
)
create_library(TARGET ${PROJECT_NAME}
- LIBS ${catkin_LIBRARIES} ${GLOG_LIBRARIES} gtsam camera config_reader ff_nodelet imu_integration localization_common localization_measurements msg_conversions
+ LIBS ${catkin_LIBRARIES} ${GLOG_LIBRARIES} gtsam camera config_reader ff_nodelet graph_optimizer imu_integration localization_common localization_measurements msg_conversions
INC ${catkin_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS}
DEPS ff_msgs
)
diff --git a/localization/graph_localizer/include/graph_localizer/graph_values.h b/localization/graph_localizer/include/graph_localizer/combined_nav_state_graph_values.h
similarity index 67%
rename from localization/graph_localizer/include/graph_localizer/graph_values.h
rename to localization/graph_localizer/include/graph_localizer/combined_nav_state_graph_values.h
index 7bc94ec2d2..5f7a15fae1 100644
--- a/localization/graph_localizer/include/graph_localizer/graph_values.h
+++ b/localization/graph_localizer/include/graph_localizer/combined_nav_state_graph_values.h
@@ -16,11 +16,11 @@
* under the License.
*/
-#ifndef GRAPH_LOCALIZER_GRAPH_VALUES_H_
-#define GRAPH_LOCALIZER_GRAPH_VALUES_H_
+#ifndef GRAPH_LOCALIZER_COMBINED_NAV_STATE_GRAPH_VALUES_H_
+#define GRAPH_LOCALIZER_COMBINED_NAV_STATE_GRAPH_VALUES_H_
-#include
-#include
+#include
+#include
#include
#include
#include
@@ -39,9 +39,11 @@
namespace graph_localizer {
namespace sym = gtsam::symbol_shorthand;
-class GraphValues {
+class CombinedNavStateGraphValues : public graph_optimizer::GraphValues {
public:
- explicit GraphValues(const GraphValuesParams& params = GraphValuesParams());
+ CombinedNavStateGraphValues(
+ const CombinedNavStateGraphValuesParams& params = CombinedNavStateGraphValuesParams(),
+ std::shared_ptr values = std::shared_ptr(new gtsam::Values()));
// Add timestamp and keys to timestamp_key_index_map, and values to values
bool AddCombinedNavState(const localization_common::CombinedNavState& combined_nav_state, const int key_index);
@@ -57,34 +59,23 @@ class GraphValues {
boost::optional> LatestBias() const;
// Returns the oldest time that will be in graph values once the window is slid using params
- boost::optional SlideWindowNewOldestTime() const;
+ boost::optional SlideWindowNewOldestTime() const final;
boost::optional KeyIndex(const localization_common::Time timestamp) const;
- void UpdateValues(const gtsam::Values& new_values);
-
- // TODO(rsoussan): Put this somewhere else?
- static gtsam::NonlinearFactorGraph RemoveOldFactors(const gtsam::KeyVector& old_keys,
- gtsam::NonlinearFactorGraph& graph);
-
- gtsam::KeyVector OldFeatureKeys(const gtsam::NonlinearFactorGraph& factors) const;
-
- void RemoveOldFeatures(const gtsam::KeyVector& old_feature_keys);
-
int RemoveOldCombinedNavStates(const localization_common::Time oldest_allowed_time);
- gtsam::KeyVector OldKeys(const localization_common::Time oldest_allowed_time) const;
-
- const gtsam::Values& values() const { return values_; }
+ gtsam::KeyVector OldKeys(const localization_common::Time oldest_allowed_time,
+ const gtsam::NonlinearFactorGraph& graph) const final;
boost::optional PoseKey(const localization_common::Time timestamp) const;
- boost::optional GetKey(KeyCreatorFunction key_creator_function,
- const localization_common::Time timestamp) const;
+ boost::optional GetKey(graph_optimizer::KeyCreatorFunction key_creator_function,
+ const localization_common::Time timestamp) const final;
- boost::optional OldestTimestamp() const;
+ boost::optional OldestTimestamp() const final;
- boost::optional LatestTimestamp() const;
+ boost::optional LatestTimestamp() const final;
boost::optional ClosestPoseTimestamp(const localization_common::Time timestamp) const;
@@ -112,31 +103,9 @@ class GraphValues {
int NumStates() const;
- template
- boost::optional at(const gtsam::Key& key) const {
- if (!values_.exists(key)) {
- LogError("at: Key not present in values.");
- return boost::none;
- }
-
- return values_.at(key);
- }
-
boost::optional Timestamp(const int key_index) const;
- bool HasFeature(const localization_measurements::FeatureId id) const;
-
- boost::optional FeatureKey(const localization_measurements::FeatureId id) const;
-
- // TODO(rsoussan): This shouldn't be const, modify when changes are made to projection factor adder
- gtsam::Key CreateFeatureKey() const;
-
- bool AddFeature(const localization_measurements::FeatureId id, const gtsam::Point3& feature_point,
- const gtsam::Key& key);
-
- gtsam::KeyVector FeatureKeys() const;
-
- int NumFeatures() const;
+ const CombinedNavStateGraphValuesParams& params() const;
private:
// Removes keys from timestamp_key_index_map, values from values
@@ -151,19 +120,13 @@ class GraphValues {
friend class boost::serialization::access;
template
void serialize(ARCHIVE& ar, const unsigned int /*version*/) {
- ar& BOOST_SERIALIZATION_NVP(values_);
+ ar& BOOST_SERIALIZATION_BASE_OBJECT_NVP(graph_optimizer::GraphValues);
ar& BOOST_SERIALIZATION_NVP(timestamp_key_index_map_);
- ar& BOOST_SERIALIZATION_NVP(feature_id_key_map_);
- ar& BOOST_SERIALIZATION_NVP(feature_key_index_);
}
- GraphValuesParams params_;
- gtsam::Values values_;
+ CombinedNavStateGraphValuesParams params_;
std::map timestamp_key_index_map_;
- std::unordered_map feature_id_key_map_;
- // Modified by projection_factor_adder, remove mutable if this changes
- mutable std::uint64_t feature_key_index_;
};
} // namespace graph_localizer
-#endif // GRAPH_LOCALIZER_GRAPH_VALUES_H_
+#endif // GRAPH_LOCALIZER_COMBINED_NAV_STATE_GRAPH_VALUES_H_
diff --git a/localization/graph_localizer/include/graph_localizer/graph_values_params.h b/localization/graph_localizer/include/graph_localizer/combined_nav_state_graph_values_params.h
similarity index 78%
rename from localization/graph_localizer/include/graph_localizer/graph_values_params.h
rename to localization/graph_localizer/include/graph_localizer/combined_nav_state_graph_values_params.h
index 62d82c984a..2e186ef7c7 100644
--- a/localization/graph_localizer/include/graph_localizer/graph_values_params.h
+++ b/localization/graph_localizer/include/graph_localizer/combined_nav_state_graph_values_params.h
@@ -15,20 +15,18 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
-#ifndef GRAPH_LOCALIZER_GRAPH_VALUES_PARAMS_H_
-#define GRAPH_LOCALIZER_GRAPH_VALUES_PARAMS_H_
+#ifndef GRAPH_LOCALIZER_COMBINED_NAV_STATE_GRAPH_VALUES_PARAMS_H_
+#define GRAPH_LOCALIZER_COMBINED_NAV_STATE_GRAPH_VALUES_PARAMS_H_
#include
namespace graph_localizer {
-struct GraphValuesParams {
+struct CombinedNavStateGraphValuesParams {
// Only kept if there are at least min_num_states and not more than max_num_states
double ideal_duration;
int min_num_states;
int max_num_states;
- // If storing 3d features as states (i.e. bundle adjustment type problems)
- int min_num_factors_per_feature;
};
} // namespace graph_localizer
-#endif // GRAPH_LOCALIZER_GRAPH_VALUES_PARAMS_H_
+#endif // GRAPH_LOCALIZER_COMBINED_NAV_STATE_GRAPH_VALUES_PARAMS_H_
diff --git a/localization/graph_localizer/include/graph_localizer/combined_nav_state_node_updater.h b/localization/graph_localizer/include/graph_localizer/combined_nav_state_node_updater.h
new file mode 100644
index 0000000000..7b3868c2bb
--- /dev/null
+++ b/localization/graph_localizer/include/graph_localizer/combined_nav_state_node_updater.h
@@ -0,0 +1,99 @@
+/* Copyright (c) 2017, United States Government, as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ *
+ * All rights reserved.
+ *
+ * The Astrobee platform is 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.
+ */
+
+#ifndef GRAPH_LOCALIZER_COMBINED_NAV_STATE_NODE_UPDATER_H_
+#define GRAPH_LOCALIZER_COMBINED_NAV_STATE_NODE_UPDATER_H_
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace graph_localizer {
+class CombinedNavStateNodeUpdater
+ : public graph_optimizer::NodeUpdaterWithPriors {
+ public:
+ CombinedNavStateNodeUpdater(const CombinedNavStateNodeUpdaterParams& params,
+ std::shared_ptr latest_imu_integrator,
+ std::shared_ptr values);
+
+ void AddInitialValuesAndPriors(gtsam::NonlinearFactorGraph& factors);
+
+ void AddInitialValuesAndPriors(const localization_common::CombinedNavState& global_N_body,
+ const localization_common::CombinedNavStateNoise& noise,
+ gtsam::NonlinearFactorGraph& factors) final;
+
+ void AddPriors(const localization_common::CombinedNavState& global_N_body,
+ const localization_common::CombinedNavStateNoise& noise, gtsam::NonlinearFactorGraph& factors) final;
+
+ bool Update(const localization_common::Time timestamp, gtsam::NonlinearFactorGraph& factors) final;
+
+ bool SlideWindow(const localization_common::Time oldest_allowed_timestamp,
+ const boost::optional& marginals, const gtsam::KeyVector& old_keys,
+ const double huber_k, gtsam::NonlinearFactorGraph& factors) final;
+
+ void ThresholdBiasUncertainty(gtsam::Matrix& bias_covariance) const;
+
+ graph_optimizer::NodeUpdaterType type() const final;
+
+ boost::optional SlideWindowNewOldestTime() const final;
+
+ gtsam::KeyVector OldKeys(const localization_common::Time oldest_allowed_time,
+ const gtsam::NonlinearFactorGraph& graph) const final;
+
+ boost::optional GetKey(graph_optimizer::KeyCreatorFunction key_creator_function,
+ const localization_common::Time timestamp) const final;
+
+ boost::optional OldestTimestamp() const final;
+
+ boost::optional LatestTimestamp() const final;
+
+ std::shared_ptr shared_graph_values() const;
+
+ std::shared_ptr shared_graph_values();
+
+ const CombinedNavStateGraphValues& graph_values() const;
+
+ private:
+ void RemovePriors(const int key_index, gtsam::NonlinearFactorGraph& factors);
+ int GenerateKeyIndex();
+ bool AddOrSplitImuFactorIfNeeded(const localization_common::Time timestamp, gtsam::NonlinearFactorGraph& factors,
+ CombinedNavStateGraphValues& graph_values);
+ bool CreateAndAddLatestImuFactorAndCombinedNavState(const localization_common::Time timestamp,
+ gtsam::NonlinearFactorGraph& factors,
+ CombinedNavStateGraphValues& graph_values);
+ bool CreateAndAddImuFactorAndPredictedCombinedNavState(const localization_common::CombinedNavState& global_N_body,
+ const gtsam::PreintegratedCombinedMeasurements& pim,
+ gtsam::NonlinearFactorGraph& factors,
+ CombinedNavStateGraphValues& graph_values);
+ bool SplitOldImuFactorAndAddCombinedNavState(const localization_common::Time timestamp,
+ gtsam::NonlinearFactorGraph& factors,
+ CombinedNavStateGraphValues& graph_values);
+
+ CombinedNavStateNodeUpdaterParams params_;
+ std::shared_ptr latest_imu_integrator_;
+ std::shared_ptr graph_values_;
+ int key_index_;
+ localization_common::CombinedNavStateNoise global_N_body_start_noise_;
+};
+} // namespace graph_localizer
+
+#endif // GRAPH_LOCALIZER_COMBINED_NAV_STATE_NODE_UPDATER_H_
diff --git a/localization/graph_localizer/include/graph_localizer/noise_params.h b/localization/graph_localizer/include/graph_localizer/combined_nav_state_node_updater_params.h
similarity index 62%
rename from localization/graph_localizer/include/graph_localizer/noise_params.h
rename to localization/graph_localizer/include/graph_localizer/combined_nav_state_node_updater_params.h
index 55c919cfe5..654bcb5464 100644
--- a/localization/graph_localizer/include/graph_localizer/noise_params.h
+++ b/localization/graph_localizer/include/graph_localizer/combined_nav_state_node_updater_params.h
@@ -15,20 +15,27 @@
* License for the specific language governing permissions and limitations
* under the License.
*/
-#ifndef GRAPH_LOCALIZER_NOISE_PARAMS_H_
-#define GRAPH_LOCALIZER_NOISE_PARAMS_H_
+#ifndef GRAPH_LOCALIZER_COMBINED_NAV_STATE_NODE_UPDATER_PARAMS_H_
+#define GRAPH_LOCALIZER_COMBINED_NAV_STATE_NODE_UPDATER_PARAMS_H_
-#include
+#include
+#include
namespace graph_localizer {
-struct NoiseParams {
+struct CombinedNavStateNodeUpdaterParams {
double starting_prior_translation_stddev;
double starting_prior_quaternion_stddev;
double starting_prior_velocity_stddev;
double starting_prior_accel_bias_stddev;
double starting_prior_gyro_bias_stddev;
- double point_prior_translation_stddev;
+ double huber_k;
+ localization_common::CombinedNavState global_N_body_start;
+ bool add_priors;
+ CombinedNavStateGraphValuesParams graph_values;
+ bool threshold_bias_uncertainty;
+ double accel_bias_stddev_threshold;
+ double gyro_bias_stddev_threshold;
};
} // namespace graph_localizer
-#endif // GRAPH_LOCALIZER_NOISE_PARAMS_H_
+#endif // GRAPH_LOCALIZER_COMBINED_NAV_STATE_NODE_UPDATER_PARAMS_H_
diff --git a/localization/graph_localizer/include/graph_localizer/feature_point_graph_values.h b/localization/graph_localizer/include/graph_localizer/feature_point_graph_values.h
new file mode 100644
index 0000000000..86eb6af8a7
--- /dev/null
+++ b/localization/graph_localizer/include/graph_localizer/feature_point_graph_values.h
@@ -0,0 +1,93 @@
+/* Copyright (c) 2017, United States Government, as represented by the
+ * Administrator of the National Aeronautics and Space Administration.
+ *
+ * All rights reserved.
+ *
+ * The Astrobee platform is 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.
+ */
+
+#ifndef GRAPH_LOCALIZER_FEATURE_POINT_GRAPH_VALUES_H_
+#define GRAPH_LOCALIZER_FEATURE_POINT_GRAPH_VALUES_H_
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#include