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