|
2 | 2 | # Made by Doncey Albin |
3 | 3 | # Alter as desired. The type references article_v2.html in includes if there are things you want to change. |
4 | 4 | type: article_v2 |
5 | | -title_main: "CU-Multi" |
| 5 | +title_main: "CU-Multi:" |
6 | 6 | title_follow: "A Dataset for Multi-Robot Data Association" |
7 | 7 | # university_name: "University of Colorado - Boulder" # You can comment this out if you dont like it. |
8 | 8 |
|
@@ -44,26 +44,295 @@ show_news_updates: False |
44 | 44 | news_update_1: "2024-12-25 Dataset visualization code now available." |
45 | 45 | --- |
46 | 46 |
|
47 | | -<div style="text-align: center;"> |
48 | | - Multi-robot systems (MRSs) are valuable for tasks such as search and rescue due to their ability to coordinate over shared observations. A central challenge in these systems is aligning independently collected perception data across space and time– i.e., multi-robot data association. While recent advances in collaborative SLAM (C-SLAM), map merging, and inter-robot loop closure detection have significantly progressed the field, evaluation strategies still predominantly rely on splitting a single trajectory from single-robot SLAM datasets into multiple segments to simulate multiple robots. Without careful consideration to how a single trajectory is split, this approach will fail to capture realistic pose-dependent variation in observations of a scene inherent to multi-robot systems. To address this gap, we present CU-Multi, a multi-robot dataset collected over multiple days at two locations on the University of Colorado Boulder campus. Using a single robotic platform, we generate four synchronized runs with aligned start times and deliberate percentages of trajectory overlap. CU-Multi includes RGB-D, GPS with accurate geospatial heading, and semantically annotated LiDAR data. By introducing controlled variations in trajectory overlap and dense lidar annotations, CU-Multi offers a compelling alternative for evaluating methods in multi-robot data association. |
| 47 | +<!-- css for javascript to animate Huntie rotating about --> |
| 48 | +<style> |
| 49 | + body { |
| 50 | + margin: 0; |
| 51 | + padding: 0; |
| 52 | + overflow: auto; |
| 53 | + position: relative; |
| 54 | + } |
| 55 | + #huntie-image-container { |
| 56 | + position: fixed; |
| 57 | + top: 0; |
| 58 | + left: 0; |
| 59 | + width: 100%; |
| 60 | + height: 100%; |
| 61 | + z-index: -1; |
| 62 | + pointer-events: none; |
| 63 | + } |
| 64 | + .robot-img { |
| 65 | + position: absolute; |
| 66 | + width: 100px; |
| 67 | + height: auto; |
| 68 | + user-select: none; |
| 69 | + transition: transform 1s ease-in-out, left 3s ease-in-out, top 3s ease-in-out; |
| 70 | + } |
| 71 | +</style> |
| 72 | + |
| 73 | +<div id="huntie-image-container"></div> |
| 74 | + |
| 75 | +<script> |
| 76 | + // robot colors |
| 77 | + const glowColors = ['limegreen', 'purple', 'orange', 'deepskyblue']; |
| 78 | + |
| 79 | + function getRandomInt(min, max) { |
| 80 | + return Math.floor(Math.random() * (max - min + 1)) + min; |
| 81 | + } |
| 82 | + |
| 83 | + function checkOverlap(x, y, size, positions) { |
| 84 | + for (let pos of positions) { |
| 85 | + if (Math.abs(x - pos.x) < size && Math.abs(y - pos.y) < size) { |
| 86 | + return true; |
| 87 | + } |
| 88 | + } |
| 89 | + return false; |
| 90 | + } |
| 91 | + |
| 92 | + function scatterImagesOnSides(src, numImages, size) { |
| 93 | + const container = document.getElementById('huntie-image-container'); |
| 94 | + const positions = []; |
| 95 | + const allImgs = []; |
| 96 | + |
| 97 | + for (let i = 0; i < numImages; i++) { |
| 98 | + let x, y, attempts = 0; |
| 99 | + const side = Math.random() < 0.5 ? 'left' : 'right'; |
| 100 | + do { |
| 101 | + x = side === 'left' ? getRandomInt(0, 0.1 * window.innerWidth - size) : getRandomInt(0.9 * window.innerWidth, window.innerWidth - size); |
| 102 | + y = getRandomInt(0, window.innerHeight - size); |
| 103 | + attempts++; |
| 104 | + } while (checkOverlap(x, y, size, positions) && attempts < 100); |
| 105 | + |
| 106 | + positions.push({x, y}); |
| 107 | + |
| 108 | + const img = document.createElement('img'); |
| 109 | + img.src = src; |
| 110 | + img.classList.add('robot-img'); |
| 111 | + // add |
| 112 | + if (i < glowColors.length) { |
| 113 | + img.style.filter = `drop-shadow(0 0 4px ${glowColors[i]})`; |
| 114 | + } |
| 115 | + img.style.left = x + 'px'; |
| 116 | + img.style.top = y + 'px'; |
| 117 | + img.dataset.angle = getRandomInt(0, 360); |
| 118 | + |
| 119 | + container.appendChild(img); |
| 120 | + allImgs.push(img); |
| 121 | + } |
| 122 | + |
| 123 | + for (const img of allImgs) { |
| 124 | + animateImage(img, allImgs, size); |
| 125 | + } |
| 126 | + } |
| 127 | + |
| 128 | + function animateImage(img, allImgs, size) { |
| 129 | + setInterval(() => { |
| 130 | + // rotate mr huntie |
| 131 | + const angleChange = getRandomInt(-90, 90); |
| 132 | + img.dataset.angle = parseFloat(img.dataset.angle) + angleChange; |
| 133 | + img.style.transform = `rotate(${img.dataset.angle}deg)`; |
| 134 | + |
| 135 | + // translate mr huntie along new heading |
| 136 | + setTimeout(() => { |
| 137 | + const distance = getRandomInt(20, 50); |
| 138 | + const rad = img.dataset.angle * (Math.PI / 180); |
| 139 | + const moveX = Math.cos(rad) * distance; |
| 140 | + const moveY = Math.sin(rad) * distance; |
| 141 | + |
| 142 | + const newX = parseFloat(img.style.left) + moveX; |
| 143 | + const newY = parseFloat(img.style.top) + moveY; |
| 144 | + |
| 145 | + let overlap = false; |
| 146 | + for (const other of allImgs) { |
| 147 | + if (other === img) continue; |
| 148 | + const otherX = parseFloat(other.style.left); |
| 149 | + const otherY = parseFloat(other.style.top); |
| 150 | + if (Math.abs(newX - otherX) < size && Math.abs(newY - otherY) < size) { |
| 151 | + overlap = true; |
| 152 | + break; |
| 153 | + } |
| 154 | + } |
| 155 | + |
| 156 | + // make sure robots are not colliding... |
| 157 | + if (!overlap) { |
| 158 | + img.style.left = newX + 'px'; |
| 159 | + img.style.top = newY + 'px'; |
| 160 | + } |
| 161 | + }, 3000); |
| 162 | + }, 3000); |
| 163 | + } |
| 164 | + |
| 165 | + // 4 images of Huntie with 60px on each on sides of the page :) |
| 166 | + scatterImagesOnSides('/img/cumulti/huntie_bev.png', 4, 60); |
| 167 | +</script> |
| 168 | + |
| 169 | +<div style="text-align: justify; background-color:rgb(225, 225, 225); padding: 5px; border-radius: 5px;"> |
| 170 | + <div style="text-align:center; font-size: 36px;"> |
| 171 | + <strong>Abstract</strong> |
| 172 | + </div> |
| 173 | + |
| 174 | + <p style="text-align: justify; flex: 1; padding: 10px;"> |
| 175 | + Multi-robot systems (MRSs) are valuable for tasks such as search and rescue due to their ability to coordinate over shared observations. A central challenge in these systems is aligning independently collected perception data across space and time– i.e., multi-robot data association. While recent advances in collaborative SLAM (C-SLAM), map merging, and inter-robot loop closure detection have significantly progressed the field, evaluation strategies still predominantly rely on splitting a single trajectory from single-robot SLAM datasets into multiple segments to simulate multiple robots. Without careful consideration to how a single trajectory is split, this approach will fail to capture realistic pose-dependent variation in observations of a scene inherent to multi-robot systems. To address this gap, we present CU-Multi, a multi-robot dataset collected over multiple days at two locations on the University of Colorado Boulder campus. Using a single robotic platform, we generate four synchronized runs with aligned start times and deliberate percentages of trajectory overlap. CU-Multi includes RGB-D, GPS with accurate geospatial heading, and semantically annotated LiDAR data. By introducing controlled variations in trajectory overlap and dense lidar annotations, CU-Multi offers a compelling alternative for evaluating methods in multi-robot data association. |
| 176 | + </p> |
49 | 177 | </div> |
50 | 178 |
|
51 | | -## Dataset |
| 179 | +## System and Sensors |
52 | 180 |
|
53 | | -<div style="display: flex; margin-bottom: 20px;"> |
54 | | - |
55 | | - <!-- Left side: two stacked images --> |
| 181 | + |
| 182 | +<div style="display: flex; margin-bottom: 20px; background-color:rgba(255, 255, 255, 0.90);"> |
56 | 183 | <div style="display: flex; flex-direction: column; align-items: center; margin-right: 15px;"> |
57 | 184 | <img src="/img/cumulti/huntie_sensors.png" alt="" style="margin-bottom: 10px;" width="400"> |
58 | | - <img src="/img/cumulti/main_image.png" alt="" width="400"> |
59 | 185 | </div> |
60 | 186 |
|
61 | | - <!-- Right side: justified text --> |
62 | 187 | <p style="text-align: justify; flex: 1;"> |
63 | 188 | We collected the CU-Multi Dataset in Boulder, Colorado at the CU Boulder campus. The CU-Multi dataset was collected using the AgileX Hunter SE platform modified with a custom-designed electronics housing (see Figure 2). Inside the housing, the system includes an Intel NUC i7 with 16 GB of RAM, a power distribution board, an Ouster interface module, and a 217 Wh battery. Externally, a mounting plate on the rear of the Hunter SE accommodates two u-blox ANN-MB-00 GNSS antennas, while a front-mounted plate holds a 64-beam Ouster LiDAR sensor, a RealSense D455 RGB-D camera, a Lord MicroStrain G7 IMU, and a Lord RTK cellular modem with an external antenna. |
64 | 189 | </p> |
65 | 190 | </div> |
66 | 191 |
|
| 192 | +<div style="display: flex; justify-content: center; background-color:rgba(255, 255, 255, 0.90);"> |
| 193 | + <div> |
| 194 | + <table style="border-collapse: collapse; border: 2px solid black;"> |
| 195 | + <tr> |
| 196 | + <th style="border: 1px solid black; padding: 8px;">Equipment</th> |
| 197 | + <th style="border: 1px solid black; padding: 8px;">Model Name</th> |
| 198 | + <th style="border: 1px solid black; padding: 8px;">Characteristics</th> |
| 199 | + <th style="border: 1px solid black; padding: 8px;">Resolution</th> |
| 200 | + <th style="border: 1px solid black; padding: 8px;">FoV</th> |
| 201 | + <th style="border: 1px solid black; padding: 8px;">Sensor Rate</th> |
| 202 | + </tr> |
| 203 | + <tr> |
| 204 | + <th style="border: 1px solid black; padding: 8px;"> LiDAR </th> |
| 205 | + <td style="border: 1px solid black; padding: 8px;"> Ouster OS-64 </td> |
| 206 | + <td style="border: 1px solid black; padding: 8px;"> 200 m range </td> |
| 207 | + <td style="border: 1px solid black; padding: 8px;"> 64v x 1028h </td> |
| 208 | + <td style="border: 1px solid black; padding: 8px;"> 45° x 360° </td> |
| 209 | + <td style="border: 1px solid black; padding: 8px;"> 20 Hz </td> |
| 210 | + </tr> |
| 211 | + <tr> |
| 212 | + <th style="border: 1px solid black; padding: 8px;"> RGB-D Camera </th> |
| 213 | + <td style="border: 1px solid black; padding: 8px;"> Intel Realsense D455 </td> |
| 214 | + <td style="border: 1px solid black; padding: 8px;"> RGB: Global Shutter </td> |
| 215 | + <td style="border: 1px solid black; padding: 8px;"> 1280 × 800 </td> |
| 216 | + <td style="border: 1px solid black; padding: 8px;">90° x 65° </td> |
| 217 | + <td style="border: 1px solid black; padding: 8px;"> 30 Hz </td> |
| 218 | + </tr> |
| 219 | + <tr> |
| 220 | + <th style="border: 1px solid black; padding: 8px;"> IMU</th> |
| 221 | + <td style="border: 1px solid black; padding: 8px;"> MicroStrain 3DM-GQ7-GNSS/INS </td> |
| 222 | + <td style="border: 1px solid black; padding: 8px;"> ±8 g </td> |
| 223 | + <td style="border: 1px solid black; padding: 8px;"> 300 dps </td> |
| 224 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 225 | + <td style="border: 1px solid black; padding: 8px;"> 400 Hz </td> |
| 226 | + </tr> |
| 227 | + <tr> |
| 228 | + <th style="border: 1px solid black; padding: 8px;"> Network Interface Modem </th> |
| 229 | + <td style="border: 1px solid black; padding: 8px;"> MicroStrain 3DM-RTK Modem </td> |
| 230 | + <td style="border: 1px solid black; padding: 8px;"> 2 cm, 0.1° accuracy </td> |
| 231 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 232 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 233 | + <td style="border: 1px solid black; padding: 8px;"> 2 Hz </td> |
| 234 | + </tr> |
| 235 | + <tr> |
| 236 | + <th style="border: 1px solid black; padding: 8px;"> GNSS Antennas </th> |
| 237 | + <td style="border: 1px solid black; padding: 8px;"> u-blox ANN-MB-00 </td> |
| 238 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 239 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 240 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 241 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 242 | + </tr> |
| 243 | + <tr> |
| 244 | + <th style="border: 1px solid black; padding: 8px;"> Main Computer </th> |
| 245 | + <td style="border: 1px solid black; padding: 8px;"> Intel NUC </td> |
| 246 | + <td style="border: 1px solid black; padding: 8px;"> Intel i7 CPU @ 3.20GHz, 16GB RAM </td> |
| 247 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 248 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 249 | + <td style="border: 1px solid black; padding: 8px;"> - </td> |
| 250 | + </tr> |
| 251 | + </table> |
| 252 | + <p style="text-align: center;"><strong>Table 1.</strong> <em>Hardware Specifications.</em></p> |
| 253 | + </div> |
| 254 | +</div> |
| 255 | + |
| 256 | +## Environments |
| 257 | + |
| 258 | +<div style="display: flex; background-color:rgba(255, 255, 255, 0.76); margin-bottom: 20px;"> |
| 259 | + <div style="display: flex; flex-direction: column; align-items: center; margin-left: 15px; margin-right: 15px;"> |
| 260 | + <img src="/img/cumulti/main_image.png" alt="" width="300"> |
| 261 | + </div> |
| 262 | + |
| 263 | + <p style="text-align: justify; flex: 1;"> |
| 264 | + We collected the CU-Multi Dataset in Boulder, Colorado at the CU Boulder campus. The CU-Multi dataset was collected using the AgileX Hunter SE platform modified with a custom-designed electronics housing (see Figure 2). Inside the housing, the system includes an Intel NUC i7 with 16 GB of RAM, a power distribution board, an Ouster interface module, and a 217 Wh battery. Externally, a mounting plate on the rear of the Hunter SE accommodates two u-blox ANN-MB-00 GNSS antennas, while a front-mounted plate holds a 64-beam Ouster LiDAR sensor, a RealSense D455 RGB-D camera, a Lord MicroStrain G7 IMU, and a Lord RTK cellular modem with an external antenna. |
| 265 | + </p> |
| 266 | +</div> |
| 267 | + |
| 268 | +### Main Campus Environment (*main_campus*) |
| 269 | + |
| 270 | +### Kittredge Loop Environment (*kittredge_loop*) |
| 271 | + |
| 272 | +<!-- <div style="display: flex; justify-content: center;"> |
| 273 | + <div> |
| 274 | + <table style="border-collapse: collapse; border: 2px solid black;"> |
| 275 | + <tr> |
| 276 | + <th style="border: 1px solid black; padding: 8px;">Environment</th> |
| 277 | + <th style="border: 1px solid black; padding: 8px;">Robot ID</th> |
| 278 | + <th style="border: 1px solid black; padding: 8px;">Total Path Length</th> |
| 279 | + <th style="border: 1px solid black; padding: 8px;"># Intra-robot loop closures</th> |
| 280 | + <th style="border: 1px solid black; padding: 8px;"># Inter-robot loop closures</th> |
| 281 | + </tr> |
| 282 | + <tr> |
| 283 | + <td style="border: 1px solid black; padding: 8px;" rowspan="4">Kittredge Loop</td> |
| 284 | + <td style="border: 1px solid black; padding: 8px;">robot1</td> |
| 285 | + <td style="border: 1px solid black; padding: 8px;">1136.41 m</td> |
| 286 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 287 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 288 | + </tr> |
| 289 | + <tr> |
| 290 | + <td style="border: 1px solid black; padding: 8px;">robot2</td> |
| 291 | + <td style="border: 1px solid black; padding: 8px;">1373.37 m</td> |
| 292 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 293 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 294 | + </tr> |
| 295 | + <tr> |
| 296 | + <td style="border: 1px solid black; padding: 8px;">robot3</td> |
| 297 | + <td style="border: 1px solid black; padding: 8px;">2792.06 m</td> |
| 298 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 299 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 300 | + </tr> |
| 301 | + <tr> |
| 302 | + <td style="border: 1px solid black; padding: 8px;">robot4</td> |
| 303 | + <td style="border: 1px solid black; padding: 8px;">4005.75 m</td> |
| 304 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 305 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 306 | + </tr> |
| 307 | + <tr> |
| 308 | + <td style="border: 1px solid black; padding: 8px;" rowspan="4">Main Campus</td> |
| 309 | + <td style="border: 1px solid black; padding: 8px;">robot1</td> |
| 310 | + <td style="border: 1px solid black; padding: 8px;">1295.96 m</td> |
| 311 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 312 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 313 | + </tr> |
| 314 | + <tr> |
| 315 | + <td style="border: 1px solid black; padding: 8px;">robot2</td> |
| 316 | + <td style="border: 1px solid black; padding: 8px;">1360.43 m</td> |
| 317 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 318 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 319 | + </tr> |
| 320 | + <tr> |
| 321 | + <td style="border: 1px solid black; padding: 8px;">robot3</td> |
| 322 | + <td style="border: 1px solid black; padding: 8px;">1816.76 m</td> |
| 323 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 324 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 325 | + </tr> |
| 326 | + <tr> |
| 327 | + <td style="border: 1px solid black; padding: 8px;">robot4</td> |
| 328 | + <td style="border: 1px solid black; padding: 8px;">2971.38 m</td> |
| 329 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 330 | + <td style="border: 1px solid black; padding: 8px;">-</td> |
| 331 | + </tr> |
| 332 | + </table> |
| 333 | + <p style="text-align: center;"><strong>Table 1.</strong> <em>Table of intra-robot loop closures in different environments</em></p> |
| 334 | + </div> |
| 335 | +</div> --> |
67 | 336 |
|
68 | 337 | <!-- <div style="text-align: center; margin-top: 20px;"> |
69 | 338 | <img src="/img/cumulti/main_image.png" alt="" style="display: inline-block; margin: 0 10px;" height="600"> |
|
0 commit comments