Skip to content

Commit 0d5ba24

Browse files
committed
hulk_mujoco: impl RGBDSensorsInterface
1 parent 748ff3e commit 0d5ba24

File tree

11 files changed

+100
-37
lines changed

11 files changed

+100
-37
lines changed

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ members = [
4242
"crates/projection",
4343
"crates/ransac",
4444
"crates/repository",
45-
"crates/ros2",
45+
"crates/ros2",
46+
"crates/simulation-message",
4647
"crates/source_analyzer",
4748
"crates/spl_network",
4849
"crates/spl_network_messages",
@@ -215,6 +216,7 @@ serde_json = "1.0.138"
215216
serde_test = "1.0.177"
216217
sha2 = "0.10.8"
217218
simba = "0.9.0"
219+
simulation-message = { path = "crates/simulation-message" }
218220
smallvec = "1.14.0"
219221
source_analyzer = { path = "crates/source_analyzer" }
220222
spl_network = { path = "crates/spl_network" }

crates/hardware/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ color-eyre = { workspace = true }
1111
hula_types = { workspace = true }
1212
ros2 = { workspace = true }
1313
simulation-message = { workspace = true }
14-
types = { workspace = true }
14+
types = { workspace = true }
15+
zed = { workspace = true }

crates/hardware/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use types::{
1616
sensor_data::SensorData,
1717
ycbcr422_image::YCbCr422Image,
1818
};
19+
use zed::RGBDSensors;
1920

2021
pub trait ActuatorInterface {
2122
fn write_to_actuators(
@@ -77,6 +78,10 @@ pub trait TransformStampedInterface {
7778
fn read_transform_stamped(&self) -> Result<SimulationMessage<TransformStamped>>;
7879
}
7980

81+
pub trait RGBDSensorsInterface {
82+
fn read_rgbd_sensors(&self) -> Result<SimulationMessage<RGBDSensors>>;
83+
}
84+
8085
pub trait SpeakerInterface {
8186
fn write_to_speakers(&self, request: SpeakerRequest);
8287
}

crates/hulk_mujoco/src/hardware_interface.rs

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use color_eyre::Result;
88
use futures_util::SinkExt;
99
use futures_util::StreamExt;
1010
use hardware::{
11-
ButtonEventMsgInterface, CameraInterface, IdInterface, MicrophoneInterface, NetworkInterface,
12-
PathsInterface, RecordingInterface, SpeakerInterface, TimeInterface,
11+
ButtonEventMsgInterface, IdInterface, MicrophoneInterface, NetworkInterface, PathsInterface,
12+
RGBDSensorsInterface, RecordingInterface, SpeakerInterface, TimeInterface,
1313
};
1414
use hardware::{
1515
FallDownStateInterface, LowCommandInterface, LowStateInterface, RemoteControllerStateInterface,
@@ -29,10 +29,9 @@ use tokio::{
2929
use tokio_tungstenite::tungstenite::Message;
3030
use tokio_util::sync::CancellationToken;
3131
use types::audio::SpeakerRequest;
32-
use types::camera_position::CameraPosition;
3332
use types::messages::{IncomingMessage, OutgoingMessage};
3433
use types::samples::Samples;
35-
use types::ycbcr422_image::YCbCr422Image;
34+
use zed::RGBDSensors;
3635

3736
use crate::HardwareInterface;
3837

@@ -45,6 +44,7 @@ struct WorkerChannels {
4544
button_event_msg_sender: Sender<SimulationMessage<ButtonEventMsg>>,
4645
remote_controller_state_sender: Sender<SimulationMessage<RemoteControllerState>>,
4746
transform_stamped_sender: Sender<SimulationMessage<TransformStamped>>,
47+
rgbd_sensors_sender: Sender<SimulationMessage<RGBDSensors>>,
4848
}
4949

5050
#[derive(Clone, Debug, Deserialize)]
@@ -68,6 +68,7 @@ pub struct MujocoHardwareInterface {
6868
button_event_msg_receiver: Mutex<Receiver<SimulationMessage<ButtonEventMsg>>>,
6969
remote_controller_state_receiver: Mutex<Receiver<SimulationMessage<RemoteControllerState>>>,
7070
transform_stamped_receiver: Mutex<Receiver<SimulationMessage<TransformStamped>>>,
71+
rgbd_sensors_receiver: Mutex<Receiver<SimulationMessage<RGBDSensors>>>,
7172
}
7273

7374
impl MujocoHardwareInterface {
@@ -84,6 +85,7 @@ impl MujocoHardwareInterface {
8485
let (remote_controller_state_sender, remote_controller_state_receiver) =
8586
channel(CHANNEL_CAPACITY);
8687
let (transform_stamped_sender, transform_stamped_receiver) = channel(CHANNEL_CAPACITY);
88+
let (rgbd_sensors_sender, rgbd_sensors_receiver) = channel(CHANNEL_CAPACITY);
8789

8890
let worker_channels = WorkerChannels {
8991
low_state_sender,
@@ -92,6 +94,7 @@ impl MujocoHardwareInterface {
9294
button_event_msg_sender,
9395
remote_controller_state_sender,
9496
transform_stamped_sender,
97+
rgbd_sensors_sender,
9598
};
9699

97100
let time = Arc::new(Mutex::new(SystemTime::UNIX_EPOCH));
@@ -118,6 +121,7 @@ impl MujocoHardwareInterface {
118121
button_event_msg_receiver: Mutex::new(button_event_msg_receiver),
119122
remote_controller_state_receiver: Mutex::new(remote_controller_state_receiver),
120123
transform_stamped_receiver: Mutex::new(transform_stamped_receiver),
124+
rgbd_sensors_receiver: Mutex::new(rgbd_sensors_receiver),
121125
})
122126
}
123127
}
@@ -221,9 +225,15 @@ async fn handle_message(
221225
.await?
222226
}
223227
SimulationMessage {
224-
payload: ServerMessageKind::RGBDSensors(_),
225-
..
226-
} => todo!(),
228+
payload: ServerMessageKind::RGBDSensors(rgbd_sensors),
229+
time,
230+
} => {
231+
*hardware_interface_time.lock() = time;
232+
worker_channels
233+
.rgbd_sensors_sender
234+
.send(SimulationMessage::new(time, rgbd_sensors))
235+
.await?
236+
}
227237
};
228238

229239
Ok(())
@@ -234,15 +244,15 @@ impl LowStateInterface for MujocoHardwareInterface {
234244
self.low_state_receiver
235245
.lock()
236246
.blocking_recv()
237-
.ok_or_eyre("channel closed")
247+
.ok_or_eyre("low state channel closed")
238248
}
239249
}
240250

241251
impl LowCommandInterface for MujocoHardwareInterface {
242252
fn write_low_command(&self, low_command: LowCommand) -> Result<()> {
243253
self.low_command_sender
244254
.blocking_send(low_command)
245-
.wrap_err("send error")
255+
.wrap_err("low command send error")
246256
}
247257
}
248258

@@ -251,7 +261,7 @@ impl FallDownStateInterface for MujocoHardwareInterface {
251261
self.fall_down_receiver
252262
.lock()
253263
.blocking_recv()
254-
.ok_or_eyre("channel closed")
264+
.ok_or_eyre("fall down state channel closed")
255265
}
256266
}
257267

@@ -260,7 +270,7 @@ impl ButtonEventMsgInterface for MujocoHardwareInterface {
260270
self.button_event_msg_receiver
261271
.lock()
262272
.blocking_recv()
263-
.ok_or_eyre("channel closed")
273+
.ok_or_eyre("button event msg channel closed")
264274
}
265275
}
266276

