Platform Interface

Bridges from Gemini to ROS are made available to teams, and we therefore recommend teams to base their guidance systems on ROS. Teams are welcome to use other systems or frameworks, however they will need to supply interfaces to Gemini themselves.

Sensor input

The following data is made available to teams:

  • 4 Optical cameras

  • 1 Lidar

  • GPS Position

  • Vessel Heading

  • Vessel velocities in 3 degrees of freedom

Optical Cameras

The vessel is equipped with 4 identical optical cameras, mounted on the sensor rig on top of the vessel. They are oriented such that one camera faces directly forward, one behind, and one either side of the vessel. Specifications:

  • Field of view: 100 degrees

  • Framerate: 3 frames per second

  • Resolution: 1920x1080

The optical cameras are published in ROS as /optical messages. The full topic names are:

  • /optical/Front/image_raw

  • /optical/Starboard/image_raw

  • /optical/Back/image_raw

  • /optical/Port/image_raw

If the simulation is running slowly, the image resolution can be lowered by increasing the 'Image Crop' parameter in each camera object in the Unity editor.

Lidar

The lidar data is published in ROS as a /velodyne_points topic. To view the point cloud in rviz, remember to change the fixed frame parameter from 'map' to 'velodyne'.

Position and Velocity data

Positional and velocity data are published on the /nav/pose and /nav/twist topics.

In the /nav/pose positions messages, 'x' is the latitude coordinate, 'y' is the longitude coordinate and 'z' is the heading of the vessel in degrees (measured clockwise with 0 degrees facing north). The orientation messages contain the vessel's rotation in quaternions.

The /nav/twist linear messages contain the vessel's linear velocities in the body-fixed frame, measured in meters per second. The angular messages contain the vessel's angular velocity, measured in radians per second.

Control output

To control the vessel, guidance systems will be expected to continuously output a vector of 3 forces, in surge (forward/backward), sway (lateral) and yaw.

The example_ros_client node is published to the /force_control topic and expects 'GeneralizedForce' messages. The message is built up of 3 forces, one for ech translational degree of freedom, as well as 3 torques, for each rotational degree of freedom:

GeneralizedForce(
        x = force.x,
        y = force.y,
        z = force.z,
        k = force.k,
        m = force.m,
        n = force.n,
    )

As the vessel is only actuated in 3 degrees of freedom (x, y and n), the remaining 3 forces (z, k and m) are ignored and should be set to 0.

The force controller accepts inputs between -100 and 100, where 100 results in full throttle. Larger inputs will be constrained back down to ±100.

The force controller can be tested by opening a terminal window in the virtual machine and tweaking the values in the following command:

source catkin_ws/devel/setup.bash

rostopic pub /force_control ros_clients/GeneralizedForce "{x: 0.0 , y: 0.0 , z: 0.0 , k: 0.0 , m: 0.0 , n: 0.0}"

This method will continuously apply the requested force until the command is canceled (ctrl+c) and run again with different values.

Last updated