feat: developing.........
This commit is contained in:
@@ -39,7 +39,7 @@ rclcpp_components_register_node(brain_node
|
|||||||
# 4. 安装工程中所有的核心文件夹 (不可遗漏!)
|
# 4. 安装工程中所有的核心文件夹 (不可遗漏!)
|
||||||
install(TARGETS brain_node brain_node_exe
|
install(TARGETS brain_node brain_node_exe
|
||||||
ARCHIVE DESTINATION lib
|
ARCHIVE DESTINATION lib
|
||||||
LIBRARY DESTINATION lib/${PROJECT_NAME}
|
LIBRARY DESTINATION lib
|
||||||
RUNTIME DESTINATION lib/${PROJECT_NAME}
|
RUNTIME DESTINATION lib/${PROJECT_NAME}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ install(TARGETS
|
|||||||
sensor_gateway_node sensor_gateway_node_exe
|
sensor_gateway_node sensor_gateway_node_exe
|
||||||
master_node brain_node
|
master_node brain_node
|
||||||
ARCHIVE DESTINATION lib
|
ARCHIVE DESTINATION lib
|
||||||
LIBRARY DESTINATION lib/${PROJECT_NAME}
|
LIBRARY DESTINATION lib/
|
||||||
RUNTIME DESTINATION lib/${PROJECT_NAME}
|
RUNTIME DESTINATION lib/${PROJECT_NAME}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -2,48 +2,57 @@ import grpc
|
|||||||
from concurrent import futures
|
from concurrent import futures
|
||||||
import time
|
import time
|
||||||
|
|
||||||
# 导入刚才生成的 3 个 Python 契约库
|
|
||||||
import agv_calib_chassis_pb2 as chassis_pb2, agv_calib_chassis_pb2_grpc as chassis_grpc
|
import agv_calib_chassis_pb2 as chassis_pb2, agv_calib_chassis_pb2_grpc as chassis_grpc
|
||||||
import agv_calib_control_pb2 as control_pb2, agv_calib_control_pb2_grpc as control_grpc
|
import agv_calib_control_pb2 as control_pb2, agv_calib_control_pb2_grpc as control_grpc
|
||||||
import agv_calib_sensor_pb2 as sensor_pb2, agv_calib_sensor_pb2_grpc as sensor_grpc
|
import agv_calib_sensor_pb2 as sensor_pb2, agv_calib_sensor_pb2_grpc as sensor_grpc
|
||||||
|
|
||||||
# 1. 伪装物理底盘
|
|
||||||
class FakeChassis(chassis_grpc.AgvCalibChassisServiceServicer):
|
class FakeChassis(chassis_grpc.AgvCalibChassisServiceServicer):
|
||||||
def SetDiagnosticMode(self, request, context):
|
def SetDiagnosticMode(self, request, context):
|
||||||
mode = "纯物理直驱" if request.target_mode == 1 else "正常算法"
|
mode = "纯物理直驱" if request.target_mode == 1 else "正常算法"
|
||||||
print(f"\n[⚙️ 底盘硬件] 收到 Linux 夺权指令!切换至: {mode}模式")
|
print(f"\n[⚙️ 底盘硬件] 收到 Linux 夺权指令!切换至: {mode}模式")
|
||||||
return chassis_pb2.StandardResponse(success=True, message="底盘已交出控制权")
|
return chassis_pb2.StandardResponse(success=True, message="底盘已交出控制权")
|
||||||
|
|
||||||
def StreamHardwareTelemetry(self, request, context):
|
|
||||||
print("[🌊 底盘硬件] 开始向 Linux 推送 50Hz 硬件裸数据流...")
|
|
||||||
while context.is_active():
|
|
||||||
# 疯狂发送假脉冲数据
|
|
||||||
yield chassis_pb2.HardwareState(hardware_timestamp_us=int(time.time()*1000000), encoder_ticks_fl=1024, current_fl_amp=2.5)
|
|
||||||
time.sleep(0.02) # 50Hz
|
|
||||||
|
|
||||||
# 2. 伪装运控大脑
|
|
||||||
class FakeControl(control_grpc.AgvCalibControlServiceServicer):
|
class FakeControl(control_grpc.AgvCalibControlServiceServicer):
|
||||||
def InjectTuningParameters(self, request, context):
|
pass # 暂未调用,保持空壳即可
|
||||||
print(f"\n[🧠 运控大脑] 收到 AI 热注入参数!Kp 被修改为: {request.pid_kp_lateral}")
|
|
||||||
return control_pb2.StandardResponse(success=True, message="PID参数已瞬间写入内存")
|
|
||||||
|
|
||||||
# 3. 伪装传感器代理
|
|
||||||
class FakeSensor(sensor_grpc.SensorCalibrationServiceServicer):
|
class FakeSensor(sensor_grpc.SensorCalibrationServiceServicer):
|
||||||
def TriggerSyncCapture(self, request, context):
|
def TriggerSyncCapture(self, request, context):
|
||||||
print(f"\n[📷 传感器代理] 收到冻结指令!要求拍摄: {request.sensor_ids}")
|
print(f"\n[📷 传感器代理] 收到冻结指令!要求拍摄: {request.sensor_ids}")
|
||||||
time.sleep(0.5) # 模拟硬件快门延迟
|
time.sleep(0.5)
|
||||||
print("[📷 传感器代理] 咔嚓!照片和点云已锁存。取件码: 999888777")
|
print("[📷 传感器代理] 咔嚓!照片和点云已锁存。取件码: 999888777")
|
||||||
|
# 🚨 吐出取件码给行为树!
|
||||||
return sensor_pb2.CaptureResponse(success=True, capture_timestamp_us=999888777)
|
return sensor_pb2.CaptureResponse(success=True, capture_timestamp_us=999888777)
|
||||||
|
|
||||||
|
# 🚨 终极大招:模拟 2MB 大文件的流式分块发送!
|
||||||
|
def DownloadImage(self, request, context):
|
||||||
|
print(f"\n[📥 传感器代理] 收到大文件拉取请求!取件码: {request.capture_timestamp_us}, 传感器: {request.sensor_id}")
|
||||||
|
print("[🌊 传感器代理] 正在切割 2MB 的无损 PNG 假图片,以 512KB 碎片流式发往 Linux...")
|
||||||
|
|
||||||
|
chunk_size = 512 * 1024 # 每次切 512KB
|
||||||
|
total_chunks = 4 # 发 4 次,共 2MB
|
||||||
|
|
||||||
|
for i in range(total_chunks):
|
||||||
|
is_last = (i == total_chunks - 1)
|
||||||
|
# 伪造一点假二进制数据 (带个 PNG 文件头,否则后续 OpenCV 可能会报格式错)
|
||||||
|
dummy_data = b'\x89PNG\r\n\x1a\n' + b'\x00' * (chunk_size - 8) if i == 0 else b'\x00' * chunk_size
|
||||||
|
|
||||||
|
yield sensor_pb2.FileChunk(
|
||||||
|
chunk_data=dummy_data,
|
||||||
|
is_last_chunk=is_last,
|
||||||
|
format_ext="png"
|
||||||
|
)
|
||||||
|
time.sleep(0.3) # 故意制造网络延迟,观察网关如何应对
|
||||||
|
|
||||||
|
print("[📥 传感器代理] ✅ 2MB 碎片流全部分发完毕!")
|
||||||
|
|
||||||
def serve():
|
def serve():
|
||||||
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
|
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
|
||||||
# 三大假硬件全挂载到同一个网络端口!
|
|
||||||
chassis_grpc.add_AgvCalibChassisServiceServicer_to_server(FakeChassis(), server)
|
chassis_grpc.add_AgvCalibChassisServiceServicer_to_server(FakeChassis(), server)
|
||||||
control_grpc.add_AgvCalibControlServiceServicer_to_server(FakeControl(), server)
|
control_grpc.add_AgvCalibControlServiceServicer_to_server(FakeControl(), server)
|
||||||
sensor_grpc.add_SensorCalibrationServiceServicer_to_server(FakeSensor(), server)
|
sensor_grpc.add_SensorCalibrationServiceServicer_to_server(FakeSensor(), server)
|
||||||
|
|
||||||
server.add_insecure_port('[::]:50051')
|
server.add_insecure_port('[::]:50051')
|
||||||
print("🚀 [全能 Windows 假车端] 已启动,正在监听 50051 端口,等待 ROS 2 召唤...")
|
print("🚀 [全能 Windows 假车端] 已启动,监听 50051 端口,等待 ROS 2 召唤...")
|
||||||
server.start()
|
server.start()
|
||||||
server.wait_for_termination()
|
server.wait_for_termination()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user