@@ -282,6 +292,15 @@ impl TransformStampedInterface for MujocoHardwareInterface {
282292
}
283293
}
284294

295+
impl RGBDSensorsInterface for MujocoHardwareInterface {
296+
fn read_rgbd_sensors(&self) -> Result<SimulationMessage<RGBDSensors>> {
297+
self.rgbd_sensors_receiver
298+
.lock()
299+
.blocking_recv()
300+
.ok_or_eyre("channel closed")
301+
}
302+
}
303+
285304
impl TimeInterface for MujocoHardwareInterface {
286305
fn get_now(&self) -> SystemTime {
287306
*self.time.lock()
@@ -348,10 +367,4 @@ impl RecordingInterface for MujocoHardwareInterface {
348367
}
349368
}
350369

351-
impl CameraInterface for MujocoHardwareInterface {
352-
fn read_from_camera(&self, camera_position: CameraPosition) -> Result<YCbCr422Image> {
353-
Ok(YCbCr422Image::default())
354-
}
355-
}
356-
357370
impl HardwareInterface for MujocoHardwareInterface {}

crates/hulk_mujoco/src/main.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use color_eyre::{
88
use ctrlc::set_handler;
99
use framework::Parameters as FrameworkParameters;
1010
use hardware::{
11-
CameraInterface, IdInterface, LowCommandInterface, LowStateInterface, MicrophoneInterface,
12-
NetworkInterface, PathsInterface, RecordingInterface, SpeakerInterface, TimeInterface,
11+
IdInterface, LowCommandInterface, LowStateInterface, MicrophoneInterface, NetworkInterface,
12+
PathsInterface, RGBDSensorsInterface, RecordingInterface, SpeakerInterface, TimeInterface,
1313
};
1414
use hula_types::hardware::Ids;
1515
use serde_json::from_reader;
@@ -38,10 +38,10 @@ pub fn setup_logger() -> Result<(), fern::InitError> {
3838
}
3939

4040
pub trait HardwareInterface:
41-
CameraInterface
42-
+ IdInterface
41+
IdInterface
4342
+ LowStateInterface
4443
+ LowCommandInterface
44+
+ RGBDSensorsInterface
4545
+ MicrophoneInterface
4646
+ NetworkInterface
4747
+ PathsInterface

crates/types/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ nalgebra = { workspace = true }
1818
num-traits = { workspace = true }
1919
ordered-float = { workspace = true }
2020
path_serde = { workspace = true }
21+
ros2 = { workspace = true }
2122
serde = { workspace = true }
2223
spl_network_messages = { workspace = true }
23-
splines = { workspace = true }
24+
splines = { workspace = true }

crates/types/src/ycbcr422_image.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ use crate::{
1818
color::{Rgb, YCbCr422, YCbCr444},
1919
jpeg::JpegImage,
2020
};
21+
use ros2::sensor_msgs::image::Image as Ros2Image;
2122

2223
pub const SAMPLE_SIZE: usize = 32;
2324

@@ -109,6 +110,42 @@ impl From<YCbCr422Image> for RgbImage {
109110
}
110111
}
111112

113+
impl From<&Ros2Image> for YCbCr422Image {
114+
fn from(ros2_image: &Ros2Image) -> Self {
115+
let width_422 = ros2_image.width / 2;
116+
let height = ros2_image.height;
117+
118+
let data = match ros2_image.encoding.as_str() {
119+
"rgb8" => ros2_image
120+
.data
121+
.chunks(6)
122+
.map(|pixel| {
123+
let left_color: YCbCr444 = Rgb {
124+
red: pixel[0],
125+
green: pixel[1],
126+
blue: pixel[2],
127+
}
128+
.into();
129+
let right_color: YCbCr444 = Rgb {
130+
red: pixel[3],
131+
green: pixel[4],
132+
blue: pixel[5],
133+
}
134+
.into();
135+
[left_color, right_color].into()
136+
})
137+
.collect(),
138+
_ => unimplemented!("image encoding not supported"),
139+
};
140+
141+
Self {
142+
width_422,
143+
height,
144+
buffer: Arc::new(data),
145+
}
146+
}
147+
}
148+
112149
impl YCbCr422Image {
113150
pub fn zero(width: u32, height: u32) -> Self {
114151
assert!(

crates/vision/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ rand = { workspace = true }
2626
rand_chacha = { workspace = true }
2727
ransac = { workspace = true }
2828
serde = { workspace = true }
29+
simulation-message = { workspace = true }
2930
types = { workspace = true }

crates/vision/src/image_receiver.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ use std::time::SystemTime;
33
use color_eyre::Result;
44
use context_attribute::context;
55
use framework::MainOutput;
6-
use hardware::{CameraInterface, TimeInterface};
6+
use hardware::{RGBDSensorsInterface, TimeInterface};
77
use serde::{Deserialize, Serialize};
8+
use simulation_message::SimulationMessage;
89
use types::{
910
camera_position::CameraPosition, cycle_time::CycleTime, ycbcr422_image::YCbCr422Image,
1011
};
@@ -38,11 +39,10 @@ impl ImageReceiver {
3839

3940
pub fn cycle(
4041
&mut self,
41-
context: CycleContext<impl CameraInterface + TimeInterface>,
42+
context: CycleContext<impl RGBDSensorsInterface + TimeInterface>,
4243
) -> Result<MainOutputs> {
43-
let image = context
44-
.hardware_interface
45-
.read_from_camera(*context.camera_position)?;
44+
let SimulationMessage { payload, .. } = context.hardware_interface.read_rgbd_sensors()?;
45+
let ycbcr422_image: YCbCr422Image = (&payload.rgb).into();
4646

4747
let now = context.hardware_interface.get_now();
4848
let cycle_time = CycleTime {
@@ -54,7 +54,7 @@ impl ImageReceiver {
5454
self.last_cycle_start = now;
5555

5656
Ok(MainOutputs {
57-
image: image.into(),
57+
image: ycbcr422_image.into(),
5858
cycle_time: cycle_time.into(),
5959
})
6060
}

0 commit comments

Comments
 (0)