This driver exposes the BMI088 IMU (Inertial Measurement Unit) data to GXF applications. The gyroscope
and accelerometer data are published on separate channels because these sensors run on different clocks
and can be running at slightly different rates even at the same nominal frequency. They can optionally
be combined into a unified IMU message using the IMU Message Combiner
(extensions/imu_utils/imu_message_combiner
).
None
imu_frame
: The optional PoseTreeID for IMU data. The default value is zero if this parameter is not specified.accel_index
: The device index for the accelerometer. The default value is 0.gyro_index
: The device index for the gyroscope. The default value is 1.accel_frequency
: The frequency (in Hz) to set the accelerometer to. The default value is 100.gyro_frequency
: The frequency (in Hz) to set the gyroscope to. The default value is 100.sync_scheduling_term
: The term for scheduling execution when new data is ready to publish.
tx_accelerometer
(AccelerometerMessage): The transmitter for the accelerometer datatx_gyroscope
(GyroscopeMessage): The transmitter for the gyroscope data
Here is an example that does not use the IMU Message Combiner:
---
name: atlas
components:
- name: pose_tree
type: nvidia::isaac::PoseTree
- type: nvidia::isaac::PoseTreeSetup
parameters:
pose_tree: pose_tree
- name: imu_frame
type: nvidia::isaac::PoseTreeFrame
parameters:
pose_tree: pose_tree
---
name: bmi088_imu
components:
- type: nvidia::gxf::Subgraph
parameters:
location: extensions/bmi088_imu/graphs/bmi088.yaml
prerequisites:
imu_frame: atlas/imu_frame
---
name: accel_visualizer
components:
- name: rx_accelerometer
type: nvidia::gxf::DoubleBufferReceiver
parameters:
policy: 0
- name: tx_sight
type: nvidia::isaac::SightTransmitter
parameters:
capacity: 6
- name: allocator
type: nvidia::gxf::UnboundedAllocator
- type: nvidia::isaac::AccelerometerVisualizer
parameters:
rx_accelerometer: rx_accelerometer
tx_sight: tx_sight
allocator: allocator
- type: nvidia::gxf::MessageAvailableSchedulingTerm
parameters:
receiver: rx_accelerometer
min_size: 1
---
name: gyro_visualizer
components:
- name: rx_gyroscope
parameters:
policy: 0
type: nvidia::gxf::DoubleBufferReceiver
- name: tx_sight
type: nvidia::isaac::SightTransmitter
parameters:
capacity: 6
- name: allocator
type: nvidia::gxf::UnboundedAllocator
- type: nvidia::isaac::GyroscopeVisualizer
parameters:
rx_gyroscope: rx_gyroscope
tx_sight: tx_sight
allocator: allocator
- type: nvidia::gxf::MessageAvailableSchedulingTerm
parameters:
receiver: rx_gyroscope
min_size: 1
---
name: sight
components:
- name: sight_router
type: nvidia::isaac::SightRouter
- type: nvidia::isaac::SightWebserver
parameters:
sight_router: sight_router
port: 3000
webroot: packages/sight/webroot
asset_root: ../isaac_assets
asset_prefix: /apps/assets/
app_name: imu_bmi088
app_config: '{
"windows":{
"IMU":{
"renderer":"plot",
"channels":[
{"name":"imu_bmi088/accel_visualizer/tx_sight/linear_acceleration_x"},
{"name":"imu_bmi088/accel_visualizer/tx_sight/linear_acceleration_y"},
{"name":"imu_bmi088/accel_visualizer/tx_sight/linear_acceleration_z"},
{"name":"imu_bmi088/gyro_visualizer/tx_sight/angular_velocity_x"},
{"name":"imu_bmi088/gyro_visualizer/tx_sight/angular_velocity_y"},
{"name":"imu_bmi088/gyro_visualizer/tx_sight/angular_velocity_z"}
]
}
}
}'
- type: nvidia::gxf::PeriodicSchedulingTerm
parameters:
recess_period: 200Hz
---
components:
- type: nvidia::gxf::Connection
parameters:
source: bmi088_imu/tx_accelerometer
target: accel_visualizer/rx_accelerometer
- type: nvidia::gxf::Connection
parameters:
source: bmi088_imu/tx_gyroscope
target: gyro_visualizer/rx_gyroscope
---
components:
- name: clock
type: nvidia::gxf::RealtimeClock
parameters:
use_time_since_epoch: true
- type: nvidia::gxf::MultiThreadScheduler
parameters:
clock: clock
worker_thread_number: 4
check_recession_period_ms: 1
- type: nvidia::gxf::JobStatistics
parameters:
clock: clock
Here is a basic example that uses the IMU Message Combiner:
---
name: atlas
components:
- name: pose_tree
type: nvidia::isaac::PoseTree
- type: nvidia::isaac::PoseTreeSetup
parameters:
pose_tree: pose_tree
- name: imu_frame
type: nvidia::isaac::PoseTreeFrame
parameters:
pose_tree: pose_tree
---
name: bmi088_imu_combined
components:
- type: nvidia::gxf::Subgraph
parameters:
location: extensions/bmi088_imu/graphs/bmi088_combined.yaml
prerequisites:
imu_frame: atlas/imu_frame
---
name: imu_visualizer
components:
- name: rx_imu
type: nvidia::gxf::DoubleBufferReceiver
parameters:
capacity: 1024
- name: tx_sight
type: nvidia::isaac::SightTransmitter
parameters:
capacity: 6
- name: allocator
type: nvidia::gxf::UnboundedAllocator
- type: nvidia::isaac::ImuVisualizer
parameters:
rx_imu: rx_imu
tx_sight: tx_sight
allocator: allocator
- type: nvidia::gxf::MessageAvailableSchedulingTerm
parameters:
receiver: rx_imu
min_size: 1
---
name: sight
components:
- name: sight_router
type: nvidia::isaac::SightRouter
- type: nvidia::isaac::SightWebserver
parameters:
sight_router: sight_router
port: 3000
webroot: packages/sight/webroot
asset_root: ../isaac_assets
asset_prefix: /apps/assets/
app_name: imu_bmi088
app_config: '{
"windows":{
"IMU":{
"renderer":"plot",
"channels":[
{"name":"imu_bmi088/imu_visualizer/tx_sight/linear_acceleration_x"},
{"name":"imu_bmi088/imu_visualizer/tx_sight/linear_acceleration_y"},
{"name":"imu_bmi088/imu_visualizer/tx_sight/linear_acceleration_z"},
{"name":"imu_bmi088/imu_visualizer/tx_sight/angular_velocity_x"},
{"name":"imu_bmi088/imu_visualizer/tx_sight/angular_velocity_y"},
{"name":"imu_bmi088/imu_visualizer/tx_sight/angular_velocity_z"}
]
}
}
}'
- type: nvidia::gxf::PeriodicSchedulingTerm
parameters:
recess_period: 200Hz
---
components:
- type: nvidia::gxf::Connection
parameters:
source: bmi088_imu_combined/tx_imu
target: imu_visualizer/rx_imu
---
components:
- name: clock
type: nvidia::gxf::RealtimeClock
parameters:
use_time_since_epoch: true
- type: nvidia::gxf::MultiThreadScheduler
parameters:
clock: clock
worker_thread_number: 4
check_recession_period_ms: 1
- type: nvidia::gxf::JobStatistics
parameters:
clock: clock