解决了一下 机器转向的问题

This commit is contained in:
mmc
2026-07-07 16:06:40 +08:00
parent 502993915d
commit 6e93d037de
8 changed files with 87 additions and 64 deletions

2
env.js
View File

@@ -18,7 +18,7 @@ const envConfig = {
baseURL: 'http://1.95.137.212:8081',//http://192.168.2.56:8081 baseURL: 'http://1.95.137.212:8081',//http://192.168.2.56:8081
//baseURL: 'https://serviceri.satabot.com', //baseURL: 'https://serviceri.satabot.com',
WS_URL: 'ws://1.95.137.212:9002/ws/', WS_URL: 'ws://1.95.137.212:9002/ws/',
mqtt_url: "ws://1.95.137.212:59021/mqtt", mqtt_url: "ws://1.95.137.212:8083/mqtt",
geoserver_url: "http://1.95.137.212:59018/geoserver" geoserver_url: "http://1.95.137.212:59018/geoserver"
//baseURL: 'http://1.95.137.212:59015',//http://192.168.2.56:8081 //baseURL: 'http://1.95.137.212:59015',//http://192.168.2.56:8081

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 B

View File

@@ -1,7 +1,7 @@
import React, { useEffect, useRef, useState, useMemo, useImperativeHandle, forwardRef, useCallback } from 'react'; import React, { useEffect, useRef, useState, useMemo, useImperativeHandle, forwardRef, useCallback } from 'react';
import carImg from '../assets/images/car.png'; import carImg from '../assets/images/carplane.png';
import inspectImg from "../assets/images/inspectCar.png" import inspectImg from "../assets/images/inspectCar.png"
import planeImg from '../assets/images/plane.png'; import planeImg from '../assets/images/planeicon.png';
import cameraImg from '../assets/images/camera.png'; import cameraImg from '../assets/images/camera.png';
import droneInspectImg from '../assets/images/xunjiancar.png'; import droneInspectImg from '../assets/images/xunjiancar.png';
import gecocar from '../assets/images/gecaocar.png'; import gecocar from '../assets/images/gecaocar.png';
@@ -65,6 +65,8 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
const realtimeCarEntityRef = useRef(null); const realtimeCarEntityRef = useRef(null);
const realtimeLastPointRef = useRef(null); const realtimeLastPointRef = useRef(null);
const realtimeHiddenRef = useRef(false); const realtimeHiddenRef = useRef(false);
const focusEntityRef = useRef(null);
const yellowCircleCanvas = useMemo( const yellowCircleCanvas = useMemo(
() => createYellowCircleCanvas(30), () => createYellowCircleCanvas(30),
@@ -290,6 +292,7 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
}; };
useEffect(() => { useEffect(() => {
if (viewerRef.current) { if (viewerRef.current) {
drawTrackLine(points); drawTrackLine(points);
@@ -722,8 +725,8 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
position, position,
billboard: { billboard: {
image: carImg, image: carImg,
width: 60, width: 30,
height: 60, height: 30,
verticalOrigin: window.Cesium.VerticalOrigin.BOTTOM, verticalOrigin: window.Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY disableDepthTestDistance: Number.POSITIVE_INFINITY
}, },
@@ -784,7 +787,6 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
}; };
}, []); }, []);
const focusEntityRef = useRef(null);
useEffect(() => { useEffect(() => {
// 如果有 realtimePosition,不显示 focusEntity // 如果有 realtimePosition,不显示 focusEntity
@@ -824,8 +826,8 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
position: Cesium.Cartesian3.fromDegrees(Number(focusLocation.lon), Number(focusLocation.lat), 0), position: Cesium.Cartesian3.fromDegrees(Number(focusLocation.lon), Number(focusLocation.lat), 0),
billboard: { billboard: {
image: image, image: image,
width: 60, width: 30,
height: 60, height: 30,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM, verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY, disableDepthTestDistance: Number.POSITIVE_INFINITY,
}, },
@@ -963,8 +965,8 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
orientation: orientation, orientation: orientation,
billboard: { billboard: {
image: carImg, image: carImg,
width: 50, width: 30,
height: 50, height: 30,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM, verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
disableDepthTestDistance: Number.POSITIVE_INFINITY, disableDepthTestDistance: Number.POSITIVE_INFINITY,
color: Cesium.Color.YELLOW.withAlpha(0.8), color: Cesium.Color.YELLOW.withAlpha(0.8),
@@ -1153,9 +1155,9 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
// ============================== // ==============================
let image = carImg; let image = carImg;
let width = 60; let width = 30;
let height = 60; let height = 30;
const carsize = device?.productId == 138 ? 40 : 60; const carsize = device?.productId == 138 ? 30 : 30;
@@ -1180,14 +1182,14 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
device?.type === "plane" || device?.type === "plane" ||
device?.type === "drone" || device?.type === "drone" ||
device?.type === "drone-inspect" device?.type === "drone-inspect"
? 70 ? 30
: carsize; : carsize;
height = height =
device?.type === "plane" || device?.type === "plane" ||
device?.type === "drone" || device?.type === "drone" ||
device?.type === "drone-inspect" device?.type === "drone-inspect"
? 70 ? 30
: carsize; : carsize;
} }
@@ -1554,9 +1556,9 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
const dx = last.lon - lon; const dx = last.lon - lon;
const dy = last.lat - lat; const dy = last.lat - lat;
const dist = Math.sqrt(dx * dx + dy * dy); const dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 0.0000001) { //if (dist < 0.0000001) {
shouldAdd = false; // shouldAdd = false;
} //}
} }
if (shouldAdd && drawRealTime) { if (shouldAdd && drawRealTime) {
@@ -1585,14 +1587,18 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
// 无人机图标 // 无人机图标
const img = realtimeType === 'plane' || realtimeType === 'drone' ? planeImg : carImg; const img = realtimeType === 'plane' || realtimeType === 'drone' ? planeImg : carImg;
const imgWidth = 70; const imgWidth = 30;
const imgHeight = 70; const imgHeight = 30;
// 如果有航向角,设置旋转 // 如果有航向角,设置旋转
let rotation = 0; let rotation = 0;
if (realtimePosition?.heading !== undefined && !isNaN(Number(realtimePosition.heading))) { if (realtimePosition?.heading !== undefined && !isNaN(Number(realtimePosition.heading))) {
let headingDeg = Number(realtimePosition.heading); let headingDeg = Number(realtimePosition.heading);
rotation = Cesium.Math.toRadians(headingDeg); rotation = Cesium.Math.toRadians(headingDeg);
} }
//rotation = Cesium.Math.toRadians(-3.17); //rotation = Cesium.Math.toRadians(-3.17);
@@ -1707,16 +1713,17 @@ const CesiumMap = React.forwardRef(({ ifClear, ifClearPlanLine, ifClearNavLine,
// 机器人图标 // 机器人图标
const img = carImg; const img = carImg;
const imgWidth = 60; const imgWidth = 30;
const imgHeight = 60; const imgHeight = 30;
// 如果有航向角,设置旋转 // 如果有航向角,设置旋转
let rotation = 0; let rotation = 0;
if (realtimePosition?.heading !== undefined && !isNaN(Number(realtimePosition.heading))) { if (realtimePosition?.heading !== undefined && !isNaN(Number(realtimePosition.heading))) {
let headingDeg = Number(realtimePosition.heading); let headingDeg = Number(realtimePosition.heading);
rotation = Cesium.Math.toRadians(headingDeg); rotation = Cesium.Math.toRadians(headingDeg);
} }
if (!realtimeCarEntityRef.current) { if (!realtimeCarEntityRef.current) {
realtimeCarEntityRef.current = viewer.entities.add({ realtimeCarEntityRef.current = viewer.entities.add({
position: position, position: position,

View File

@@ -438,6 +438,7 @@ export default function ErrorManagement() {
]; ];
return ( return (
<div style={{ padding: '8px 0px', paddingTop: 8, background: '#f5f7fa', minHeight: 'calc(100vh - 120px)' }}> <div style={{ padding: '8px 0px', paddingTop: 8, background: '#f5f7fa', minHeight: 'calc(100vh - 120px)' }}>
<AntdCard title="错误管理" style={{ borderRadius: 8 }}> <AntdCard title="错误管理" style={{ borderRadius: 8 }}>
@@ -506,7 +507,7 @@ export default function ErrorManagement() {
columns={columns} columns={columns}
dataSource={errorList} dataSource={errorList}
loading={loading} loading={loading}
scroll={{ x: 1400, y: 'calc(100vh - 380px)' }} scroll={{ x: 1400, y: 1200 }}
pagination={{ pagination={{
current: params.pageNum, current: params.pageNum,
pageSize: params.pageSize, pageSize: params.pageSize,

View File

@@ -17,6 +17,7 @@ import {
} from '@ant-design/icons'; } from '@ant-design/icons';
import DroneLivePlayer from '../VolcRtcPlayer.jsx'; import DroneLivePlayer from '../VolcRtcPlayer.jsx';
import DroneVideoPlayer from './DroneVideoPlayer'; import DroneVideoPlayer from './DroneVideoPlayer';
import AgoraTextTest from '../AgoraRtc.tsx'; import AgoraTextTest from '../AgoraRtc.tsx';
@@ -642,7 +643,7 @@ export default function DeviceOverviewPage({ onViewStatus, selectedSn, onDeviceS
title: '操作', title: '操作',
key: 'action', key: 'action',
width: 80, width: 80,
fixed: 'right', //fixed: 'right',
render: (_, record) => ( render: (_, record) => (
<Space size={4}> <Space size={4}>
{/* 编辑按钮绑定弹窗 */} {/* 编辑按钮绑定弹窗 */}
@@ -655,7 +656,7 @@ export default function DeviceOverviewPage({ onViewStatus, selectedSn, onDeviceS
<Button size="small" type="text" icon={<SettingOutlined />} /> <Button size="small" type="text" icon={<SettingOutlined />} />
</Space> </Space>
) )
},]} }]}
dataSource={dynamicScheduleList} dataSource={dynamicScheduleList}
scroll={{ x: 'max-content', y: 280 }} scroll={{ x: 'max-content', y: 280 }}
/> />
@@ -676,6 +677,7 @@ export default function DeviceOverviewPage({ onViewStatus, selectedSn, onDeviceS
</Col> </Col>
<Col xs={24} lg={10}> <Col xs={24} lg={10}>
<Card title={<><SettingOutlined style={{ marginRight: 6, }} /> 设备控制面板</>} bordered={false} style={{ borderRadius: 8, marginBottom: 8 }} bodyStyle={{ padding: 12, paddingBottom: 0 }}> <Card title={<><SettingOutlined style={{ marginRight: 6, }} /> 设备控制面板</>} bordered={false} style={{ borderRadius: 8, marginBottom: 8 }} bodyStyle={{ padding: 12, paddingBottom: 0 }}>
<Select <Select
style={{ width: "80%", marginBottom: 8 }} style={{ width: "80%", marginBottom: 8 }}

View File

@@ -76,6 +76,43 @@ export default function DeviceStatusPage({
const [devicesAll, setDevicesAll] = useState([]); const [devicesAll, setDevicesAll] = useState([]);
const [arrivedPoint, setArrivedPoint] = useState(null);//完成点 const [arrivedPoint, setArrivedPoint] = useState(null);//完成点
const [isLoopMode, setIsLoopMode] = useState(true); const [isLoopMode, setIsLoopMode] = useState(true);
const controllerRef = useRef<DeviceController | null>(null);
const [messageApi, contextHolder] = message.useMessage();
const [isControlled, setIsControlled] = useState(false);
const [hasControlRight, setHasControlRight] = useState(false);
const [connecting, setConnecting] = useState(false);
const [wsStatus, setWsStatus] = useState('disconnected');
const [wsDeviceInfo, setWsDeviceInfo] = useState({});
// 👇 加上这两个
const [queryTimeRange, setQueryTimeRange] = useState([]); // 时间范围
const [startTimestamp, setStartTimestamp] = useState(''); // 开始时间戳
const [endTimestamp, setEndTimestamp] = useState(''); // 结束时间戳
const [isModalOpen, setIsModalOpen] = useState(false);
const [modalContent, setModalContent] = useState({
title: '',
content: '',
});
const [mowerView, setMowerView] = useState('front');
const [uavState, setUavState] = useState<any>(null);
const [points, setPoints] = useState([]);
const [clearNavLine, setClearNavLine] = useState(0);
const [clearPlanLine, setClearPlanLine] = useState(0);
const timerRef = useRef<any>(null);
// 打点相关状态
const [markedPoints, setMarkedPoints] = useState([]); // 标记的点
const [completeFlag, setCompleteFlag] = useState(false); // 是否完成路径规划
const [savePath, setSavePath] = useState(null); // 保存的路径数据
const [isSaveModalVisible, setIsSaveModalVisible] = useState(false); // 保存模态框可见性
const [plotName, setPlotName] = useState(''); // 地块名称
const [isSaving, setIsSaving] = useState(false); // 是否正在保存
const mapRef = useRef(null); // 地图 ref
// 开关切换回调 // 开关切换回调
const handleChange = (checked: boolean) => { const handleChange = (checked: boolean) => {
@@ -297,43 +334,7 @@ export default function DeviceStatusPage({
// 实时位置数据(用于地图) // 实时位置数据(用于地图)
const [messageApi, contextHolder] = message.useMessage();
const controllerRef = useRef<DeviceController | null>(null);
const [isControlled, setIsControlled] = useState(false);
const [hasControlRight, setHasControlRight] = useState(false);
const [connecting, setConnecting] = useState(false);
const [wsStatus, setWsStatus] = useState('disconnected');
const [wsDeviceInfo, setWsDeviceInfo] = useState({});
const [selectedDrone, setSelectedDrone] = useState(null);
const [taskList, setTaskList] = useState([]);
// 👇 加上这两个
const [queryTimeRange, setQueryTimeRange] = useState([]); // 时间范围
const [startTimestamp, setStartTimestamp] = useState(''); // 开始时间戳
const [endTimestamp, setEndTimestamp] = useState(''); // 结束时间戳
const [isModalOpen, setIsModalOpen] = useState(false);
const [modalContent, setModalContent] = useState({
title: '',
content: '',
});
const [mowerView, setMowerView] = useState('front');
const [uavState, setUavState] = useState<any>(null);
const [points, setPoints] = useState([]);
const [clearNavLine, setClearNavLine] = useState(0);
const [clearPlanLine, setClearPlanLine] = useState(0);
const timerRef = useRef<any>(null);
// 打点相关状态
const [markedPoints, setMarkedPoints] = useState([]); // 标记的点
const [completeFlag, setCompleteFlag] = useState(false); // 是否完成路径规划
const [savePath, setSavePath] = useState(null); // 保存的路径数据
const [isSaveModalVisible, setIsSaveModalVisible] = useState(false); // 保存模态框可见性
const [plotName, setPlotName] = useState(''); // 地块名称
const [isSaving, setIsSaving] = useState(false); // 是否正在保存
const mapRef = useRef(null); // 地图 ref
const runningStatus = useMemo(() => { const runningStatus = useMemo(() => {
// 判断对象是否为空 // 判断对象是否为空
@@ -382,7 +383,8 @@ export default function DeviceStatusPage({
return { return {
lon: robotLon, lon: robotLon,
lat: robotLat, lat: robotLat,
heading: runningStatus.pitch || wsDeviceInfo.pitch || 0, //heading: 0
heading: runningStatus.yaw || wsDeviceInfo.yaw || 0,
}; };
} }
@@ -420,7 +422,11 @@ export default function DeviceStatusPage({
}, []); }, []);
useEffect(() => { useEffect(() => {
if (!device || !controllerRef.current || !device?.serialNumber || isUAV) return; if (!device || !controllerRef.current || !device?.serialNumber || isUAV) {
//controllerRef.current?.destroy();
//setWsDeviceInfo({});
return;
}
setWsDeviceInfo({}); setWsDeviceInfo({});
controllerRef.current.connectDevice(device); controllerRef.current.connectDevice(device);

View File

@@ -142,6 +142,12 @@ h4, .ant-typography h4 { font-size: clamp(1rem, 1.5vw, 1.25rem) !important; }
} }
.ant-table-body {
overflow: auto !important; /* 超出高度时显示滚动条 */
}
@keyframes sunRotate { @keyframes sunRotate {
from { transform: rotate(0deg); } from { transform: rotate(0deg); }
@@ -155,3 +161,4 @@ h4, .ant-typography h4 { font-size: clamp(1rem, 1.5vw, 1.25rem) !important; }
0% { transform: translateY(0); opacity: 1; } 0% { transform: translateY(0); opacity: 1; }
100% { transform: translateY(12px); opacity: 0.4; } 100% { transform: translateY(12px); opacity: 0.4; }
} }