Last active
May 31, 2020 22:03
-
-
Save abhayraw1/6eb565ff582b228573c61b64d8f50964 to your computer and use it in GitHub Desktop.
TeleOperation (using mouse) Plugin for RosSharp. Add to the RosConnector Object. Inputs are the topic name, camera, a prefab for pointer and the base link of the robot.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class ShowMousePosition : MonoBehaviour | |
{ | |
public GameObject mousePointer; | |
public bool clipToInteger; | |
public Camera cam; | |
private bool active = true; | |
// Start is called before the first frame update | |
void Start() | |
{ | |
mousePointer = Instantiate(mousePointer, new Vector3(), Quaternion.identity); | |
} | |
// Update is called once per frame | |
public void Update() | |
{ | |
if(active) { | |
mousePointer.transform.position = getPointerPosition(); | |
} | |
} | |
public Vector3 getPointerPosition() | |
{ | |
if (clipToInteger) | |
return snapPosition(getWorldPoint()); | |
else | |
return getWorldPoint(); | |
} | |
public Vector3 getWorldPoint() | |
{ | |
Ray ray = cam.ScreenPointToRay(Input.mousePosition); | |
RaycastHit hit; | |
if (Physics.Raycast(ray, out hit)) | |
{ | |
return hit.point; | |
} | |
return Vector3.zero; | |
} | |
public Vector3 snapPosition(Vector3 original) | |
{ | |
Vector3 snapped; | |
snapped.x = Mathf.Floor(original.x + 0.5f); | |
snapped.y = Mathf.Floor(original.y + 0.5f); | |
snapped.z = Mathf.Floor(original.z + 0.5f); | |
return snapped; | |
} | |
public void Deactivate() | |
{ | |
active = false; | |
HidePointer(); | |
} | |
public void Activate() | |
{ | |
active = true; | |
ShowPointer(); | |
} | |
private void ShowPointer() | |
{ | |
mousePointer.active = true; | |
} | |
private void HidePointer() | |
{ | |
mousePointer.active = false; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
namespace RosSharp.RosBridgeClient | |
{ | |
public class TeleOperator : UnityPublisher<MessageTypes.Geometry.Twist> | |
{ | |
public Camera cam; | |
public GameObject mousePointer; | |
public Transform baseLink; | |
private ShowMousePosition mousePosition; | |
private MessageTypes.Geometry.Twist message; | |
private bool active; | |
public void Deactivate() | |
{ | |
active = false; | |
mousePosition.Deactivate(); | |
} | |
public void Activate() | |
{ | |
active = true; | |
mousePosition.Activate(); | |
} | |
// Start is called before the first frame update | |
protected override void Start() | |
{ | |
base.Start(); | |
InitializeMessage(); | |
mousePosition = cam.gameObject.AddComponent<ShowMousePosition>(); | |
mousePosition.cam = cam; | |
mousePosition.mousePointer = mousePointer; | |
Deactivate(); | |
} | |
public void Update() | |
{ | |
if (Input.GetMouseButtonDown(0)) { | |
Activate(); | |
} | |
if (Input.GetMouseButtonUp(0)) { | |
Deactivate(); | |
} | |
} | |
// Update is called once per frame | |
private void FixedUpdate() | |
{ | |
if (active) { | |
UpdateMessage(); | |
} else { | |
message.linear = GetGeometryVector3(new Vector3()); | |
message.angular = GetGeometryVector3(new Vector3()); | |
Publish(message); | |
} | |
} | |
private void UpdateMessage() | |
{ | |
Vector3 currPose = baseLink.position.Unity2Ros(); | |
Vector3 localGoalPose = baseLink.InverseTransformPoint( | |
mousePosition.getPointerPosition() | |
).Unity2Ros(); | |
localGoalPose[2] = 0; | |
float distance = localGoalPose.sqrMagnitude; | |
float linearVel = Mathf.Clamp(0.15f * distance, -0.1f, 0.3f); | |
float angularVel = Mathf.Clamp( | |
Mathf.Atan2(localGoalPose[1], localGoalPose[0])*Mathf.Rad2Deg, | |
-45, 45 | |
); | |
message.linear = GetGeometryVector3(new Vector3(linearVel, 0, 0)); | |
message.angular = GetGeometryVector3(new Vector3(0, 0, angularVel)); | |
Publish(message); | |
} | |
private void InitializeMessage() | |
{ | |
message = new MessageTypes.Geometry.Twist(); | |
message.linear = new MessageTypes.Geometry.Vector3(); | |
message.angular = new MessageTypes.Geometry.Vector3(); | |
} | |
private static MessageTypes.Geometry.Vector3 GetGeometryVector3(Vector3 vector3) | |
{ | |
MessageTypes.Geometry.Vector3 geometryVector3 = new MessageTypes.Geometry.Vector3(); | |
geometryVector3.x = vector3.x; | |
geometryVector3.y = vector3.y; | |
geometryVector3.z = vector3.z; | |
return geometryVector3; | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment