├── .github └── workflows │ └── docker-build.yaml ├── .gitmodules ├── Dockerfile ├── README.md ├── titan_launch ├── CMakeLists.txt ├── config │ ├── px4_config.yaml │ └── px4_pluginlists.yaml ├── launch │ ├── px4.launch │ └── startup_ground.launch └── package.xml └── video_thumbnail.png /.github/workflows/docker-build.yaml: -------------------------------------------------------------------------------- 1 | name: docker-build-CI 2 | 3 | # Only build base when any of the files in the base directory are modified 4 | on: 5 | push: 6 | branches: [main, ci] 7 | tags: 8 | - '*' 9 | workflow_dispatch: 10 | schedule: 11 | - cron: '0 0 * * 0' 12 | 13 | jobs: 14 | main: 15 | runs-on: ubuntu-20.04 16 | 17 | steps: 18 | - 19 | name: Free Disk Space 20 | uses: jlumbroso/free-disk-space@main 21 | with: 22 | tool-cache: true 23 | - 24 | name: Set up QEMU 25 | uses: docker/setup-qemu-action@v3 26 | - 27 | name: Set up Docker Buildx 28 | uses: docker/setup-buildx-action@v3 29 | - 30 | name: Build and push 31 | id: docker_build 32 | uses: docker/build-push-action@v5 33 | with: 34 | context: "{{defaultContext}}" 35 | push: false 36 | platforms: linux/amd64 37 | build-args: git_hash=${{ github.sha }} 38 | - 39 | name: Image digest 40 | run: echo ${{ steps.docker_build.outputs.digest }} 41 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "semantics_manager"] 2 | path = semantics_manager 3 | url = https://github.com/KumarRobotics/semantics_manager.git 4 | [submodule "rofl-beta"] 5 | path = rofl-beta 6 | url = https://github.com/versatran01/rofl-beta 7 | [submodule "spomp"] 8 | path = spomp 9 | url = https://github.com/KumarRobotics/spomp.git 10 | [submodule "asoom"] 11 | path = asoom 12 | url = https://github.com/KumarRobotics/asoom.git 13 | [submodule "air_router"] 14 | path = air_router 15 | url = https://github.com/KumarRobotics/air_router.git 16 | [submodule "MOCHA"] 17 | path = MOCHA 18 | url = https://github.com/KumarRobotics/MOCHA.git 19 | [submodule "dependencies/orbslam3_ros"] 20 | path = dependencies/orbslam3_ros 21 | url = https://github.com/iandouglas96/orbslam3_ros.git 22 | [submodule "dependencies/erfnet_pytorch_ros"] 23 | path = dependencies/erfnet_pytorch_ros 24 | url = https://github.com/iandouglas96/erfnet_pytorch_ros.git 25 | [submodule "dependencies/rangenet_inf"] 26 | path = dependencies/rangenet_inf 27 | url = https://github.com/KumarRobotics/rangenet_inf.git 28 | [submodule "tools/sill"] 29 | path = tools/sill 30 | url = https://github.com/iandouglas96/sill.git 31 | [submodule "dependencies/grid_map"] 32 | path = dependencies/grid_map 33 | url = https://github.com/KumarRobotics/grid_map.git 34 | [submodule "tools/rviz_textured_quads"] 35 | path = tools/rviz_textured_quads 36 | url = https://github.com/lucasw/rviz_textured_quads 37 | [submodule "dependencies/ouster_decoder"] 38 | path = dependencies/ouster_decoder 39 | url = https://github.com/KumarRobotics/ouster_decoder.git 40 | [submodule "top_down_renderer"] 41 | path = top_down_renderer 42 | url = https://github.com/KumarRobotics/top_down_renderer.git 43 | [submodule "dependencies/ORB_SLAM3"] 44 | path = dependencies/ORB_SLAM3 45 | url = https://github.com/KumarRobotics/ORB_SLAM3.git 46 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Note: this Dockerfile is only used for the CI. Please refer to the 2 | # instructions in README.md to use this repo 3 | 4 | FROM kumarrobotics/dcist-master:latest 5 | 6 | # Requires a docker build argument `user_id` 7 | ARG user_id=1000 8 | env USER dcist 9 | 10 | # Create a base docker environment 11 | RUN . /home/$USER/dcist_ws/devel/setup.sh \ 12 | && mkdir -p /home/$USER/user_ws/src && cd /home/$USER/user_ws \ 13 | && catkin config --extend ~/dcist_ws/devel \ 14 | && catkin build --no-status -DCMAKE_BUILD_TYPE=Release 15 | 16 | # Copy the spomp environment into the user workspace 17 | COPY --chown=$USER:$USER . /home/$USER/user_ws/src/spomp-system 18 | 19 | # Build the workspace 20 | RUN cd /home/$USER/user_ws \ 21 | && catkin build --no-status -DCMAKE_BUILD_TYPE=Release \ 22 | && catkin build 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SPOMP: Semantic Panoramic Online Mapping and Planning 2 | ![Docker CI Build](https://github.com/KumarRobotics/spomp-system/actions/workflows/docker-build.yaml/badge.svg?branch=main) 3 | 4 | This is the public code repository for our work SPOMP. 5 | Here are all the submodules needed for the stack. 6 | 7 | ## Video 8 | 9 | [](https://www.youtube.com/watch?v=jcPOVRsdUhU) 10 | 11 | ## Paper 12 | IEEE T-FR: [https://doi.org/10.1109/TFR.2024.3424748](https://doi.org/10.1109/TFR.2024.3424748) 13 | arXiv: [https://doi.org/10.48550/arXiv.2407.09902](https://doi.org/10.48550/arXiv.2407.09902) 14 | 15 | Citation: 16 | ``` 17 | @ARTICLE{10587299, 18 | author={Miller, Ian D. and Cladera, Fernando and Smith, Trey and Taylor, Camillo Jose and Kumar, Vijay}, 19 | journal={IEEE Transactions on Field Robotics}, 20 | title={Air-Ground Collaboration with SPOMP: Semantic Panoramic Online Mapping and Planning}, 21 | year={2024}, 22 | volume={}, 23 | number={}, 24 | pages={1-1}, 25 | keywords={Semantics;Laser radar;Task analysis;Planning;Robot sensing systems;Sensors;Three-dimensional displays}, 26 | doi={10.1109/TFR.2024.3424748}} 27 | ``` 28 | 29 | ## How to run the code? 30 | We provide Docker images that can be used to run this code: 31 | ``` 32 | # Clone and run the master docker image 33 | git clone https://github.com/KumarRobotics/dcist_master.git 34 | cd dcist_master 35 | ./run.bash dcist-master 36 | 37 | # Clone the repo and build 38 | cd user_ws 39 | mkdir src 40 | git clone --recursive -j8 https://github.com/KumarRobotics/spomp-system.git src/spomp-system 41 | catkin config --extend ~/dcist_ws/devel && catkin build -DCMAKE_BUILD_TYPE=Release 42 | ``` 43 | 44 | Launch files for air and ground robots can be found inside `semantics_manager`. 45 | 46 | ## Main modules 47 | 48 | - [semantics_manager](http://github.com/KumarRobotics/semantics_manager): Starting point for launch files and configuration management 49 | - [ROFL](https://github.com/versatran01/rofl-beta): LiDAR odometry 50 | - [SPOMP](http://github.com/KumarRobotics/spomp): Autonomy stack for UGVs. Handles terrain analysis and global and local planning. 51 | - [ASOOM](http://github.com/KumarRobotics/asoom): Aerial orthomapper 52 | - [top_down_renderer](https://github.com/KumarRobotics/top_down_renderer): Crossview localizer 53 | - [air_router](https://github.com/KumarRobotics/air_router): High-level planner for UAV 54 | - [MOCHA](http://github.com/KumarRobotics/MOCHA): Distributed, opportunistic communication framework 55 | 56 | ## Dependencies 57 | 58 | - [grid_map](https://github.com/KumarRobotics/grid_map): Fork of grid_map with resizing and compression capabilities 59 | - [orbslam3_ros](https://github.com/iandouglas96/orbslam3_ros/): ROS wrapper for ORBSLAM3 60 | - [erfnet_pytorch_ros](https://github.com/iandouglas96/erfnet_pytorch_ros): ROS wrapper for erfnet (for aerial image segmentation) 61 | - [rangenet_inf](https://github.com/KumarRobotics/rangenet_inf): ROS wrapper for RangeNet++ (for depth panorama segmentation) 62 | - [ouster_decoder](https://github.com/KumarRobotics/ouster_decoder): Ouster LiDAR driver (needed for ROFL) 63 | - [ORB_SLAM3](https://github.com/KumarRobotics/ORB_SLAM3): Fork of ORB_SLAM3 with loop closure deactivated. 64 | 65 | ## Tools 66 | These are not needed to run the stack, but may be useful. 67 | 68 | - [SILL](https://github.com/iandouglas96/sill): Depth panorama/LiDAR labelling tool 69 | - [rviz_textured_quads](https://github.com/lucasw/rviz_textured_quads) Useful tool for visualizing map images in rviz 70 | -------------------------------------------------------------------------------- /titan_launch/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.0.2) 2 | project(titan_launch) 3 | 4 | ## Compile as C++11, supported in ROS Kinetic and newer 5 | # add_compile_options(-std=c++11) 6 | 7 | ## Find catkin macros and libraries 8 | ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) 9 | ## is used, also find other catkin packages 10 | find_package(catkin REQUIRED) 11 | 12 | ## System dependencies are found with CMake's conventions 13 | # find_package(Boost REQUIRED COMPONENTS system) 14 | 15 | 16 | ## Uncomment this if the package has a setup.py. This macro ensures 17 | ## modules and global scripts declared therein get installed 18 | ## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html 19 | # catkin_python_setup() 20 | 21 | ################################################ 22 | ## Declare ROS messages, services and actions ## 23 | ################################################ 24 | 25 | ## To declare and build messages, services or actions from within this 26 | ## package, follow these steps: 27 | ## * Let MSG_DEP_SET be the set of packages whose message types you use in 28 | ## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). 29 | ## * In the file package.xml: 30 | ## * add a build_depend tag for "message_generation" 31 | ## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET 32 | ## * If MSG_DEP_SET isn't empty the following dependency has been pulled in 33 | ## but can be declared for certainty nonetheless: 34 | ## * add a exec_depend tag for "message_runtime" 35 | ## * In this file (CMakeLists.txt): 36 | ## * add "message_generation" and every package in MSG_DEP_SET to 37 | ## find_package(catkin REQUIRED COMPONENTS ...) 38 | ## * add "message_runtime" and every package in MSG_DEP_SET to 39 | ## catkin_package(CATKIN_DEPENDS ...) 40 | ## * uncomment the add_*_files sections below as needed 41 | ## and list every .msg/.srv/.action file to be processed 42 | ## * uncomment the generate_messages entry below 43 | ## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) 44 | 45 | ## Generate messages in the 'msg' folder 46 | # add_message_files( 47 | # FILES 48 | # Message1.msg 49 | # Message2.msg 50 | # ) 51 | 52 | ## Generate services in the 'srv' folder 53 | # add_service_files( 54 | # FILES 55 | # Service1.srv 56 | # Service2.srv 57 | # ) 58 | 59 | ## Generate actions in the 'action' folder 60 | # add_action_files( 61 | # FILES 62 | # Action1.action 63 | # Action2.action 64 | # ) 65 | 66 | ## Generate added messages and services with any dependencies listed here 67 | # generate_messages( 68 | # DEPENDENCIES 69 | # std_msgs # Or other packages containing msgs 70 | # ) 71 | 72 | ################################################ 73 | ## Declare ROS dynamic reconfigure parameters ## 74 | ################################################ 75 | 76 | ## To declare and build dynamic reconfigure parameters within this 77 | ## package, follow these steps: 78 | ## * In the file package.xml: 79 | ## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" 80 | ## * In this file (CMakeLists.txt): 81 | ## * add "dynamic_reconfigure" to 82 | ## find_package(catkin REQUIRED COMPONENTS ...) 83 | ## * uncomment the "generate_dynamic_reconfigure_options" section below 84 | ## and list every .cfg file to be processed 85 | 86 | ## Generate dynamic reconfigure parameters in the 'cfg' folder 87 | # generate_dynamic_reconfigure_options( 88 | # cfg/DynReconf1.cfg 89 | # cfg/DynReconf2.cfg 90 | # ) 91 | 92 | ################################### 93 | ## catkin specific configuration ## 94 | ################################### 95 | ## The catkin_package macro generates cmake config files for your package 96 | ## Declare things to be passed to dependent projects 97 | ## INCLUDE_DIRS: uncomment this if your package contains header files 98 | ## LIBRARIES: libraries you create in this project that dependent projects also need 99 | ## CATKIN_DEPENDS: catkin_packages dependent projects also need 100 | ## DEPENDS: system dependencies of this project that dependent projects also need 101 | catkin_package( 102 | # INCLUDE_DIRS include 103 | # LIBRARIES titan_launch 104 | # CATKIN_DEPENDS other_catkin_pkg 105 | # DEPENDS system_lib 106 | ) 107 | 108 | ########### 109 | ## Build ## 110 | ########### 111 | 112 | ## Specify additional locations of header files 113 | ## Your package locations should be listed before other locations 114 | include_directories( 115 | # include 116 | # ${catkin_INCLUDE_DIRS} 117 | ) 118 | 119 | ## Declare a C++ library 120 | # add_library(${PROJECT_NAME} 121 | # src/${PROJECT_NAME}/titan_launch.cpp 122 | # ) 123 | 124 | ## Add cmake target dependencies of the library 125 | ## as an example, code may need to be generated before libraries 126 | ## either from message generation or dynamic reconfigure 127 | # add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 128 | 129 | ## Declare a C++ executable 130 | ## With catkin_make all packages are built within a single CMake context 131 | ## The recommended prefix ensures that target names across packages don't collide 132 | # add_executable(${PROJECT_NAME}_node src/titan_launch_node.cpp) 133 | 134 | ## Rename C++ executable without prefix 135 | ## The above recommended prefix causes long target names, the following renames the 136 | ## target back to the shorter version for ease of user use 137 | ## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" 138 | # set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") 139 | 140 | ## Add cmake target dependencies of the executable 141 | ## same as for the library above 142 | # add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) 143 | 144 | ## Specify libraries to link a library or executable target against 145 | # target_link_libraries(${PROJECT_NAME}_node 146 | # ${catkin_LIBRARIES} 147 | # ) 148 | 149 | ############# 150 | ## Install ## 151 | ############# 152 | 153 | # all install targets should use catkin DESTINATION variables 154 | # See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html 155 | 156 | ## Mark executable scripts (Python etc.) for installation 157 | ## in contrast to setup.py, you can choose the destination 158 | # catkin_install_python(PROGRAMS 159 | # scripts/my_python_script 160 | # DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} 161 | # ) 162 | 163 | ## Mark executables for installation 164 | ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html 165 | # install(TARGETS ${PROJECT_NAME}_node 166 | # RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} 167 | # ) 168 | 169 | ## Mark libraries for installation 170 | ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html 171 | # install(TARGETS ${PROJECT_NAME} 172 | # ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} 173 | # LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} 174 | # RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} 175 | # ) 176 | 177 | ## Mark cpp header files for installation 178 | # install(DIRECTORY include/${PROJECT_NAME}/ 179 | # DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} 180 | # FILES_MATCHING PATTERN "*.h" 181 | # PATTERN ".svn" EXCLUDE 182 | # ) 183 | 184 | ## Mark other files for installation (e.g. launch and bag files, etc.) 185 | # install(FILES 186 | # # myfile1 187 | # # myfile2 188 | # DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} 189 | # ) 190 | 191 | ############# 192 | ## Testing ## 193 | ############# 194 | 195 | ## Add gtest based cpp test target and link libraries 196 | # catkin_add_gtest(${PROJECT_NAME}-test test/test_titan_launch.cpp) 197 | # if(TARGET ${PROJECT_NAME}-test) 198 | # target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) 199 | # endif() 200 | 201 | ## Add folders to be run by python nosetests 202 | # catkin_add_nosetests(test) 203 | -------------------------------------------------------------------------------- /titan_launch/config/px4_config.yaml: -------------------------------------------------------------------------------- 1 | # Common configuration for PX4 autopilot 2 | # 3 | # node: 4 | startup_px4_usb_quirk: true 5 | 6 | # --- system plugins --- 7 | 8 | # sys_status & sys_time connection options 9 | conn: 10 | heartbeat_rate: 1.0 # send hertbeat rate in Hertz 11 | timeout: 10.0 # hertbeat timeout in seconds 12 | timesync_rate: 10.0 # TIMESYNC rate in Hertz (feature disabled if 0.0) 13 | system_time_rate: 1.0 # send system time to FCU rate in Hertz (disabled if 0.0) 14 | 15 | # sys_status 16 | sys: 17 | min_voltage: 10.0 # diagnostics min voltage 18 | disable_diag: false # disable all sys_status diagnostics, except heartbeat 19 | 20 | # sys_time 21 | time: 22 | time_ref_source: "fcu" # time_reference source 23 | timesync_mode: MAVLINK 24 | timesync_avg_alpha: 0.6 # timesync averaging factor 25 | 26 | # --- mavros plugins (alphabetical order) --- 27 | 28 | # 3dr_radio 29 | tdr_radio: 30 | low_rssi: 40 # raw rssi lower level for diagnostics 31 | 32 | # actuator_control 33 | # None 34 | 35 | # command 36 | cmd: 37 | use_comp_id_system_control: false # quirk for some old FCUs 38 | 39 | # dummy 40 | # None 41 | 42 | # ftp 43 | # None 44 | 45 | # global_position 46 | global_position: 47 | frame_id: "map" # origin frame 48 | child_frame_id: "base_link" # body-fixed frame 49 | rot_covariance: 99999.0 # covariance for attitude? 50 | gps_uere: 1.0 # User Equivalent Range Error (UERE) of GPS sensor (m) 51 | use_relative_alt: true # use relative altitude for local coordinates 52 | tf: 53 | send: false # send TF? 54 | frame_id: "map" # TF frame_id 55 | global_frame_id: "earth" # TF earth frame_id 56 | child_frame_id: "base_link" # TF child_frame_id 57 | 58 | # imu_pub 59 | imu: 60 | frame_id: "base_link" 61 | # need find actual values 62 | linear_acceleration_stdev: 0.0003 63 | angular_velocity_stdev: !degrees 0.02 64 | orientation_stdev: 1.0 65 | magnetic_stdev: 0.0 66 | 67 | # local_position 68 | local_position: 69 | frame_id: "map" 70 | tf: 71 | send: false 72 | frame_id: "map" 73 | child_frame_id: "base_link" 74 | send_fcu: false 75 | 76 | # param 77 | # None, used for FCU params 78 | 79 | # rc_io 80 | # None 81 | 82 | # safety_area 83 | safety_area: 84 | p1: {x: 1.0, y: 1.0, z: 1.0} 85 | p2: {x: -1.0, y: -1.0, z: -1.0} 86 | 87 | # setpoint_accel 88 | setpoint_accel: 89 | send_force: false 90 | 91 | # setpoint_attitude 92 | setpoint_attitude: 93 | reverse_thrust: false # allow reversed thrust 94 | use_quaternion: false # enable PoseStamped topic subscriber 95 | tf: 96 | listen: false # enable tf listener (disable topic subscribers) 97 | frame_id: "map" 98 | child_frame_id: "target_attitude" 99 | rate_limit: 50.0 100 | 101 | setpoint_raw: 102 | thrust_scaling: 1.0 # used in setpoint_raw attitude callback. 103 | # Note: PX4 expects normalized thrust values between 0 and 1, which means that 104 | # the scaling needs to be unitary and the inputs should be 0..1 as well. 105 | 106 | # setpoint_position 107 | setpoint_position: 108 | tf: 109 | listen: false # enable tf listener (disable topic subscribers) 110 | frame_id: "map" 111 | child_frame_id: "target_position" 112 | rate_limit: 50.0 113 | mav_frame: LOCAL_NED 114 | 115 | # setpoint_velocity 116 | setpoint_velocity: 117 | mav_frame: LOCAL_NED 118 | 119 | # vfr_hud 120 | # None 121 | 122 | # waypoint 123 | mission: 124 | pull_after_gcs: true # update mission if gcs updates 125 | 126 | # --- mavros extras plugins (same order) --- 127 | 128 | # adsb 129 | # None 130 | 131 | # debug_value 132 | # None 133 | 134 | # distance_sensor 135 | ## Currently available orientations: 136 | # Check http://wiki.ros.org/mavros/Enumerations 137 | ## 138 | distance_sensor: 139 | hrlv_ez4_pub: 140 | id: 0 141 | frame_id: "hrlv_ez4_sonar" 142 | orientation: PITCH_270 # RPY:{0.0, 270.0, 0.0} - downward-facing 143 | field_of_view: 0.0 # XXX TODO 144 | send_tf: true 145 | sensor_position: {x: 0.0, y: 0.0, z: -0.1} 146 | lidarlite_pub: 147 | id: 1 148 | frame_id: "lidarlite_laser" 149 | orientation: PITCH_270 150 | field_of_view: 0.0 # XXX TODO 151 | send_tf: true 152 | sensor_position: {x: 0.0, y: 0.0, z: -0.1} 153 | sonar_1_sub: 154 | subscriber: true 155 | id: 2 156 | orientation: PITCH_270 157 | laser_1_sub: 158 | subscriber: true 159 | id: 3 160 | orientation: PITCH_270 161 | 162 | # image_pub 163 | image: 164 | frame_id: "px4flow" 165 | 166 | # fake_gps 167 | fake_gps: 168 | # select data source 169 | use_mocap: true # ~mocap/pose 170 | mocap_transform: true # ~mocap/tf instead of pose 171 | use_vision: false # ~vision (pose) 172 | # origin (default: Zürich) 173 | geo_origin: 174 | lat: 47.3667 # latitude [degrees] 175 | lon: 8.5500 # longitude [degrees] 176 | alt: 408.0 # altitude (height over the WGS-84 ellipsoid) [meters] 177 | eph: 2.0 178 | epv: 2.0 179 | satellites_visible: 5 # virtual number of visible satellites 180 | fix_type: 3 # type of GPS fix (default: 3D) 181 | tf: 182 | listen: false 183 | send: false # send TF? 184 | frame_id: "map" # TF frame_id 185 | child_frame_id: "fix" # TF child_frame_id 186 | rate_limit: 10.0 # TF rate 187 | gps_rate: 5.0 # GPS data publishing rate 188 | 189 | # landing_target 190 | landing_target: 191 | listen_lt: false 192 | mav_frame: "LOCAL_NED" 193 | land_target_type: "VISION_FIDUCIAL" 194 | image: 195 | width: 640 # [pixels] 196 | height: 480 197 | camera: 198 | fov_x: 2.0071286398 # default: 115 [degrees] 199 | fov_y: 2.0071286398 200 | tf: 201 | send: true 202 | listen: false 203 | frame_id: "landing_target" 204 | child_frame_id: "camera_center" 205 | rate_limit: 10.0 206 | target_size: {x: 0.3, y: 0.3} 207 | 208 | # mocap_pose_estimate 209 | mocap: 210 | # select mocap source 211 | use_tf: false # ~mocap/tf 212 | use_pose: true # ~mocap/pose 213 | 214 | # odom 215 | odometry: 216 | in: 217 | frame_id: "odom" 218 | child_frame_id: "base_link" 219 | frame_tf: 220 | local_frame: "local_origin_ned" 221 | body_frame_orientation: "flu" 222 | out: 223 | frame_tf: 224 | # available: check MAV_FRAME odometry local frames in 225 | # https://mavlink.io/en/messages/common.html 226 | local_frame: "vision_ned" 227 | # available: ned, frd or flu (though only the tf to frd is supported) 228 | body_frame_orientation: "frd" 229 | 230 | # px4flow 231 | px4flow: 232 | frame_id: "px4flow" 233 | ranger_fov: !degrees 6.8 # 6.8 degreens at 5 meters, 31 degrees at 1 meter 234 | ranger_min_range: 0.3 # meters 235 | ranger_max_range: 5.0 # meters 236 | 237 | # vision_pose_estimate 238 | vision_pose: 239 | tf: 240 | listen: false # enable tf listener (disable topic subscribers) 241 | frame_id: "map" 242 | child_frame_id: "vision_estimate" 243 | rate_limit: 10.0 244 | 245 | # vision_speed_estimate 246 | vision_speed: 247 | listen_twist: true # enable listen to twist topic, else listen to vec3d topic 248 | twist_cov: true # enable listen to twist with covariance topic 249 | 250 | # vibration 251 | vibration: 252 | frame_id: "base_link" 253 | 254 | # wheel_odometry 255 | wheel_odometry: 256 | count: 2 # number of wheels to compute odometry 257 | use_rpm: false # use wheel's RPM instead of cumulative distance to compute odometry 258 | wheel0: {x: 0.0, y: -0.15, radius: 0.05} # x-, y-offset (m,NED) and radius (m) 259 | wheel1: {x: 0.0, y: 0.15, radius: 0.05} # x-, y-offset (m,NED) and radius (m) 260 | send_raw: true # send wheel's RPM and cumulative distance (~/wheel_odometry/rpm, ~/wheel_odometry/distance) 261 | send_twist: false # send geometry_msgs/TwistWithCovarianceStamped instead of nav_msgs/Odometry 262 | frame_id: "map" # origin frame 263 | child_frame_id: "base_link" # body-fixed frame 264 | vel_error: 0.1 # wheel velocity measurement error 1-std (m/s) 265 | tf: 266 | send: true 267 | frame_id: "map" 268 | child_frame_id: "base_link" 269 | 270 | # vim:set ts=2 sw=2 et: 271 | 272 | -------------------------------------------------------------------------------- /titan_launch/config/px4_pluginlists.yaml: -------------------------------------------------------------------------------- 1 | plugin_blacklist: 2 | # common 3 | - safety_area 4 | # extras 5 | - image_pub 6 | - vibration 7 | - distance_sensor 8 | - rangefinder 9 | - wheel_odometry 10 | 11 | 12 | plugin_whitelist: [] 13 | #- 'sys_*' 14 | -------------------------------------------------------------------------------- /titan_launch/launch/px4.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /titan_launch/launch/startup_ground.launch: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /titan_launch/package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | titan_launch 4 | 0.0.0 5 | The titan_launch package 6 | 7 | 8 | 9 | 10 | fclad 11 | 12 | 13 | 14 | 15 | 16 | TODO 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | catkin 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /video_thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KumarRobotics/spomp-system/5ad429a94b762a9200fd1fb5f43ec88a45b4e608/video_thumbnail.png --------------------------------------------------------------------------------