last lab
This commit is contained in:
parent
0ee70a3391
commit
e4c2972995
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
|
@ -19,3 +19,6 @@ std::vector<float> computeInverseKinematics(float x, float y);
|
||||||
std::vector<float> computeDifferentialKinematics(float q1, float q2, float L1, float L2);
|
std::vector<float> computeDifferentialKinematics(float q1, float q2, float L1, float L2);
|
||||||
int computeJacobianMatrixRank(std::vector<float> vJacobianMatrix, float threshold);
|
int computeJacobianMatrixRank(std::vector<float> vJacobianMatrix, float threshold);
|
||||||
cv::Mat computeInverseJacobianMatrix(std::vector<float> vJacobianMatrix);
|
cv::Mat computeInverseJacobianMatrix(std::vector<float> vJacobianMatrix);
|
||||||
|
|
||||||
|
float getEndEffectorX();
|
||||||
|
float getEndEffectorY();
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
BIN
lib/Kinematics.o
BIN
lib/Kinematics.o
Binary file not shown.
Binary file not shown.
|
|
@ -1,4 +1,7 @@
|
||||||
#include "Kinematics.h"
|
#include "Kinematics.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <cmath>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
float deg2rad(float angle)
|
float deg2rad(float angle)
|
||||||
{
|
{
|
||||||
|
|
@ -29,12 +32,31 @@ std::vector<float> computeInverseKinematics(float x, float y)
|
||||||
{
|
{
|
||||||
std::vector<float> qi;
|
std::vector<float> qi;
|
||||||
|
|
||||||
|
// // Sınır kontrolü (cm cinsinden)
|
||||||
|
// if (x < -11.0f || x > 11.0f) {
|
||||||
|
// std::cout << "[ERROR] Target (" << x << ") is out of allowed range!" << std::endl;
|
||||||
|
// return {};
|
||||||
|
// }
|
||||||
|
|
||||||
|
float r = sqrt(x * x + y * y);
|
||||||
float q1 = atan2(y, x);
|
float q1 = atan2(y, x);
|
||||||
float q2 = deg2rad(80.0); // sabit
|
float q2 = deg2rad(80.0f); // sabit açı
|
||||||
float q3 = acos((sqrt(x*x + y*y) - 5.0 - (6.0 / sqrt((y*y)/(x*x) + 1.0))) / 5.5);
|
|
||||||
|
float value = (r - 5.0f) / 5.5f;
|
||||||
|
|
||||||
|
// Güvenli değer sınırlandırması:
|
||||||
|
if (value > 1.0f) {
|
||||||
|
std::cout << "[WARNING] Target slightly out of reach. Clamping to 0.999." << std::endl;
|
||||||
|
value = 0.999f;
|
||||||
|
} else if (value < -1.0f) {
|
||||||
|
std::cout << "[ERROR] Target too close or unreachable. Skipping this frame." << std::endl;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
float q3 = acos(value);
|
||||||
float q4 = -q1 - q3;
|
float q4 = -q1 - q3;
|
||||||
|
|
||||||
std::cout << "[INFO] Inverse Kinematics (New): (x, y) -> (q1, q2, q3, q4) = ("
|
std::cout << "[INFO] Inverse Kinematics (Tuned): (x, y) -> (q1, q2, q3, q4) = ("
|
||||||
<< x << ", " << y << ") -> ("
|
<< x << ", " << y << ") -> ("
|
||||||
<< rad2deg(q1) << ", " << rad2deg(q2) << ", "
|
<< rad2deg(q1) << ", " << rad2deg(q2) << ", "
|
||||||
<< rad2deg(q3) << ", " << rad2deg(q4) << ")" << std::endl;
|
<< rad2deg(q3) << ", " << rad2deg(q4) << ")" << std::endl;
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@
|
||||||
#define ROBOT_L1 5
|
#define ROBOT_L1 5
|
||||||
#define ROBOT_L2 5.5
|
#define ROBOT_L2 5.5
|
||||||
#define ROBOT_L3 6
|
#define ROBOT_L3 6
|
||||||
|
#define PUSH_THRESHOLD_CM 4.0f // İtme eşiği (cm)
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
@ -72,6 +73,20 @@ bool readColorParameters(string filename, int& iLowH, int& iHighH, int& iLowS, i
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Yeni fonksiyon: Rastgele pozisyon göndererek topu itmek
|
||||||
|
void pushBallRandomly(DynamixelHandler &dxlHandler) {
|
||||||
|
float randAngle1 = deg2rad(rand() % 90 - 45); // -45 ile 45 arasında rastgele açı
|
||||||
|
float randAngle2 = deg2rad(rand() % 30 + 60); // 60 ile 90 arasında rastgele açı (kol havada kalmalı)
|
||||||
|
float randAngle3 = deg2rad(rand() % 90 - 45);
|
||||||
|
float randAngle4 = deg2rad(rand() % 180 - 90);
|
||||||
|
|
||||||
|
vector<float> qi = {randAngle1, randAngle2, randAngle3, randAngle4};
|
||||||
|
computeForwardKinematics(qi[0], qi[1], qi[2], qi[3]);
|
||||||
|
dxlHandler.sendTargetJointPosition(qi);
|
||||||
|
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500)); // biraz bekle
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
float q2 = deg2rad(80);
|
float q2 = deg2rad(80);
|
||||||
|
|
@ -168,8 +183,8 @@ int main(int argc, char** argv)
|
||||||
iLastX = posX;
|
iLastX = posX;
|
||||||
iLastY = posY;
|
iLastY = posY;
|
||||||
|
|
||||||
float pixelToCmX = 640.0f / 30.0f;
|
float pixelToCmX = 640.0f / 60.0f;
|
||||||
float pixelToCmY = 480.0f / 22.5f;
|
float pixelToCmY = 480.0f / 45.0f;
|
||||||
x = (posX - 320.0f) / pixelToCmX;
|
x = (posX - 320.0f) / pixelToCmX;
|
||||||
y = (240.0f - posY) / pixelToCmY;
|
y = (240.0f - posY) / pixelToCmY;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -180,11 +195,21 @@ int main(int argc, char** argv)
|
||||||
continue; // bu frame'i geç, aşağıdaki inverse kinematic vs. çalışmasın
|
continue; // bu frame'i geç, aşağıdaki inverse kinematic vs. çalışmasın
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Yeşil çizgi ekle
|
||||||
|
line(imgOriginal, Point(0, imgOriginal.rows / 2 + PUSH_THRESHOLD_CM * (480.0f / 22.5f)),
|
||||||
|
Point(imgOriginal.cols, imgOriginal.rows / 2 + PUSH_THRESHOLD_CM * (480.0f / 22.5f)),
|
||||||
|
Scalar(0, 255, 0), 2);
|
||||||
|
|
||||||
|
if (y < PUSH_THRESHOLD_CM) { // top çizgiye yaklaştı mı kontrolü
|
||||||
|
pushBallRandomly(_oDxlHandler);
|
||||||
|
continue; // itme sonrası bu frame'i atla
|
||||||
|
}
|
||||||
|
|
||||||
imshow("Thresholded Image", imgThresholded);
|
imshow("Thresholded Image", imgThresholded);
|
||||||
drawMarker(imgOriginal, Point(imgTmp.size().width / 2, imgTmp.size().height / 2), 10, MARKER_CROSS, LINE_8);
|
drawMarker(imgOriginal, Point(imgTmp.size().width / 2, imgTmp.size().height / 2), 10, MARKER_CROSS, LINE_8);
|
||||||
imgOriginal = imgOriginal + imgLines;
|
imgOriginal = imgOriginal + imgLines;
|
||||||
imshow("Original", imgOriginal);
|
imshow("Original", imgOriginal);
|
||||||
// vector<float> qi = {deg2rad(0),deg2rad(80),deg2rad(20),deg2rad(90)};
|
|
||||||
vector<float> qi = computeInverseKinematics(x, y);
|
vector<float> qi = computeInverseKinematics(x, y);
|
||||||
computeForwardKinematics(qi[0], qi[1], qi[2], qi[3]);
|
computeForwardKinematics(qi[0], qi[1], qi[2], qi[3]);
|
||||||
|
|
||||||
|
|
@ -202,7 +227,7 @@ int main(int argc, char** argv)
|
||||||
bIsImageUndistorted = !bIsImageUndistorted;
|
bIsImageUndistorted = !bIsImageUndistorted;
|
||||||
cout << "[INFO] Image undistorted: " << bIsImageUndistorted << endl;
|
cout << "[INFO] Image undistorted: " << bIsImageUndistorted << endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_oDxlHandler.closePort();
|
_oDxlHandler.closePort();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue