1 /**************************************************************************** 2 * 3 * ViSP, open source Visual Servoing Platform software. 4 * Copyright (C) 2005 - 2019 by Inria. All rights reserved. 5 * 6 * This software is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * See the file LICENSE.txt at the root directory of this source 11 * distribution for additional information about the GNU GPL. 12 * 13 * For using ViSP with software that can not be combined with the GNU 14 * GPL, please contact Inria about acquiring a ViSP Professional 15 * Edition License. 16 * 17 * See http://visp.inria.fr for more information. 18 * 19 * This software was developed at: 20 * Inria Rennes - Bretagne Atlantique 21 * Campus Universitaire de Beaulieu 22 * 35042 Rennes Cedex 23 * France 24 * 25 * If you have questions regarding the use of this file, please contact 26 * Inria at visp@inria.fr 27 * 28 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 29 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 30 * 31 * Description: 32 * Interface for Flir Ptu Cpi robot. 33 * 34 * Authors: 35 * Fabien Spindler 36 * 37 *****************************************************************************/ 38 39 #ifndef vpRobotFlirPtu_h 40 #define vpRobotFlirPtu_h 41 42 /*! 43 \file vpRobotFlirPtu.h 44 Interface for Flir Ptu Cpi robot. 45 */ 46 47 #include <visp3/core/vpConfig.h> 48 49 #ifdef VISP_HAVE_FLIR_PTU_SDK 50 51 #include <visp3/core/vpHomogeneousMatrix.h> 52 #include <visp3/robot/vpRobot.h> 53 #include <visp3/robot/vpRobotException.h> 54 55 /*! 56 \class vpRobotFlirPtu 57 \ingroup group_robot_real_arm 58 Interface for FLIR pan-tilt units compatible with FLIR PTU-SDK. 59 60 \note We strongly recommend to communicate with the PTU using network interface. We experienced communication issues 61 using serial communication. 62 63 \warning On Unix-like OS, if you experienced the following error when running servoFlirPtu.cpp: 64 \code 65 Failed to open /dev/ttyUSB0: Permission denied. 66 \endcode 67 1. Add users to the "dialout" group: 68 \code 69 $ sudo adduser <username> dialout 70 \endcode 71 2. Reboot 72 73 \warning Again on Unix-like OS, if you experienced the following error during ViSP build: 74 \code 75 <your path>/sdk-x.y.z/libcpi.a(cerial.o): relocation R_X86_64_PC32 against symbol `serposix' can not be used when 76 making a shared object; recompile with -fPIC \endcode 77 1. Enter FLIR PTU SDK folder and modify `config.mk` to add `-fPIC` build flag 78 \code 79 $ cat <your path>/sdk-x.y.y/config.mk 80 CFLAGS=-g -Wall -Werror -DLITTLE_ENDIAN -O2 -fPIC 81 \endcode 82 2. Rebuild PTU-SDK 83 \code 84 $ cd <your path>/sdk-x.y.y 85 $ make clean 86 $ make 87 \endcode 88 3. Rebuild ViSP 89 \code 90 $ cd $VISP_WS/visp-build 91 $ make -j4 92 \endcode 93 94 \sa \ref tutorial-flir-ptu-vs 95 */ 96 class VISP_EXPORT vpRobotFlirPtu : public vpRobot 97 { 98 public: 99 vpRobotFlirPtu(); 100 virtual ~vpRobotFlirPtu(); 101 102 void connect(const std::string &portname, int baudrate = 9600); 103 void disconnect(); 104 105 void get_eJe(vpMatrix &eJe); 106 vpMatrix get_eJe(); 107 void get_fJe(vpMatrix &fJe); 108 vpMatrix get_fJe(); 109 vpMatrix get_fMe(); 110 111 /*! 112 Return constant transformation between end-effector and tool frame. 113 If your tool is a camera, this transformation is obtained by hand-eye calibration. 114 */ get_eMc()115 vpHomogeneousMatrix get_eMc() const { return m_eMc; } 116 vpVelocityTwistMatrix get_cVe() const; 117 118 void getDisplacement(const vpRobot::vpControlFrameType frame, vpColVector &q); 119 120 std::string getNetworkIP(); 121 std::string getNetworkGateway(); 122 std::string getNetworkHostName(); 123 124 void getPosition(const vpRobot::vpControlFrameType frame, vpColVector &q); 125 vpColVector getPanPosLimits(); 126 vpColVector getTiltPosLimits(); 127 vpColVector getPanTiltVelMax(); 128 129 void reset(); 130 131 /*! 132 Set constant transformation between end-effector and tool frame. 133 If your tool is a camera, this transformation is obtained by hand-eye calibration. 134 */ set_eMc(vpHomogeneousMatrix & eMc)135 void set_eMc(vpHomogeneousMatrix &eMc) { m_eMc = eMc; } 136 void setPosition(const vpRobot::vpControlFrameType frame, const vpColVector &q); 137 void setPanPosLimits(const vpColVector &pan_limits); 138 void setTiltPosLimits(const vpColVector &tilt_limits); 139 140 void setPositioningVelocity(double velocity); 141 vpRobot::vpRobotStateType setRobotState(vpRobot::vpRobotStateType newState); 142 void setVelocity(const vpRobot::vpControlFrameType frame, const vpColVector &vel); 143 void stopMotion(); 144 145 static void emergencyStop(int signo); 146 147 protected: 148 void init(); 149 void getLimits(); 150 void getJointPosition(vpColVector &q); 151 void setCartVelocity(const vpRobot::vpControlFrameType frame, const vpColVector &v); 152 void setJointVelocity(const vpColVector &qdot); 153 154 private: 155 double tics2deg(int axis, int tics); 156 double tics2rad(int axis, int tics); 157 int rad2tics(int axis, double rad); 158 159 protected: 160 vpHomogeneousMatrix m_eMc; //!< Constant transformation between end-effector and tool (or camera) frame 161 162 struct cerial *m_cer; 163 uint16_t m_status; 164 std::vector<int> m_pos_max_tics; //!< Pan min/max position in robot tics unit 165 std::vector<int> m_pos_min_tics; //!< Tilt min/max position in robot tics unit 166 std::vector<int> m_vel_max_tics; //!< Pan/tilt max velocity in robot tics unit 167 std::vector<double> m_res; //!< Pan/tilt tic resolution in deg 168 bool m_connected; 169 int m_njoints; 170 double m_positioning_velocity; 171 }; 172 173 #endif 174 #endif 175