openrr-remote 0.1.0

Remote execution support for arci
Documentation
use openrr_remote::{
    RemoteGamepadReceiver, RemoteJointTrajectoryClientReceiver, RemoteLocalizationReceiver,
    RemoteMoveBaseReceiver, RemoteNavigationReceiver, RemoteSpeakerReceiver,
    RemoteTransformResolverReceiver,
};

#[derive(Default)]
struct DebugJointTrajectoryClient {}

impl arci::JointTrajectoryClient for DebugJointTrajectoryClient {
    fn joint_names(&self) -> Vec<String> {
        println!("Server received JointTrajectoryClient::joint_names");
        vec!["a".into(), "b".into()]
    }

    fn current_joint_positions(&self) -> Result<Vec<f64>, arci::Error> {
        println!("Server received JointTrajectoryClient::current_joint_positions");
        Ok(vec![0.0, 0.0])
    }

    fn send_joint_positions(
        &self,
        positions: Vec<f64>,
        duration: std::time::Duration,
    ) -> Result<arci::WaitFuture, arci::Error> {
        println!(
            "Server received JointTrajectoryClient::send_joint_positions (position: {positions:?}, duration: {duration:?})",
        );
        Ok(arci::WaitFuture::ready())
    }

    fn send_joint_trajectory(
        &self,
        trajectory: Vec<arci::TrajectoryPoint>,
    ) -> Result<arci::WaitFuture, arci::Error> {
        println!(
            "Server received JointTrajectoryClient::send_joint_trajectory (trajectory: {trajectory:?})"
        );
        Ok(arci::WaitFuture::ready())
    }
}

#[derive(Default)]
struct DebugSpeaker {}

impl arci::Speaker for DebugSpeaker {
    fn speak(&self, message: &str) -> Result<arci::WaitFuture, arci::Error> {
        println!("Server received Speaker::speak (message: {message:?})");
        Ok(arci::WaitFuture::ready())
    }
}

#[derive(Default)]
struct DebugMoveBase {}

impl arci::MoveBase for DebugMoveBase {
    fn send_velocity(&self, velocity: &arci::BaseVelocity) -> Result<(), arci::Error> {
        println!("Server received MoveBase::send_velocity (velocity: {velocity:?})");
        Ok(())
    }

    fn current_velocity(&self) -> Result<arci::BaseVelocity, arci::Error> {
        println!("Server received MoveBase::current_velocity");
        Ok(arci::BaseVelocity::default())
    }
}

#[derive(Default)]
struct DebugNavigation {}

impl arci::Navigation for DebugNavigation {
    fn send_goal_pose(
        &self,
        goal: arci::Isometry2<f64>,
        frame_id: &str,
        timeout: std::time::Duration,
    ) -> Result<arci::WaitFuture, arci::Error> {
        println!(
            "Server received Navigation::send_goal_pose (goal: {goal:?}, frame_id: {frame_id:?}, timeout: {timeout:?})"
        );
        Ok(arci::WaitFuture::ready())
    }

    fn cancel(&self) -> Result<(), arci::Error> {
        println!("Server received Navigation::cancel");
        Ok(())
    }
}

#[derive(Default)]
struct DebugLocalization {}

impl arci::Localization for DebugLocalization {
    fn current_pose(&self, frame_id: &str) -> Result<arci::Isometry2<f64>, arci::Error> {
        println!("Server received Localization::current_pose (frame_id: {frame_id:?})");
        Ok(arci::Isometry2::new(arci::Vector2::new(0.0, 0.0), 0.0))
    }
}

#[derive(Default)]
struct DebugTransformResolver {}

impl arci::TransformResolver for DebugTransformResolver {
    fn resolve_transformation(
        &self,
        from: &str,
        to: &str,
        time: std::time::SystemTime,
    ) -> Result<arci::Isometry3<f64>, arci::Error> {
        println!(
            "Server received TransformResolver::resolve_transformation (from: {from:?}, to: {to:?}, time: {time:?})",
        );
        Ok(arci::Isometry3::new(
            arci::Vector3::new(0.0, 0.0, 0.0),
            arci::Vector3::new(0.0, 0.0, 0.0),
        ))
    }
}

#[derive(Default)]
struct DebugGamepad {}

#[arci::async_trait]
impl arci::Gamepad for DebugGamepad {
    async fn next_event(&self) -> arci::gamepad::GamepadEvent {
        println!("Server received Gamepad::next_event",);
        arci::gamepad::GamepadEvent::Unknown
    }

    fn stop(&self) {
        println!("Server received Gamepad::stop");
    }
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let addr = "[::1]:50051".parse()?;
    println!("Server listening on {addr}");

    let client = RemoteJointTrajectoryClientReceiver::new(DebugJointTrajectoryClient::default());
    let speaker = RemoteSpeakerReceiver::new(DebugSpeaker::default());
    let base = RemoteMoveBaseReceiver::new(DebugMoveBase::default());
    let nav = RemoteNavigationReceiver::new(DebugNavigation::default());
    let loc = RemoteLocalizationReceiver::new(DebugLocalization::default());
    let resolver = RemoteTransformResolverReceiver::new(DebugTransformResolver::default());
    let gamepad = RemoteGamepadReceiver::new(DebugGamepad::default());

    tonic::transport::Server::builder()
        .add_service(client.into_service())
        .add_service(speaker.into_service())
        .add_service(base.into_service())
        .add_service(nav.into_service())
        .add_service(loc.into_service())
        .add_service(resolver.into_service())
        .add_service(gamepad.into_service())
        .serve(addr)
        .await?;

    Ok(())
}