ros2_rmp/config/caddy/content/bootstrap/webui.js

139 lines
4.4 KiB
JavaScript

// Begin by creating some global variables:
var twist;
var cmdVel;
var publishImmidiately = true;
var robot_IP;
var manager;
var teleop;
var ros;
// Write a function to send ROS messages with velocity for robot:
function moveAction(linear, angular) {
if (linear !== undefined && angular !== undefined) {
twist.linear.x = linear;
twist.angular.z = angular;
} else {
twist.linear.x = 0;
twist.angular.z = 0;
}
cmdVel.publish(twist);
}
// Write a function to create velocity message publisher:
function initVelocityPublisher() {
// Init message with zero values.
twist = new ROSLIB.Message({
linear: {
x: 0,
y: 0,
z: 0
},
angular: {
x: 0,
y: 0,
z: 0
}
});
// Init topic object
cmdVel = new ROSLIB.Topic({
ros: ros,
name: '/cmd_vel',
messageType: 'geometry_msgs/Twist'
});
// Register publisher within ROS system
cmdVel.advertise();
}
// Write a function to create keyboard controller object:
function initTeleopKeyboard() {
// Use w, s, a, d keys to drive your robot
// Check if keyboard controller was aready created
if (teleop == null) {
// Initialize the teleop.
teleop = new KEYBOARDTELEOP.Teleop({
ros: ros,
topic: '/cmd_vel'
});
}
// Add event listener for slider moves
robotSpeedRange = document.getElementById("robot-speed");
robotSpeedRange.oninput = function () {
teleop.scale = robotSpeedRange.value / 100
}
}
// Write a function to create joystick object:
function createJoystick() {
// Check if joystick was aready created
if (manager == null) {
joystickContainer = document.getElementById('joystick');
// joystck configuration, if you want to adjust joystick, refer to:
// https://yoannmoinet.github.io/nipplejs/
var options = {
zone: joystickContainer,
position: { left: 50 + '%', top: 105 + 'px' },
mode: 'static',
size: 200,
color: '#0066ff',
restJoystick: true
};
manager = nipplejs.create(options);
// event listener for joystick move
manager.on('move', function (evt, nipple) {
// nipplejs returns direction is screen coordiantes
// we need to rotate it, that dragging towards screen top will move robot forward
var direction = nipple.angle.degree - 90;
if (direction > 180) {
direction = -(450 - nipple.angle.degree);
}
// convert angles to radians and scale linear and angular speed
// adjust if youwant robot to drvie faster or slower
var lin = Math.cos(direction / 57.29) * nipple.distance * 0.005;
var ang = Math.sin(direction / 57.29) * nipple.distance * 0.05;
// nipplejs is triggering events when joystic moves each pixel
// we need delay between consecutive messege publications to
// prevent system from being flooded by messages
// events triggered earlier than 50ms after last publication will be dropped
if (publishImmidiately) {
publishImmidiately = false;
moveAction(lin, ang);
setTimeout(function () {
publishImmidiately = true;
}, 50);
}
});
// event litener for joystick release, always send stop message
manager.on('end', function () {
moveAction(0, 0);
});
}
}
// …and finally main app initialization:
window.onload = function () {
// determine robot address automatically
// robot_IP = location.hostname;
// set robot address statically
robot_IP = "100.105.121.16";
// // Init handle for rosbridge_websocket
ros = new ROSLIB.Ros({
url: "ws://" + robot_IP + ":9090"
});
initVelocityPublisher();
// get handle for video placeholder
video = document.getElementById('video');
// Populate video source
video.src = "http://" + robot_IP + ":8080/stream?topic=/camera/rgb/image_raw&type=mjpeg&quality=80";
video.onload = function () {
// joystick and keyboard controls will be available only when video is correctly loaded
createJoystick();
initTeleopKeyboard();
};
}