Skip to content

Commit 33fdc23

Browse files
committed
2 parents 4705ccf + dc53b2e commit 33fdc23

File tree

114 files changed

+425
-67745
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+425
-67745
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
#include "mg90s.h"
2+
#include <iostream>
3+
#include <vector>
4+
#include <thread>
5+
#include <unistd.h>
6+
7+
// 初始化外部变量
8+
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
9+
10+
// 初始化静态成员变量
11+
bool mg90s::initialized = false;
12+
int mg90s::instances = 0;
13+
14+
// Constructor implementation
15+
mg90s::mg90s(int channel, float initialAngle) : channel(channel), currentAngle(initialAngle) {
16+
if (!initialized) {
17+
pwm.begin();
18+
pwm.setPWMFreq(50); // Set to servo standard 50 Hz refresh rate
19+
initialized = true;
20+
}
21+
instances++;
22+
gpioServo(channel, angleToPulseWidth(currentAngle));
23+
}
24+
25+
// Destructor implementation
26+
mg90s::~mg90s() {
27+
if (--instances <= 0) {
28+
pwm.reset();
29+
initialized = false;
30+
}
31+
}
32+
33+
// Asynchronously set the target angle
34+
void mg90s::setTargetAngleAsync(float angle, CallbackFunction callback) {
35+
onTargetReached = callback;
36+
std::thread(&mg90s::detectAngle, this, angle).detach();
37+
}
38+
39+
// Detect and clamp the angle before moving
40+
void mg90s::detectAngle(float angle) {
41+
if (angle < -90) {
42+
angle = -90;
43+
} else if (angle > 90) {
44+
angle = 90;
45+
}
46+
moveToAngleSlowly(angle);
47+
}
48+
49+
// Smoothly move to the target angle
50+
void mg90s::moveToAngleSlowly(float targetAngle) {
51+
float step = (targetAngle > currentAngle) ? 1 : -1;
52+
53+
while (currentAngle != targetAngle) {
54+
currentAngle += step;
55+
if ((step > 0 && currentAngle > targetAngle) || (step < 0 && currentAngle < targetAngle)) {
56+
currentAngle = targetAngle;
57+
}
58+
int pulseWidth = angleToPulseWidth(currentAngle);
59+
gpioServo(channel, pulseWidth);
60+
usleep(20000); // 20ms delay to simulate smooth movement
61+
}
62+
63+
if (onTargetReached) {
64+
onTargetReached();
65+
}
66+
}
67+
68+
// Convert angle to PWM pulse width
69+
int mg90s::angleToPulseWidth(float angle) {
70+
float pulseLength = ((angle + 90) * (2000 - 500) / 180 + 500); // Map from -90 to +90 to 500 to 2500
71+
int pulseWidth = static_cast<int>((pulseLength * 4096 / 20000)); // Map to 0-4095 for PCA9685
72+
return pulseWidth;
73+
}
74+
75+
// Set servo PWM via PCA9685
76+
void mg90s::gpioServo(int channel, int pulseWidth) {
77+
int on = 0; // Start of the PWM pulse
78+
pwm.setPWM(channel, on, pulseWidth);
79+
}
80+
81+
// Additional functions and logic can be added as required
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#ifndef ARM_SYS_H
2+
#define ARM_SYS_H
3+
4+
#include <functional>
5+
#include <Adafruit_PWMServoDriver.h>
6+
7+
extern Adafruit_PWMServoDriver pwm; // 声明,实际的定义在.cpp文件中
8+
9+
class mg90s {
10+
public:
11+
using CallbackFunction = std::function<void()>;
12+
13+
mg90s(int channel, float initialAngle = 0.0);
14+
~mg90s();
15+
16+
void setTargetAngleAsync(float angle, CallbackFunction callback = nullptr);
17+
18+
private:
19+
static bool initialized; // 声明静态成员变量
20+
static int instances; // 声明静态成员变量
21+
int channel; // PWM channel on PCA9685
22+
float currentAngle;
23+
CallbackFunction onTargetReached;
24+
25+
void moveToAngleSlowly(float targetAngle);
26+
int angleToPulseWidth(float angle);
27+
void detectAngle(float angle);
28+
void gpioServo(int channel, int pulseWidth);
29+
};
30+
31+
#endif // ARM_SYS_H
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#include "arm_sys.h"
2+
#include <iostream>
3+
#include <unistd.h> // 用于 sleep 函数
4+
5+
int main() {
6+
// 假设 PCA9685 的四个电机通道分别为 0, 1, 2, 和 3
7+
mg90s arm_mtr1(0, 0.0); // 在通道 0 初始化电机1,起始角度为 0 度
8+
mg90s arm_mtr2(1, 0.0); // 在通道 1 初始化电机2,起始角度为 0 度
9+
mg90s arm_mtr3(2, 0.0); // 在通道 2 初始化电机3,起始角度为 0 度
10+
mg90s arm_mtr4(3, 0.0); // 在通道 3 初始化电机4,起始角度为 0 度
11+
12+
// 回调函数
13+
auto onTargetReached = []() {
14+
std::cout << "目标角度已到达。" << std::endl;
15+
};
16+
17+
// 异步设定每个电机的目标角度
18+
arm_mtr1.setTargetAngleAsync(45, onTargetReached); // 设定电机1到 45 度
19+
arm_mtr2.setTargetAngleAsync(-45, onTargetReached); // 设定电机2到 -45 度
20+
arm_mtr3.setTargetAngleAsync(30, onTargetReached); // 设定电机3到 30 度
21+
arm_mtr4.setTargetAngleAsync(-30, onTargetReached); // 设定电机4到 -30 度
22+
23+
// 稍等片刻让电机达到目标角度
24+
sleep(5); // 睡眠 5 秒以等待运动完成
25+
26+
27+
return 0;
28+
}

