Add code server java
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
Создайте свой пакет в Sunrise Workbench под названием `ros`
|
||||||
|
Или в `.java` файлах измините первую строчку: `package ros;` на название своего пакета
|
||||||
|
|
||||||
|
ServerFriV1.java - тестовая версия работы с коллаборативным роботом, с подключенной FRI
|
||||||
@@ -0,0 +1,318 @@
|
|||||||
|
package ros;
|
||||||
|
|
||||||
|
import static com.kuka.roboticsAPI.motionModel.BasicMotions.ptpHome;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import com.kuka.common.ThreadUtil;
|
||||||
|
import com.kuka.connectivity.fastRobotInterface.ClientCommandMode;
|
||||||
|
import com.kuka.connectivity.fastRobotInterface.FRIConfiguration;
|
||||||
|
import com.kuka.connectivity.fastRobotInterface.FRIJointOverlay;
|
||||||
|
import com.kuka.connectivity.fastRobotInterface.FRISession;
|
||||||
|
import com.kuka.generated.ioAccess.IO_groupIOGroup;
|
||||||
|
import com.kuka.roboticsAPI.applicationModel.RoboticsAPIApplication;
|
||||||
|
import com.kuka.roboticsAPI.controllerModel.Controller;
|
||||||
|
import com.kuka.roboticsAPI.controllerModel.sunrise.ISunriseRequestService;
|
||||||
|
import com.kuka.roboticsAPI.controllerModel.sunrise.api.SSR;
|
||||||
|
import com.kuka.roboticsAPI.controllerModel.sunrise.api.SSRFactory;
|
||||||
|
import com.kuka.roboticsAPI.controllerModel.sunrise.connectionLib.Message;
|
||||||
|
import com.kuka.roboticsAPI.controllerModel.sunrise.positionMastering.PositionMastering;
|
||||||
|
import com.kuka.roboticsAPI.deviceModel.JointPosition;
|
||||||
|
import com.kuka.roboticsAPI.deviceModel.LBR;
|
||||||
|
import com.kuka.roboticsAPI.deviceModel.OperationMode;
|
||||||
|
import com.kuka.roboticsAPI.motionModel.BasicMotions;
|
||||||
|
import com.kuka.roboticsAPI.motionModel.PTP;
|
||||||
|
import com.kuka.roboticsAPI.motionModel.PositionHold;
|
||||||
|
import com.kuka.roboticsAPI.motionModel.controlModeModel.JointImpedanceControlMode;
|
||||||
|
import com.kuka.roboticsAPI.uiModel.ApplicationDialogType;
|
||||||
|
|
||||||
|
|
||||||
|
public class ServerFriV1 extends RoboticsAPIApplication {
|
||||||
|
|
||||||
|
// members
|
||||||
|
private LBR _lbr;
|
||||||
|
private Controller _lbr_controller;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
protected IO_groupIOGroup myMediaFlange;
|
||||||
|
|
||||||
|
// Переменные для калибровки
|
||||||
|
private final static double sideOffset = Math.toRadians(5); // offset in radians for side motion
|
||||||
|
private static double joggingVelocity = 0.2; // relative velocity
|
||||||
|
private final static int axisId[] = {0, 1, 2, 3, 4, 5, 6}; // axes to be referenced
|
||||||
|
private final static int GMS_REFERENCING_COMMAND = 2; // safety command for GMS referencing
|
||||||
|
private final static int COMMAND_SUCCESSFUL = 1;
|
||||||
|
private int positionCounter = 0;
|
||||||
|
|
||||||
|
// Переменные для задавния вопроса
|
||||||
|
private enum CONTROL_MODE {
|
||||||
|
POSITION_CONTROL,
|
||||||
|
JOINT_IMPEDANCE_CONTROL,
|
||||||
|
CARTESIAN_IMPEDANCE_CONTROL;
|
||||||
|
}
|
||||||
|
public static String[] getNames(Class<? extends Enum<?>> e) {
|
||||||
|
return Arrays.toString(e.getEnumConstants()).replaceAll("^.|.$", "").split(", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
// FRI параметры
|
||||||
|
private String _client_name;
|
||||||
|
private int _send_period;
|
||||||
|
private int _calib_id = 0;
|
||||||
|
private JointImpedanceControlMode _control_mode = new JointImpedanceControlMode(1000., 1000., 1000., 1000., 1000., 1000., 1000.);
|
||||||
|
|
||||||
|
// TODO: Не реализовано
|
||||||
|
// private String[] _control_modes = getNames(CONTROL_MODE.class);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private FRIConfiguration _fri_configuration;
|
||||||
|
private FRISession _fri_session;
|
||||||
|
private FRIJointOverlay _fri_overlay;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initialize() {
|
||||||
|
_lbr_controller = (Controller) getContext().getControllers().toArray()[0];
|
||||||
|
_lbr = (LBR) _lbr_controller.getDevices().toArray()[0];
|
||||||
|
|
||||||
|
requestUserConfig();
|
||||||
|
configureFRI();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() throws Exception {
|
||||||
|
PositionHold posHold = new PositionHold(_control_mode, -1, TimeUnit.SECONDS);
|
||||||
|
getLogger().info("Робот готов управлению из ROS2");
|
||||||
|
_lbr.move(posHold.addMotionOverlay(_fri_overlay));
|
||||||
|
|
||||||
|
_fri_session.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Дополнительный функционал
|
||||||
|
|
||||||
|
private void requestUserConfig() {
|
||||||
|
// Время отпраки сообщений
|
||||||
|
String[] _send_periods = {"1", "2", "5", "10"};
|
||||||
|
int id = getApplicationUI().displayModalDialog(ApplicationDialogType.QUESTION,
|
||||||
|
"Выберите желаемый период отправки по сообщений [мс]",
|
||||||
|
_send_periods);
|
||||||
|
_send_period = Integer.valueOf(_send_periods[id]);
|
||||||
|
// _send_period = 10;
|
||||||
|
|
||||||
|
// Выбор сервера
|
||||||
|
HashMap<String, String> _client_names = new HashMap<String, String>() {{
|
||||||
|
put("RNF Server", "192.168.21.1");
|
||||||
|
put("Notebook KONI", "192.170.10.10");
|
||||||
|
put("Notebook", "192.168.21.31");
|
||||||
|
}};
|
||||||
|
ArrayList<String> keyList = new ArrayList<String>(_client_names.keySet());
|
||||||
|
String[] keyArray = keyList.toArray(new String[0]);
|
||||||
|
int id1 = getApplicationUI().displayModalDialog(ApplicationDialogType.QUESTION,
|
||||||
|
"Выберите имя вашего сервера:",
|
||||||
|
keyArray);
|
||||||
|
_client_name = _client_names.get(keyArray[id1]);
|
||||||
|
|
||||||
|
// Привзяка положения датчика
|
||||||
|
// String[] calib_button = {"Нет", "Да"};
|
||||||
|
// _calib_id = getApplicationUI().displayModalDialog(ApplicationDialogType.QUESTION,
|
||||||
|
// "Выполнить калибровку осей?", calib_button);
|
||||||
|
|
||||||
|
// TODO: Добавить режим выбора контроллера
|
||||||
|
}
|
||||||
|
|
||||||
|
private void configureFRI(){
|
||||||
|
_fri_configuration = FRIConfiguration.createRemoteConfiguration(_lbr, _client_name);
|
||||||
|
_fri_configuration.setSendPeriodMilliSec(_send_period);
|
||||||
|
_fri_configuration.registerIO(myMediaFlange.getOutput("Out_3"));
|
||||||
|
_fri_configuration.registerIO(myMediaFlange.getOutput("Out_4"));
|
||||||
|
|
||||||
|
getLogger().info(myMediaFlange.toString());
|
||||||
|
|
||||||
|
|
||||||
|
getLogger().info("Создание подключения FRI к серверу: " + _fri_configuration.getHostName() + " по порту " + _fri_configuration.getPortOnRemote());
|
||||||
|
getLogger().info("Скорость отправки: " + _fri_configuration.getSendPeriodMilliSec() + "мс.");
|
||||||
|
getLogger().info("Скорость получения: " + _fri_configuration.getReceiveMultiplier());
|
||||||
|
|
||||||
|
_fri_session = new FRISession(_fri_configuration);
|
||||||
|
_fri_overlay = new FRIJointOverlay(_fri_session, ClientCommandMode.POSITION);
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
_fri_session.await(10, TimeUnit.SECONDS);
|
||||||
|
|
||||||
|
getLogger().info("Перемещение в стартовое положение...");
|
||||||
|
moveToInitialPosition();
|
||||||
|
|
||||||
|
if (_calib_id == 1) {
|
||||||
|
getLogger().info("Выполняется привязка датчика положения...");
|
||||||
|
calibration_robot();
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch(final TimeoutException e) {
|
||||||
|
getLogger().error(e.getLocalizedMessage());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
getLogger().info("Соединение FRI успешно установлено");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void moveToInitialPosition() {
|
||||||
|
_lbr.move(BasicMotions.batch(
|
||||||
|
BasicMotions.ptp(0., 0., 0., 0., 0., 0., 0.)
|
||||||
|
// TODO: Вернуть перемещение в базовое положение робота
|
||||||
|
// BasicMotions.ptp(0., 0., 0., 0., 0., 0., 0.).setBlendingRel(0.5),
|
||||||
|
// BasicMotions.ptp(0.757818236045123,0.698595725843854,-1.32172941537282,-2.04506898499393,0.456059978288825,-0.53869880645079,0.295750371688418)
|
||||||
|
// BasicMotions.ptp(0., 0., 0., -toRadians(80), 0., toRadians(90), 0)
|
||||||
|
).setJointVelocityRel(0.5));
|
||||||
|
}
|
||||||
|
|
||||||
|
private double toRadians(double angle) {
|
||||||
|
return Math.PI / 180 * angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
void calibration_robot() {
|
||||||
|
|
||||||
|
PositionMastering mastering = new PositionMastering(_lbr);
|
||||||
|
|
||||||
|
boolean allAxesMastered = true;
|
||||||
|
for (int i = 0; i < axisId.length; ++i)
|
||||||
|
{
|
||||||
|
boolean isMastered = mastering.getMasteringInfo("NO_TOOL").getMasteringState(i);
|
||||||
|
if (!isMastered)
|
||||||
|
{
|
||||||
|
getLogger().warn("Axis with axisId " + axisId[i] + " is not mastered, therefore it cannot be referenced");
|
||||||
|
}
|
||||||
|
|
||||||
|
allAxesMastered &= isMastered;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (OperationMode.T1 == _lbr.getOperationMode())
|
||||||
|
{
|
||||||
|
joggingVelocity = 0.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allAxesMastered)
|
||||||
|
{
|
||||||
|
getLogger().info("Perform position and GMS referencing with 5 positions");
|
||||||
|
|
||||||
|
getLogger().info("Moving to home position");
|
||||||
|
_lbr.move(ptpHome().setJointVelocityRel(joggingVelocity));
|
||||||
|
|
||||||
|
|
||||||
|
performMotion(new JointPosition(Math.toRadians(0.0),
|
||||||
|
Math.toRadians(16.18),
|
||||||
|
Math.toRadians(23.04),
|
||||||
|
Math.toRadians(37.35),
|
||||||
|
Math.toRadians(-67.93),
|
||||||
|
Math.toRadians(38.14),
|
||||||
|
Math.toRadians(-2.13)));
|
||||||
|
|
||||||
|
performMotion(new JointPosition(Math.toRadians(18.51),
|
||||||
|
Math.toRadians(9.08),
|
||||||
|
Math.toRadians(-1.90),
|
||||||
|
Math.toRadians(49.58),
|
||||||
|
Math.toRadians(-2.92),
|
||||||
|
Math.toRadians(18.60),
|
||||||
|
Math.toRadians(-31.18)));
|
||||||
|
|
||||||
|
performMotion(new JointPosition(Math.toRadians(-18.53),
|
||||||
|
Math.toRadians(-25.76),
|
||||||
|
Math.toRadians(-47.03),
|
||||||
|
Math.toRadians(-49.55),
|
||||||
|
Math.toRadians(30.76),
|
||||||
|
Math.toRadians(-30.73),
|
||||||
|
Math.toRadians(20.11)));
|
||||||
|
|
||||||
|
performMotion(new JointPosition(Math.toRadians(-48.66),
|
||||||
|
Math.toRadians(24.68),
|
||||||
|
Math.toRadians(-11.52),
|
||||||
|
Math.toRadians(10.48),
|
||||||
|
Math.toRadians(-11.38),
|
||||||
|
Math.toRadians(-20.70),
|
||||||
|
Math.toRadians(20.87)));
|
||||||
|
|
||||||
|
performMotion(new JointPosition(Math.toRadians(9.01),
|
||||||
|
Math.toRadians(-35.00),
|
||||||
|
Math.toRadians(24.72),
|
||||||
|
Math.toRadians(-82.04),
|
||||||
|
Math.toRadians(14.65),
|
||||||
|
Math.toRadians(-29.95),
|
||||||
|
Math.toRadians(1.57)));
|
||||||
|
|
||||||
|
getLogger().info("Moving to home position");
|
||||||
|
_lbr.move(ptpHome().setJointVelocityRel(joggingVelocity));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void performMotion(JointPosition position)
|
||||||
|
{
|
||||||
|
getLogger().info("Moving to position #" + (++positionCounter));
|
||||||
|
|
||||||
|
PTP mainMotion = new PTP(position).setJointVelocityRel(joggingVelocity);
|
||||||
|
_lbr.move(mainMotion);
|
||||||
|
|
||||||
|
getLogger().info("Moving to current position from negative direction");
|
||||||
|
JointPosition position1 = new JointPosition(_lbr.getJointCount());
|
||||||
|
for (int i = 0; i < _lbr.getJointCount(); ++i)
|
||||||
|
{
|
||||||
|
position1.set(i, position.get(i) - sideOffset);
|
||||||
|
}
|
||||||
|
PTP motion1 = new PTP(position1).setJointVelocityRel(joggingVelocity);
|
||||||
|
_lbr.move(motion1);
|
||||||
|
_lbr.move(mainMotion);
|
||||||
|
|
||||||
|
// Wait a little to reduce robot vibration after stop.
|
||||||
|
ThreadUtil.milliSleep(2500);
|
||||||
|
|
||||||
|
// Send the command to safety to trigger the measurement
|
||||||
|
sendSafetyCommand();
|
||||||
|
|
||||||
|
getLogger().info("Moving to current position from positive direction");
|
||||||
|
JointPosition position2 = new JointPosition(_lbr.getJointCount());
|
||||||
|
for (int i = 0; i < _lbr.getJointCount(); ++i)
|
||||||
|
{
|
||||||
|
position2.set(i, position.get(i) + sideOffset);
|
||||||
|
}
|
||||||
|
PTP motion2 = new PTP(position2).setJointVelocityRel(joggingVelocity);
|
||||||
|
_lbr.move(motion2);
|
||||||
|
_lbr.move(mainMotion);
|
||||||
|
|
||||||
|
// Wait a little to reduce robot vibration after stop
|
||||||
|
ThreadUtil.milliSleep(2500);
|
||||||
|
|
||||||
|
// Send the command to safety to trigger the measurement
|
||||||
|
sendSafetyCommand();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendSafetyCommand()
|
||||||
|
{
|
||||||
|
ISunriseRequestService requestService = (ISunriseRequestService) (_lbr_controller.getRequestService());
|
||||||
|
SSR ssr = SSRFactory.createSafetyCommandSSR(GMS_REFERENCING_COMMAND);
|
||||||
|
Message response = requestService.sendSynchronousSSR(ssr);
|
||||||
|
int result = response.getParamInt(0);
|
||||||
|
if (COMMAND_SUCCESSFUL != result)
|
||||||
|
{
|
||||||
|
getLogger().warn("Command did not execute successfully, response = " + result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
// close connection
|
||||||
|
getLogger().info("Disposing FRI session.");
|
||||||
|
_fri_session.close();
|
||||||
|
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user