From cc7842e99d193a6260a5533023d238479e8f0150 Mon Sep 17 00:00:00 2001 From: Thierry Bissem Date: Fri, 24 May 2024 11:43:13 +0200 Subject: [PATCH] Finished the project --- bin/RobotServoing | Bin 0 -> 139256 bytes include/DynamixelHandler.h | 88 ++++++++ include/Kinematics.h | 20 ++ lib/DynamixelHandler.o | Bin 0 -> 87200 bytes lib/Kinematics.o | Bin 0 -> 192440 bytes lib/RobotServoing.o | Bin 0 -> 190768 bytes makefile | 16 +- src/DynamixelHandler.cpp | 407 +++++++++++++++++++++++++++++++++++++ src/Kinematics.cpp | 161 +++++++++++++++ src/RobotServoing.cpp | 317 +++++++++++++++++++++++++++++ 10 files changed, 1007 insertions(+), 2 deletions(-) create mode 100755 bin/RobotServoing create mode 100644 include/DynamixelHandler.h create mode 100644 include/Kinematics.h create mode 100644 lib/DynamixelHandler.o create mode 100644 lib/Kinematics.o create mode 100644 lib/RobotServoing.o create mode 100644 src/DynamixelHandler.cpp create mode 100644 src/Kinematics.cpp create mode 100644 src/RobotServoing.cpp diff --git a/bin/RobotServoing b/bin/RobotServoing new file mode 100755 index 0000000000000000000000000000000000000000..f20fda070a0368dae3e961c461ea95df77b62773 GIT binary patch literal 139256 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 WlCNMiy!_H%K1!Ers*%9>Y5hMNk~3Za literal 0 HcmV?d00001 diff --git a/include/DynamixelHandler.h b/include/DynamixelHandler.h new file mode 100644 index 0000000..c1d4ee6 --- /dev/null +++ b/include/DynamixelHandler.h @@ -0,0 +1,88 @@ +#if defined(__linux__) || defined(__APPLE__) +#include +#include +#include +#define STDIN_FILENO 0 +#elif defined(_WIN32) || defined(_WIN64) +#include +#endif + +#define _USE_MATH_DEFINES +#include + +// standard includes +#include +#include +#include +#include +#include + +// dynamixel sdk include +#include "dynamixel_sdk/dynamixel_sdk.h" + +// addresses of variables in the register +#define ADDR_XL320_CONTROL_MODE 11 +#define ADDR_XL320_TORQUE_ENABLE 24 +#define ADDR_XL320_GOAL_POSITION 30 +#define ADDR_XL320_GOAL_VELOCITY 32 +#define ADDR_XL320_PRESENT_POSITION 37 +#define ADDR_XL320_PRESENT_VELOCITY 39 +#define ADDR_XL320_HARDWARE_ERROR_STATUS 50 + +// rotation direction +#define ROT_DIRECTION_Q1 1 +#define ROT_DIRECTION_Q2 -1 +#define ROT_DIRECTION_QPEN 1 +// nb of joints +#define NB_JOINTS 3 + + +class DynamixelHandler +{ + +public: + DynamixelHandler(); + ~DynamixelHandler(); + +public: + bool openPort(); + void closePort(); + bool setBaudRate(int); + void setDeviceName(std::string); + void setProtocolVersion(float); + bool enableTorque(bool); + bool setControlMode(int iControlMode); + + bool readCurrentJointPosition(std::vector& vCurrentJointPosition); + bool readCurrentJointPosition(std::vector& vCurrentJointPosition); + bool sendTargetJointPosition(std::vector& vTargetJointPosition); + bool sendTargetJointPosition(std::vector& vTargetJointPosition); + bool sendTargetJointVelocity(std::vector& vTargetJointVelocity); + bool sendTargetJointVelocity(std::vector& vTargetJointVelocity); + int convertAngleToJointCmd(float fJointAngle); + float convertJointCmdToAngle(int iJointCmd); + int convertJointVelocityToJointCmd(float fJointVelocity); + +private: + std::string m_sDeviceName; + float m_fProtocolVersion; + int m_i32BaudRate; + + dynamixel::PortHandler* m_pPortHandler; + dynamixel::PacketHandler* m_pPacketHandler; + + bool m_bIsDeviceNameSet; + bool m_bIsProtocolVersionSet; + bool m_bIsPortOpened; + bool m_bIsBaudRateSet; + + int m_i32DxlCommunicationResult; // Communication result + uint8_t m_ui8DxlError; // Dynamixel error + std::vector m_vDxlCurrentPosition; // Present position + + float m_fMinJointCmd = 0; + float m_fMaxJointCmd = 1023; + float m_fMinJointAngle = -150.0f/180.0f*M_PI; + float m_fMaxJointAngle = 150.0f/180.0f*M_PI; + +}; \ No newline at end of file diff --git a/include/Kinematics.h b/include/Kinematics.h new file mode 100644 index 0000000..d465457 --- /dev/null +++ b/include/Kinematics.h @@ -0,0 +1,20 @@ +#define _USE_MATH_DEFINES +#include +#include +#include + +#include "opencv2/opencv.hpp" + +float deg2rad(float angle); + +float rad2deg(float angle); + +std::vector computeForwardKinematics(float q1, float q2, float L1, float L2); + +std::vector computeInverseKinematics(float x, float y, float L1, float L2); + +std::vector computeDifferentialKinematics(float q1, float q2, float L1, float L2); + +int computeJacobianMatrixRank(std::vector vJacobianMatrix, float threshold); + +cv::Mat computeInverseJacobianMatrix(std::vector vJacobianMatrix); diff --git a/lib/DynamixelHandler.o b/lib/DynamixelHandler.o new file mode 100644 index 0000000000000000000000000000000000000000..e6414e1535556f2ba3f34fc2d9d0e21dec89921b GIT binary patch literal 87200 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 literal 0 HcmV?d00001 diff --git a/lib/Kinematics.o b/lib/Kinematics.o new file mode 100644 index 0000000000000000000000000000000000000000..921b0f63a4a5ff7c127110eecd6ac523701ad2d1 GIT binary patch literal 192440 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 H&E)?d@o(dc literal 0 HcmV?d00001 diff --git a/lib/RobotServoing.o b/lib/RobotServoing.o new file mode 100644 index 0000000000000000000000000000000000000000..2e073ff477aa77debd0e128025613b2a4036f9b6 GIT binary patch literal 190768 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�~yNo_}&uI28qtBl( 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 literal 0 HcmV?d00001 diff --git a/makefile b/makefile index 92845d4..7fc1be0 100644 --- a/makefile +++ b/makefile @@ -1,15 +1,27 @@ -all: CameraCalibration RedBallDetection RedBallTracking +all: CameraCalibration RedBallDetection RedBallTracking kinematics dynamics Robotservoing g++ lib/CameraCalibration.o -o bin/CameraCalibration -L/usr/lib/x86_64-linux-gnu `pkg-config --libs opencv4` g++ lib/RedBallDetection.o -o bin/RedBallDetection -L/usr/lib/x86_64-linux-gnu `pkg-config --libs opencv4` g++ lib/RedBallTracking.o -o bin/RedBallTracking -L/usr/lib/x86_64-linux-gnu `pkg-config --libs opencv4` - + g++ -o bin/RobotServoing lib/RobotServoing.o lib/Kinematics.o lib/DynamixelHandler.o -L/usr/local/lib/ -ldxl_x64_cpp -lrt -L/usr/lib/x86_64-linux-gnu `pkg-config --libs opencv4` + CameraCalibration: src/CameraCalibration.cpp g++ -c src/CameraCalibration.cpp -o lib/CameraCalibration.o -I./include -I/usr/include/opencv4 + RedBallDetection: src/RedBallDetection.cpp g++ -c src/RedBallDetection.cpp -o lib/RedBallDetection.o -I./include -I/usr/include/opencv4 + RedBallTracking: src/RedBallTracking.cpp g++ -c src/RedBallTracking.cpp -o lib/RedBallTracking.o -I./include -I/usr/include/opencv4 +kinematics: src/Kinematics.cpp + g++ -c src/Kinematics.cpp -o lib/Kinematics.o -I./include -I/usr/include/opencv4 + +dynamics: src/DynamixelHandler.cpp + g++ -c src/DynamixelHandler.cpp -o lib/DynamixelHandler.o -I./include -I/usr/local/include + +Robotservoing: src/RobotServoing.cpp + g++ -c src/RobotServoing.cpp -o lib/RobotServoing.o -I./include -I/usr/include/opencv4 + clean: rm lib/*.o rm bin/* diff --git a/src/DynamixelHandler.cpp b/src/DynamixelHandler.cpp new file mode 100644 index 0000000..372d381 --- /dev/null +++ b/src/DynamixelHandler.cpp @@ -0,0 +1,407 @@ +#include "DynamixelHandler.h" + +DynamixelHandler::DynamixelHandler(): + m_sDeviceName(""), m_fProtocolVersion(0.0), m_i32BaudRate(0), + m_pPacketHandler(nullptr), m_pPortHandler(nullptr), + m_bIsDeviceNameSet(false), m_bIsProtocolVersionSet(false), m_bIsPortOpened(false), m_bIsBaudRateSet(false), + m_ui8DxlError(0), m_i32DxlCommunicationResult(COMM_TX_FAIL) +{ + +} + +DynamixelHandler::~DynamixelHandler() +{ + +} + +int DynamixelHandler::convertJointVelocityToJointCmd(float fJointVelocity) +{ + if (fJointVelocity == 0.0f) + return 0; + + float a = 0.0f; + float b = 0.0f; + if (fJointVelocity>0) + { + float l_fMaxJointCmd = 1023; + float l_fMinJointCmd = 0; + float l_fMaxJointVelocity = 114 * 60.0f * 2 * M_PI; + float l_fMinJointAngle = 0.0f; + // y = ax + b + a = (l_fMaxJointCmd-l_fMinJointCmd) / (l_fMaxJointVelocity - l_fMinJointAngle); + b = l_fMinJointCmd - a * l_fMinJointAngle; + } + + if (fJointVelocity<0) + { + float l_fMaxJointCmd = 2047; + float l_fMinJointCmd = 1024; + float l_fMaxJointVelocity = 0.0f; + float l_fMinJointAngle = -114 * 60.0f * 2 * M_PI; + // y = ax + b + a = (l_fMaxJointCmd-l_fMinJointCmd) / (l_fMaxJointVelocity - l_fMinJointAngle); + b = l_fMinJointCmd - a * l_fMinJointAngle; + } + + float jointCmd = a * fJointVelocity + b; + return (int)jointCmd; +} + +int DynamixelHandler::convertAngleToJointCmd(float fJointAngle) +{ + // y = ax + b + float a = (m_fMaxJointCmd-m_fMinJointCmd) / (m_fMaxJointAngle - m_fMinJointAngle); + float b = m_fMinJointCmd - a * m_fMinJointAngle; + float jointCmd = a * fJointAngle + b; + return (int)jointCmd; +} + +float DynamixelHandler::convertJointCmdToAngle(int iJointCmd) +{ + // y = ax + b + float a = (m_fMaxJointAngle - m_fMinJointAngle) / (m_fMaxJointCmd-m_fMinJointCmd); + float b = m_fMinJointAngle - a * m_fMinJointCmd; + float jointAngle = a * iJointCmd + b; + return jointAngle; +} + +bool DynamixelHandler::openPort() +{ + if (m_pPortHandler == nullptr) + { + std::cout << "[ERROR](DynamixelHandler::openPort) m_pPortHandler is null!" << std::endl; + m_bIsPortOpened = false; + return m_bIsPortOpened; + } + + if (!m_bIsDeviceNameSet) + { + std::cout << "[ERROR](DynamixelHandler::openPort) m_sDeviceName is not set!" << std::endl; + m_bIsPortOpened = false; + return m_bIsPortOpened; + } + + if (m_bIsPortOpened) + { + std::cout << "[WARNING](DynamixelHandler::openPort) port is already opened!" << std::endl; + return m_bIsPortOpened; + } + + if (m_pPortHandler->openPort()) + { + std::cout << "[INFO](DynamixelHandler::openPort) Succeeded to open the port!" << std::endl; + m_bIsPortOpened = true; + } + else + { + std::cout << "[ERROR](DynamixelHandler::openPort) Failed to open the port!" << std::endl; + m_bIsPortOpened = false; + } + return m_bIsPortOpened; +} + +void DynamixelHandler::closePort() +{ + if (m_pPortHandler == nullptr) + { + std::cout << "[ERROR](DynamixelHandler::closePort) m_pPortHandler is null!" << std::endl; + m_bIsPortOpened = false; + return; + } + + if (!m_bIsPortOpened) + { + std::cout << "[WARNING](DynamixelHandler::openPort) port is already closed!" << std::endl; + return; + } + + m_pPortHandler->closePort(); + + std::cout << "[INFO](DynamixelHandler::closePort) Succeeded to close the port!" << std::endl; + m_bIsPortOpened = false; +} + +bool DynamixelHandler::setBaudRate(int i32BaudRate) +{ + m_i32BaudRate = i32BaudRate; + + if (nullptr != m_pPortHandler) + { + if (m_pPortHandler->setBaudRate(m_i32BaudRate)) + { + std::cout << "[INFO](DynamixelHandler::setBaudRate) Succeeded to change the baudrate!" << std::endl; + m_bIsBaudRateSet = true; + } + else + { + std::cout << "[ERROR](DynamixelHandler::setBaudRate) Failed to change the baudrate!" << std::endl; + m_bIsBaudRateSet = false; + } + } + else + { + std::cout << "[ERROR](DynamixelHandler::setBaudRate) m_pPortHandler is null!" << std::endl; + m_bIsBaudRateSet = false; + } + return m_bIsBaudRateSet; +} + +void DynamixelHandler::setDeviceName(std::string sDeviceName) +{ + m_sDeviceName = sDeviceName; + m_bIsDeviceNameSet = true; + + if (nullptr != m_pPortHandler) + { + delete m_pPortHandler; + m_pPortHandler = nullptr; + } + + // Initialize PortHandler instance + m_pPortHandler = dynamixel::PortHandler::getPortHandler(m_sDeviceName.c_str()); +} + +void DynamixelHandler::setProtocolVersion(float fProtocolVersion) +{ + m_fProtocolVersion = fProtocolVersion; + m_bIsProtocolVersionSet = true; + + if (nullptr != m_pPacketHandler) + { + delete m_pPacketHandler; + m_pPacketHandler = nullptr; + } + + m_pPacketHandler = dynamixel::PacketHandler::getPacketHandler(m_fProtocolVersion); +} + +bool DynamixelHandler::readCurrentJointPosition(std::vector& vCurrentJointPosition) +{ + // Creates a vector of joint position + std::vector l_vCurrentJointPosition; + // Reads the current joint positions in motor command unit + bool bIsReadSuccessfull = this->readCurrentJointPosition(l_vCurrentJointPosition); + //std::cout << "l_vCurrentJointPosition= " << l_vCurrentJointPosition[0] << ", " << l_vCurrentJointPosition[1] << ", " << l_vCurrentJointPosition[2]<< std::endl; + + // q1 + vCurrentJointPosition.push_back(ROT_DIRECTION_Q1*convertJointCmdToAngle(l_vCurrentJointPosition[0])); + // qpen + vCurrentJointPosition.push_back(ROT_DIRECTION_QPEN*convertJointCmdToAngle(l_vCurrentJointPosition[1])); + // q2 + vCurrentJointPosition.push_back(ROT_DIRECTION_Q2*convertJointCmdToAngle(l_vCurrentJointPosition[2])); + + //std::cout << "vCurrentJointPosition= " << vCurrentJointPosition[0] << ", " << vCurrentJointPosition[1] << ", " << vCurrentJointPosition[2]<< std::endl; + + return bIsReadSuccessfull; +} + +bool DynamixelHandler::readCurrentJointPosition(std::vector& vCurrentJointPosition) +{ + bool bIsReadSuccessfull = false; + + for (unsigned int l_joint = 0; l_joint < NB_JOINTS; l_joint++) + { + int dxl_comm_result = COMM_TX_FAIL; // Communication result + uint8_t dxl_error = 0; + uint16_t dxl_present_position = 0; + + dxl_comm_result = m_pPacketHandler->read2ByteTxRx(m_pPortHandler, l_joint + 1, ADDR_XL320_PRESENT_POSITION, &dxl_present_position, &dxl_error); + if (dxl_comm_result != COMM_SUCCESS) + { + //std::cout << "[ERROR] " << m_pPacketHandler->getTxRxResult(dxl_comm_result) << std::endl; + bIsReadSuccessfull = false; + } + else if (dxl_error != 0) + { + //std::cout << "[ERROR] " << m_pPacketHandler->getRxPacketError(dxl_error) << std::endl; + bIsReadSuccessfull = false; + } + else + { + vCurrentJointPosition.push_back(dxl_present_position); + bIsReadSuccessfull = true; + } + } + + return bIsReadSuccessfull; +} + +bool DynamixelHandler::sendTargetJointPosition(std::vector& vTargetJointPosition) +{ + // Checks if the input vector has the right size + if (vTargetJointPosition.size() != NB_JOINTS) + { + std::cout << "[ERROR] (sendTargetJointPosition) Input vector has not the right size!" << std::endl; + return false; + } + + // Creates a vector of motor commands + std::vector l_vTargetJointPosition; + // q1 + l_vTargetJointPosition.push_back(convertAngleToJointCmd(ROT_DIRECTION_Q1*vTargetJointPosition[0])); + // qpen + l_vTargetJointPosition.push_back(convertAngleToJointCmd(ROT_DIRECTION_QPEN*vTargetJointPosition[1])); + // q2 + l_vTargetJointPosition.push_back(convertAngleToJointCmd(ROT_DIRECTION_Q2*vTargetJointPosition[2])); + + //std::cout << "l_vTargetJointPosition= " << l_vTargetJointPosition[0] << ", " << l_vTargetJointPosition[1] << ", " << l_vTargetJointPosition[2]<< std::endl; + + // call the dxl sendTargetJointPosition + bool bIsSendSuccessfull = this->sendTargetJointPosition(l_vTargetJointPosition); + + return bIsSendSuccessfull; +} + +bool DynamixelHandler::sendTargetJointPosition(std::vector& vTargetJointPosition) +{ + bool bIsSendSuccessfull = false; + + // checks if the vector size is correct + if (vTargetJointPosition.size() != NB_JOINTS) + { + std::cout << "[ERROR] (DynamixelHandler::sendTargetJointPosition): Size of command vector is not correct: " << vTargetJointPosition.size() << " instead of " << NB_JOINTS << "!" << std::endl; + bIsSendSuccessfull = false; + } + + for (unsigned int l_joint = 0; l_joint < NB_JOINTS; l_joint++) + { + int dxl_comm_result = COMM_TX_FAIL; // Communication result + uint8_t dxl_error = 0; + uint16_t dxl_present_position = 0; + dxl_comm_result = m_pPacketHandler->write2ByteTxRx(m_pPortHandler, l_joint + 1, ADDR_XL320_GOAL_POSITION, vTargetJointPosition[l_joint], &dxl_error); + if (dxl_comm_result != COMM_SUCCESS) + { + //std::cout << "[ERROR] (DynamixelHandler::sendTargetJointPosition): " << m_pPacketHandler->getTxRxResult(dxl_comm_result) << std::endl; + bIsSendSuccessfull = false; + } + else if (dxl_error != 0) + { + //std::cout << "[ERROR] (DynamixelHandler::sendTargetJointPosition): " << m_pPacketHandler->getRxPacketError(dxl_error) << std::endl; + bIsSendSuccessfull = false; + } + else + { + bIsSendSuccessfull = true; + } + } + return bIsSendSuccessfull; + +} + +bool DynamixelHandler::sendTargetJointVelocity(std::vector& vTargetJointVelocity) +{ + // Checks if the input vector has the right size + if (vTargetJointVelocity.size() != NB_JOINTS) + { + std::cout << "[ERROR] (sendTargetJointVelocity) Input vector has not the right size!" << std::endl; + return false; + } + + // Creates a vector of motor commands + std::vector l_vTargetJointVelocity; + // q1 + l_vTargetJointVelocity.push_back(convertJointVelocityToJointCmd(ROT_DIRECTION_Q1*vTargetJointVelocity[0])); + // qpen + l_vTargetJointVelocity.push_back(convertJointVelocityToJointCmd(ROT_DIRECTION_QPEN*vTargetJointVelocity[1])); + // q2 + l_vTargetJointVelocity.push_back(convertJointVelocityToJointCmd(ROT_DIRECTION_Q2*vTargetJointVelocity[2])); + + std::cout << "l_vTargetJointVelocity= " << l_vTargetJointVelocity[0] << ", " << l_vTargetJointVelocity[1] << ", " << l_vTargetJointVelocity[2]<< std::endl; + + // call the dxl sendTargetJointPosition + bool bIsSendSuccessfull = this->sendTargetJointVelocity(l_vTargetJointVelocity); + + return bIsSendSuccessfull; +} + +bool DynamixelHandler::sendTargetJointVelocity(std::vector& vTargetJointVelocity) +{ + bool bIsSendSuccessfull = false; + + // checks if the vector size is correct + if (vTargetJointVelocity.size() != NB_JOINTS) + { + std::cout << "[ERROR] (DynamixelHandler::sendTargetJointVelocity): Size of command vector is not correct: " << vTargetJointVelocity.size() << " instead of " << NB_JOINTS << "!" << std::endl; + bIsSendSuccessfull = false; + } + + for (unsigned int l_joint = 0; l_joint < NB_JOINTS; l_joint++) + { + int dxl_comm_result = COMM_TX_FAIL; // Communication result + uint8_t dxl_error = 0; + uint16_t dxl_present_position = 0; + dxl_comm_result = m_pPacketHandler->write2ByteTxRx(m_pPortHandler, l_joint + 1, ADDR_XL320_GOAL_VELOCITY, vTargetJointVelocity[l_joint], &dxl_error); + if (dxl_comm_result != COMM_SUCCESS) + { + //std::cout << "[ERROR] (DynamixelHandler::sendTargetJointPosition): " << m_pPacketHandler->getTxRxResult(dxl_comm_result) << std::endl; + bIsSendSuccessfull = false; + } + else if (dxl_error != 0) + { + //std::cout << "[ERROR] (DynamixelHandler::sendTargetJointPosition): " << m_pPacketHandler->getRxPacketError(dxl_error) << std::endl; + bIsSendSuccessfull = false; + } + else + { + bIsSendSuccessfull = true; + } + } + return bIsSendSuccessfull; + +} + +bool DynamixelHandler::enableTorque(bool bEnableTorque) +{ + bool bIsSendSuccessfull = false; + + for (unsigned int l_joint = 0; l_joint < NB_JOINTS; l_joint++) + { + int dxl_comm_result = COMM_TX_FAIL; // Communication result + uint8_t dxl_error = 0; + + dxl_comm_result = m_pPacketHandler->write1ByteTxRx(m_pPortHandler, l_joint + 1, ADDR_XL320_TORQUE_ENABLE, bEnableTorque, &dxl_error); + if (dxl_comm_result != COMM_SUCCESS) + { + //std::cout << "[ERROR] (DynamixelHandler::enableTorque): " << m_pPacketHandler->getTxRxResult(dxl_comm_result) << std::endl; + bIsSendSuccessfull = false; + } + else if (dxl_error != 0) + { + //std::cout << "[ERROR] (DynamixelHandler::enableTorque): " << m_pPacketHandler->getRxPacketError(dxl_error) << std::endl; + bIsSendSuccessfull = false; + } + else + { + bIsSendSuccessfull = true; + } + } + return bIsSendSuccessfull; +} + +bool DynamixelHandler::setControlMode(int iControlMode) +{ + bool bIsSendSuccessfull = false; + + for (unsigned int l_joint = 0; l_joint < NB_JOINTS; l_joint++) + { + int dxl_comm_result = COMM_TX_FAIL; // Communication result + uint8_t dxl_error = 0; + + dxl_comm_result = m_pPacketHandler->write1ByteTxRx(m_pPortHandler, l_joint + 1, ADDR_XL320_CONTROL_MODE, iControlMode, &dxl_error); + if (dxl_comm_result != COMM_SUCCESS) + { + //std::cout << "[ERROR] (DynamixelHandler::enableTorque): " << m_pPacketHandler->getTxRxResult(dxl_comm_result) << std::endl; + bIsSendSuccessfull = false; + } + else if (dxl_error != 0) + { + //std::cout << "[ERROR] (DynamixelHandler::enableTorque): " << m_pPacketHandler->getRxPacketError(dxl_error) << std::endl; + bIsSendSuccessfull = false; + } + else + { + bIsSendSuccessfull = true; + } + } + return bIsSendSuccessfull; +} diff --git a/src/Kinematics.cpp b/src/Kinematics.cpp new file mode 100644 index 0000000..9c154fc --- /dev/null +++ b/src/Kinematics.cpp @@ -0,0 +1,161 @@ +#include "Kinematics.h" + + +float deg2rad(float angle) +{ + return angle/180.0*M_PI; +} + +float rad2deg(float angle) +{ + return angle*180.0/M_PI; +} + +std::vector computeForwardKinematics(float q1, float q2, float L1, float L2) +{ + float x = L1 * cos(q1) + L2 * cos(q1+q2); + float y = L1 * sin(q1) + L2 * sin(q1+q2); + std::cout << "[INFO] Forward Kinematics : (q1, q2)->(x, y) = (" << rad2deg(q1) << ", " << rad2deg(q2) << ")->(" << x << ", " << y << ")" << std::endl; + std::vector X; + X.push_back(x); + X.push_back(y); + + return X; +} + +std::vector computeInverseKinematics(float x, float y, float L1, float L2) +{ + std::vector qi; + + float cos_q2 = (x*x+y*y-(L1*L1+L2*L2)) / (2.0 * L1 * L2); + + std::cout << "[INFO] cos_q2= " << cos_q2 << std::endl; + + if (cos_q2 >1 | cos_q2 <-1) + { + qi.push_back(0.0); + std::cout << "[INFO] Inverse Kinematics: No solution!" << std::endl; + } + else if (cos_q2 == 1) + { + qi.push_back(1.0); + float q1 = atan2(y, x); + float q2 = 0; + std::cout << "[INFO] Inverse Kinematics: One solution: (x, y)->(q1, q2) = (" << x << ", " << y << ")->(" << rad2deg(q1) << ", " << rad2deg(q2) << ")" << std::endl; + qi.push_back(q1); + qi.push_back(q2); + } + else if (cos_q2 == -1) + { + qi.push_back(1.0); + float q1 = atan2(y, x); + float q2 = M_PI; + std::cout << "[INFO] Inverse Kinematics: One solution: (x, y)->(q1, q2) = (" << x << ", " << y << ")->(" << rad2deg(q1) << ", " << rad2deg(q2) << ")" << std::endl; + qi.push_back(q1); + qi.push_back(q2); + } + else + { + qi.push_back(2.0); + std::cout << "[INFO] Inverse Kinematics: Two solutions: "<< std::endl; + + float q2 = acos(cos_q2); + float q1 = (float)(atan2(y, x) - atan2(L2*sin(q2), L1+L2*cos_q2)); + std::cout << "\t(x, y)->(q1, q2) = (" << x << ", " << y << ")->(" << rad2deg(q1) << ", " << rad2deg(q2) << ")" << std::endl; + qi.push_back(q1); + qi.push_back(q2); + + + q2 = -acos(cos_q2); + q1 = (float)(atan2(y, x) - atan2(L2*sin(q2), L1+L2*cos_q2)); + + std::cout << "\t(x, y)->(q1, q2) = (" << x << ", " << y << ")->(" << rad2deg(q1) << ", " << rad2deg(q2) << ")" << std::endl; + qi.push_back(q1); + qi.push_back(q2); + } + + return qi; +} + +std::vector computeDifferentialKinematics(float q1, float q2, float L1, float L2) +{ + std::vector jacobian; + + float j11 = -L2*sin(q1+q2) - L1*sin(q1); + float j12 = -L2*sin(q1+q2); + float j21 = L2*cos(q1+q2) + L1*cos(q1); + float j22 = L2*cos(q1+q2); + + jacobian.push_back(j11); + jacobian.push_back(j12); + jacobian.push_back(j21); + jacobian.push_back(j22); + + return jacobian; +} + +int computeJacobianMatrixRank(std::vector vJacobianMatrix, float threshold) +{ + int rank = -1; + cv::Mat1f oJacobianMatrix(2, 2); + + if (vJacobianMatrix.size() == 4) + { + // Converts the Jacobian matrix from std::vector to cv::Mat + oJacobianMatrix.at(0, 0) = vJacobianMatrix[0]; + oJacobianMatrix.at(0, 1) = vJacobianMatrix[1]; + oJacobianMatrix.at(1, 0) = vJacobianMatrix[2]; + oJacobianMatrix.at(1, 1) = vJacobianMatrix[3]; + std::cout << "=====Jacobian Matrix=====" << std::endl; + std::cout << "[ " << oJacobianMatrix.at(0,0) << ", " << oJacobianMatrix.at(0,1) << " ]" << std::endl; + std::cout << "[ " << oJacobianMatrix.at(1,0) << ", " << oJacobianMatrix.at(1,1) << " ]" << std::endl; + // Computes the determinant of the Jacobian matrix + float determinant = abs(vJacobianMatrix[0] * vJacobianMatrix[3] - vJacobianMatrix[1]*vJacobianMatrix[2]); + std::cout << "=====Determinant of the Jacobian matrix=====" << std::endl << determinant << std::endl; + // Computes SVD + cv::Mat1f w, u, vt; + cv::SVD::compute(oJacobianMatrix, w, u, vt); + // Finds non zero singular values + cv::Mat1f nonZeroSingularValues = w/w.at(0,0) > threshold; + // Counts the number of non zero singular values + rank = cv::countNonZero(nonZeroSingularValues); + std::cout << "=====Rank of the Jacobian matrix=====" << std::endl << rank << " / " << oJacobianMatrix.rows << std::endl; + // Determines the inverse of the Jacobian matrix + cv::Mat oJacobianInverse = oJacobianMatrix.inv(); + std::cout << "=====Inverse of the Jacobian Matrix=====" << std::endl; + std::cout << "[ " << oJacobianInverse.at(0,0) << ", " << oJacobianInverse.at(0,1) << " ]" << std::endl; + std::cout << "[ " << oJacobianInverse.at(1,0) << ", " << oJacobianInverse.at(1,1) << " ]" << std::endl; + } + else + std::cout << "[ERROR] Jacobian matrix has a size of "<< vJacobianMatrix.size() << " instead of 4" << std::endl; + + return rank; +} + +cv::Mat computeInverseJacobianMatrix(std::vector vJacobianMatrix) +{ + cv::Mat1f oJacobianMatrix(2, 2); + cv::Mat oJacobianInverse; + + if (vJacobianMatrix.size() == 4) + { + // Converts the Jacobian matrix from std::vector to cv::Mat + oJacobianMatrix.at(0, 0) = vJacobianMatrix[0]; + oJacobianMatrix.at(0, 1) = vJacobianMatrix[1]; + oJacobianMatrix.at(1, 0) = vJacobianMatrix[2]; + oJacobianMatrix.at(1, 1) = vJacobianMatrix[3]; + std::cout << "=====Jacobian Matrix=====" << std::endl; + std::cout << "[ " << oJacobianMatrix.at(0,0) << ", " << oJacobianMatrix.at(0,1) << " ]" << std::endl; + std::cout << "[ " << oJacobianMatrix.at(1,0) << ", " << oJacobianMatrix.at(1,1) << " ]" << std::endl; + // Determines the inverse of the Jacobian matrix + cv::invert(oJacobianMatrix, oJacobianInverse, cv::DECOMP_SVD); + //oJacobianInverse = oJacobianMatrix.inv(); + std::cout << "=====Inverse of the Jacobian Matrix=====" << std::endl; + std::cout << "[ " << oJacobianInverse.at(0,0) << ", " << oJacobianInverse.at(0,1) << " ]" << std::endl; + std::cout << "[ " << oJacobianInverse.at(1,0) << ", " << oJacobianInverse.at(1,1) << " ]" << std::endl; + } + else + std::cout << "[ERROR] Jacobian matrix has a size of "<< vJacobianMatrix.size() << " instead of 4" << std::endl; + + return oJacobianInverse; +} \ No newline at end of file diff --git a/src/RobotServoing.cpp b/src/RobotServoing.cpp new file mode 100644 index 0000000..fb351b4 --- /dev/null +++ b/src/RobotServoing.cpp @@ -0,0 +1,317 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "opencv2/highgui/highgui.hpp" +#include "opencv2/imgproc/imgproc.hpp" +#include + +#include "Kinematics.h" +#include "DynamixelHandler.h" + +#define CAM_PARAMS_FILENAME "./data/microsoft_livecam_hd3000.xml" +#define COLOR_PARAMS_FILENAME "./data/color_params_data.xml" +#define FPS 30.0 +#define STRUCTURAL_ELEMENTS_SIZE 5 +#define AREA_THRESOLD 1000 +#define ROBOT_L1 5 +#define ROBOT_L2 6 + + +using namespace cv; +using namespace std; + +DynamixelHandler _oDxlHandler; +std::string _robotDxlPortName = "/dev/ttyUSB0"; +float _robotDxlProtocol = 2.0; +int _robotDxlBaudRate = 1000000; + + +void initRobot(DynamixelHandler& dxlHandler, std::string portName, float protocol, int baudRate) +{ + std::cout << "===Initialization of the Dynamixel Motor communication====" << std::endl; + dxlHandler.setDeviceName(portName); + dxlHandler.setProtocolVersion(protocol); + dxlHandler.openPort(); + dxlHandler.setBaudRate(baudRate); + dxlHandler.enableTorque(true); + std::cout << std::endl; +} + +void closeRobot(DynamixelHandler& dxlHandler) +{ + dxlHandler.enableTorque(false); + dxlHandler.closePort(); +} + +bool readCameraParameters(std::string filename, cv::Mat &camMatrix, cv::Mat & distCoeffs) +{ + cv::FileStorage fs(filename, cv::FileStorage::READ); + if (!fs.isOpened()) + { + std::cout << "[ERROR] Could not open the camera parameter file storage: " << filename << " !"<< std::endl; + return false; + } + + fs["camera_matrix"] >> camMatrix; + fs["distortion_coefficients"] >> distCoeffs; + + return true; +} + +bool readColorParameters(std::string filename, int& iLowH, int& iHighH, int& iLowS, int& iHighS, int& iLowV, int& iHighV) +{ + cv::FileStorage fs(filename, cv::FileStorage::READ); + if (!fs.isOpened()) + { + std::cout << "[ERROR] Could not open the color paramter file storage: " << filename << " !"<< std::endl; + return false; + } + + fs["lowH"] >> iLowH; + fs["highH"] >> iHighH; + + fs["lowS"] >> iLowS; + fs["highS"] >> iHighS; + + fs["lowV"] >> iLowV; + fs["highV"] >> iHighV; + + return true; +} + + +int main(int argc, char** argv) +{ + // initializes main parameters + float L1 = ROBOT_L1; + float L2 = ROBOT_L2; + float qpen = deg2rad(-90); // in rad + std::string sCameraParamFilename = CAM_PARAMS_FILENAME; + std::string sColorParamFilename = COLOR_PARAMS_FILENAME; + float fFPS = FPS; + int iStructuralElementSize = STRUCTURAL_ELEMENTS_SIZE; + int iAreaThresold = AREA_THRESOLD; + + // updates main parameters from arguments + int opt; + while ((opt = getopt (argc, argv, ":c:f:s:a:i:p:l:m:")) != -1) + { + switch (opt) + { + case 'c': + sColorParamFilename = optarg; + break; + case 'f': + fFPS = atof(optarg); + break; + case 'p': + qpen = atof(optarg); + break; + case 'l': + L1 = atof(optarg); + break; + case 'm': + L2 = atof(optarg); + break; + case 's': + iStructuralElementSize = atoi(optarg); + break; + case 'a': + iAreaThresold = atoi(optarg); + break; + case 'i': + sCameraParamFilename = optarg; + break; + case '?': + if (optopt == 'c' || optopt == 'f' || optopt == 's' || optopt == 'a' || optopt == 'p' || optopt == 'l' || optopt == 'm' || optopt == 'i') + fprintf (stderr, "Option -%c requires an argument.\n", optopt); + else if (isprint (optopt)) + fprintf (stderr, "Unknown option `-%c'.\n", optopt); + else + fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); + return 1; + default: + abort (); + } + } + + // Initializes the robot + initRobot(_oDxlHandler, _robotDxlPortName, _robotDxlProtocol, _robotDxlBaudRate); + + + // reads color parameters from the file storage + int iLowH, iHighH, iLowS, iHighS, iLowV, iHighV; + bool isColorParamsSet = readColorParameters(sColorParamFilename, iLowH, iHighH, iLowS, iHighS, iLowV, iHighV); + + // checks if the color parameters were successfully read + if (!isColorParamsSet) + { + std::cout << "[ERROR] Color parameters could not be loaded!" << std::endl; + return -1; + } + + // distorted/undistorted image + bool bIsImageUndistorted = true; + + // reads camera intrinsic parameters + cv::Mat cameraMatrix, distCoeffs; + bool isCamParamsSet = readCameraParameters(sCameraParamFilename, cameraMatrix, distCoeffs); + + // checks if the camera parameters were successfully read + if (!isCamParamsSet) + { + std::cout << "[WARNING] Camera intrinsic parameters could not be loaded!" << std::endl; + } + + // creates a camera grabber + VideoCapture cap(0, cv::CAP_V4L2); //capture the video from webcam + + // checks if the camera was successfully opened + if ( !cap.isOpened() ) // if not success, exit program + { + cout << "[ERROR] Could not open the camera!" << endl; + return -1; + } + + // inits previous x,y location of the ball + int iLastX = -1; + int iLastY = -1; + + // captures a temporary image from the camera + Mat imgTmp; + cap.read(imgTmp); + + // main loop launched every FPS + while (true) + { + // creates a black image with the size as the camera output + Mat imgLines = Mat::zeros( imgTmp.size(), CV_8UC3 ); + + // reads a new frame from video + cv::Mat imgOriginal; + bool bSuccess = cap.read(imgOriginal); + + // checks if a new frame was grabbed + if (!bSuccess) //if not success, break loop + { + std::cout << "[WARNING] Could not read a new frame from video stream" << std::endl; + break; + } + + if (bIsImageUndistorted && isCamParamsSet) + { + cv::Mat temp = imgOriginal.clone(); + cv::undistort(temp, imgOriginal, cameraMatrix, distCoeffs); + } + + // converts the captured frame from BGR to HSV + cv::Mat imgHSV; + cvtColor(imgOriginal, imgHSV, cv::COLOR_BGR2HSV); + + // thresholds the image based on the trackbar values + cv::Mat imgThresholded; + inRange(imgHSV, cv::Scalar(iLowH, iLowS, iLowV), cv::Scalar(iHighH, iHighS, iHighV), imgThresholded); + + // applies morphological opening (removes small objects from the foreground) + cv::erode(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(iStructuralElementSize, iStructuralElementSize)) ); + cv::dilate( imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(iStructuralElementSize, iStructuralElementSize)) ); + + // applies morphological closing (removes small holes from the foreground) + cv::dilate( imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(iStructuralElementSize, iStructuralElementSize)) ); + cv::erode(imgThresholded, imgThresholded, getStructuringElement(MORPH_ELLIPSE, Size(iStructuralElementSize, iStructuralElementSize)) ); + + // calculates the moments of the thresholded image + Moments oMoments = moments(imgThresholded); + double dM01 = oMoments.m01; + double dM10 = oMoments.m10; + double dArea = oMoments.m00; + + // if the area <= iAreaThresold, considers that the there are no object in the image and it's because of the noise, the area is not zero + int posX, posY; + + if (dArea > iAreaThresold) + { + // calculates the position of the ball + posX = dM10 / dArea; + posY = dM01 / dArea; + + if (iLastX >= 0 && iLastY >= 0 && posX >= 0 && posY >= 0) + { + // draww a red line from the previous point to the current point + line(imgLines, Point(posX, posY), Point(iLastX, iLastY), Scalar(0,0,255), 2); + } + + // stores the current position for enxt frame + iLastX = posX; + iLastY = posY; + } + + // displays the thresholded image + imshow("Thresholded Image", imgThresholded); + + // adds a cross at the centre of the image + cv::drawMarker(imgOriginal, cv::Point(imgTmp.size().width/2, imgTmp.size().height/2), 10, cv::MARKER_CROSS, cv::LINE_8); + + // shows the original image with the tracking (red) lines + imgOriginal = imgOriginal + imgLines; + imshow("Original", imgOriginal); + float h = 167; + float w = 239; + // converts posX, posY in mm in the world reference frame + float img_width = imgTmp.size().width; + float img_height = imgTmp.size().height; + ///////////////////////////////// + // TODO + float x = (posY - (480/2))*(0.05) + 7; + float y = (posX - (640/2))*(0.05); + + //std::cout << "(pixel -> cm) = (" << posX << ", " << posY << ") - > (" << x << ", " << y << ")" << std::endl; + ///////////////////////////////// + + + // Computes IK + std::vector qi = computeInverseKinematics(x, y, L1, L2); + + // Computes FK + //computeForwardKinematics(qi[1], qi[2], L1, L2); + + // Sends the target joint values received only if there is at least a solution + if (qi.size() >= 3) + { + std::vector vTargetJointPosition; + vTargetJointPosition.push_back(qi[1]); + vTargetJointPosition.push_back(qpen); + vTargetJointPosition.push_back(qi[2]); + _oDxlHandler.sendTargetJointPosition(vTargetJointPosition); + } + + // waits for awhile depending on the FPS value + char key = (char)cv::waitKey(1000.0/fFPS); + // checks if ESC was pressed to exit + if (key == 27) // if 'esc' key is pressed, break loop + { + std::cout << "[INFO] esc key is pressed by user -> Shutting down!" << std::endl; + break; + } + if (key == 'u') + { + bIsImageUndistorted = !bIsImageUndistorted; + std::cout << "[INFO] Image undistorted: " << bIsImageUndistorted<< std::endl; + } + } + + + + + + + // Closes robot connection + _oDxlHandler.closePort(); + + return 0; +}