-
This commit is contained in:
@@ -76,7 +76,7 @@ class AGVController:
|
||||
if rc != 0:
|
||||
logger.warning(f"发布 cmd_vel 失败: {err}")
|
||||
|
||||
def move_forward(self, speed: float = 0.5, duration: float = None):
|
||||
def move_forward(self, speed: float = 1.0, duration: float = None):
|
||||
"""前进"""
|
||||
if not self.is_connected():
|
||||
return
|
||||
@@ -85,7 +85,7 @@ class AGVController:
|
||||
time.sleep(duration)
|
||||
self.stop()
|
||||
|
||||
def move_backward(self, speed: float = 0.5, duration: float = None):
|
||||
def move_backward(self, speed: float = 1.0, duration: float = None):
|
||||
"""后退"""
|
||||
if not self.is_connected():
|
||||
return
|
||||
@@ -94,7 +94,7 @@ class AGVController:
|
||||
time.sleep(duration)
|
||||
self.stop()
|
||||
|
||||
def turn_left(self, speed: float = 0.5, duration: float = None):
|
||||
def turn_left(self, speed: float = 1.0, duration: float = None):
|
||||
"""左转"""
|
||||
if not self.is_connected():
|
||||
return
|
||||
@@ -103,7 +103,7 @@ class AGVController:
|
||||
time.sleep(duration)
|
||||
self.stop()
|
||||
|
||||
def turn_right(self, speed: float = 0.5, duration: float = None):
|
||||
def turn_right(self, speed: float = 1.0, duration: float = None):
|
||||
"""右转"""
|
||||
if not self.is_connected():
|
||||
return
|
||||
@@ -112,7 +112,7 @@ class AGVController:
|
||||
time.sleep(duration)
|
||||
self.stop()
|
||||
|
||||
def move_left_lateral(self, speed: float = 0.5, duration: float = None):
|
||||
def move_left_lateral(self, speed: float = 1.0, duration: float = None):
|
||||
"""向左横向移动"""
|
||||
if not self.is_connected():
|
||||
return
|
||||
@@ -121,7 +121,7 @@ class AGVController:
|
||||
time.sleep(duration)
|
||||
self.stop()
|
||||
|
||||
def move_right_lateral(self, speed: float = 0.5, duration: float = None):
|
||||
def move_right_lateral(self, speed: float = 1.0, duration: float = None):
|
||||
"""向右横向移动"""
|
||||
if not self.is_connected():
|
||||
return
|
||||
@@ -176,7 +176,7 @@ class AGVController:
|
||||
return self._position
|
||||
return None
|
||||
|
||||
def go_to_point(self, x: float, y: float, rz: float = None, speed: float = 0.5) -> bool:
|
||||
def go_to_point(self, x: float, y: float, rz: float = None, speed: float = 1.0) -> bool:
|
||||
"""移动到目标点(需要 ROS2 导航栈)"""
|
||||
logger.warning("go_to_point 需要 ROS2 Nav2 支持,当前仅记录目标")
|
||||
return True
|
||||
|
||||
@@ -14,8 +14,8 @@ ARM_HOST = "192.168.60.88"
|
||||
AGV_CONFIG = {
|
||||
"device": "/dev/agvpro_controller",
|
||||
"baudrate": 10000000,
|
||||
"move_speed": 0.5,
|
||||
"turn_speed": 0.5,
|
||||
"move_speed": 1.0,
|
||||
"turn_speed": 1.0,
|
||||
}
|
||||
|
||||
# ========== 机械臂 TCP 客户端 ==========
|
||||
@@ -77,7 +77,7 @@ JOINT_LIMITS = {
|
||||
}
|
||||
|
||||
# ========== 机械臂默认速度 ==========
|
||||
DEFAULT_ARM_SPEED = 500
|
||||
DEFAULT_ARM_SPEED = 1000
|
||||
|
||||
# ========== 状态定义 ==========
|
||||
class State:
|
||||
|
||||
@@ -101,11 +101,10 @@ class MissionExecutorV3:
|
||||
self._nav = Nav2Navigator()
|
||||
|
||||
# 速度控制(默认值,可在 execute_mission 时覆写)
|
||||
self.arm_speed = 500
|
||||
self.agv_speed = 0.5
|
||||
self.arm_speed = 1000
|
||||
self.agv_speed = 1.0
|
||||
|
||||
# 照片上传序号计数器(连续递增,从1开始)
|
||||
self.next_upload_index = 1
|
||||
|
||||
# ==================== 连接 ====================
|
||||
|
||||
@@ -239,8 +238,7 @@ class MissionExecutorV3:
|
||||
self._log(f"📍 点位蛇形路径: {len(path)} 个点位, {total_machines} 台机器")
|
||||
|
||||
# 重置照片上传序号(每次任务开始时重置,从1开始)
|
||||
self.next_upload_index = 1
|
||||
|
||||
|
||||
# 任务步骤控制开关
|
||||
if options is None:
|
||||
options = {}
|
||||
@@ -258,8 +256,8 @@ class MissionExecutorV3:
|
||||
has_arm_pose = self.arm_client and any(abs(a) > 0.01 for a in arm_initial_pose)
|
||||
|
||||
# 速度控制(从前端传入)
|
||||
self.arm_speed = int(options.get("arm_speed", 500))
|
||||
self.agv_speed = float(options.get("agv_speed", 0.5))
|
||||
self.arm_speed = int(options.get("arm_speed", 1000))
|
||||
self.agv_speed = float(options.get("agv_speed", 1.0))
|
||||
self._log(f"🚀 AGV速度={self.agv_speed:.1f}m/s, 机械臂速度={self.arm_speed}")
|
||||
|
||||
# 设置 Nav2 导航速度(仅在任务开始时设一次)
|
||||
@@ -831,9 +829,8 @@ class MissionExecutorV3:
|
||||
self.arm_client.set_angles(angles, speed=self.arm_speed)
|
||||
self._wait_arm_ready(angles)
|
||||
|
||||
# 拍照(upload_index 连续递增)
|
||||
path = self._capture_arm_photo(row, col, side, pi + 1, qr_value, upload_index=self.next_upload_index)
|
||||
self.next_upload_index += 1
|
||||
# 拍照(每台机器独立从0开始编号)
|
||||
path = self._capture_arm_photo(row, col, side, pi + 1, qr_value, upload_index=pi + 1)
|
||||
if path:
|
||||
self._log(f" 💾 {os.path.basename(path)}")
|
||||
|
||||
@@ -842,7 +839,7 @@ class MissionExecutorV3:
|
||||
upload_index: int = 0) -> Optional[str]:
|
||||
"""从机械臂摄像头拍照,直接上传到服务器(不保存本地)
|
||||
|
||||
upload_index: 从1开始,先正面后背面,由调用方维护
|
||||
upload_index: 每台机器独立,从0开始
|
||||
"""
|
||||
try:
|
||||
resp = requests.get(ARM_CAMERA_SNAPSHOT, timeout=10)
|
||||
@@ -892,6 +889,32 @@ class MissionExecutorV3:
|
||||
self._log(f" ❌ 上传异常 [{index}]: {e}")
|
||||
return False
|
||||
|
||||
def _upload_photo_bytes(self, filename: str, image_data: bytes, serial_number: str, index: int) -> bool:
|
||||
"""上传照片 bytes 到远程服务器(不保存本地文件)
|
||||
|
||||
Args:
|
||||
filename: 文件名(用于服务器存储)
|
||||
image_data: 图片二进制数据
|
||||
serial_number: 二维码/序列号
|
||||
index: 上传序号(从1开始递增)
|
||||
"""
|
||||
try:
|
||||
headers = {
|
||||
"Authorization": "Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6ImZhNTNkZTZiLWE3NjYtNDZmNC05MDUyLTQ2MjUzZTAyNjdmNSIsInVzZXJuYW1lIjoiYWRtaW4ifQ.lC4vKThZo4aAOLsekm2kPgaEJRqRx-YDQWKfHFqxdPNESCKy57l3eIqaKTj2ZjAMaoYAwYlMrv5M1zAOJsO_PA"
|
||||
}
|
||||
files = {"file": (filename, image_data, "image/jpeg")}
|
||||
data = {"serialNumber": serial_number, "index": str(index)}
|
||||
resp = requests.post(UPLOAD_URL, files=files, data=data, headers=headers, timeout=30)
|
||||
if resp.status_code == 200:
|
||||
self._log(f" ☁️ 上传成功 [{index}]: {filename}")
|
||||
return True
|
||||
else:
|
||||
self._log(f" ⚠️ 上传失败 [{index}] HTTP {resp.status_code}: {resp.text[:200]}")
|
||||
return False
|
||||
except Exception as e:
|
||||
self._log(f" ❌ 上传异常 [{index}]: {e}")
|
||||
return False
|
||||
|
||||
# ==================== 控制 ====================
|
||||
|
||||
def _wait_pause(self):
|
||||
|
||||
Reference in New Issue
Block a user