Basic_Development/Car_Control/3.0/CarControl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
CarControl* CarControl::instance = nullptr;
1919

2020
const float speed_cm_per_sec_forward_backward = 26.0; // Car's speed in cm/s (30 dc motor speed)
21-
const float speed_deg_per_sec_turn = 50.0; // Car's turning speed in degrees per second
21+
const float speed_deg_per_sec_turn = 47.0; // Car's turning speed in degrees per second
2222

2323
// Constructor is private to enforce singleton pattern
2424
CarControl::CarControl() : _motorAiPn1(5), _motorAPin2(13), _motorBPin1(26), _motorBPin2(16),

Basic_Development/Car_Control/3.0/main.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,36 @@ int main() {
1818
CarControl* car = CarControl::getInstance();
1919
car->initialize();
2020

21-
// First, move forward by 100 cm
21+
//boundary of the shop
22+
car->moveForward(155, []() {
23+
std::cout << "Moved 180 cm forward.\n";
24+
});
25+
26+
car->turnRight(90, []() {
27+
std::cout << "Turned right by 90 degrees.\n";
28+
});
29+
30+
car->moveForward(35, []() {
31+
std::cout << "Moved 100 cm forward.\n";
32+
});
33+
34+
car->turnRight(90, []() {
35+
std::cout << "Turned right by 90 degrees.\n";
36+
});
37+
38+
car->moveForward(133, []() {
39+
std::cout << "Moved 100 cm forward.\n";
40+
});
41+
42+
car->turnRight(90, []() {
43+
std::cout << "Turned right by 90 degrees.\n";
44+
});
45+
46+
car->moveForward(57, []() {
47+
std::cout << "Moved 100 cm forward.\n";
48+
});
49+
50+
/* // First, move forward by 100 cm
2251
car->moveForward(100, []() {
2352
std::cout << "Moved 100 cm forward.\n";
2453
});
@@ -52,6 +81,7 @@ int main() {
5281
std::cout << "Turned left by 90 degrees.\n";
5382
});
5483
std::this_thread::sleep_for(std::chrono::seconds(3));
84+
*/
5585

5686
// Print the current position and heading of the car
5787
std::cout << "Current Position: (" << car->getXPosition() << ", " << car->getYPosition() << ")" << std::endl;

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ include_directories(${PROJECT_SOURCE_DIR}/include/sys)
5858
include_directories(${PROJECT_SOURCE_DIR}/src/sys)
5959
include_directories(${PROJECT_SOURCE_DIR}/src/sensors)
6060
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets PrintSupport REQUIRED)
61+
target_link_libraries(SSC PRIVATE ${PCL_LIBRARIES} Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::PrintSupport pigpio)
6162
target_link_libraries(SSC PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::PrintSupport)
6263
target_include_directories(SSC PRIVATE ${PROJECT_SOURCE_DIR}/include/sensors)
6364

Lidar/src/Qt/build-Lida_service-Desktop-Debug/.cmake/api/v1/query/cache-v2

Whitespace-only changes.

Lidar/src/Qt/build-Lida_service-Desktop-Debug/.cmake/api/v1/query/cmakeFiles-v1

Whitespace-only changes.

Lidar/src/Qt/build-Lida_service-Desktop-Debug/.cmake/api/v1/query/codemodel-v2

Whitespace-only changes.

0 commit comments

Comments
 (0)