1215 lines
39 KiB
JSON
1215 lines
39 KiB
JSON
{
|
|
"Devices": {
|
|
"YNZDH_Rfhandle": {
|
|
"DeviceId": "rfhandle-YNZDH-001",
|
|
"Enabled": true,
|
|
"DeviceName": "YNZDH_RfHandle",
|
|
"DeviceType": "RfHandle",
|
|
"DriverName": "YNZDH_RfHandle",
|
|
"DriverVersion": "1.0.0",
|
|
"Connection": {
|
|
"Port": "/dev/ttyS0",
|
|
"BaudRate": 9600,
|
|
"AxisCount": 4,
|
|
"ButtonCount": 8,
|
|
"HatCount": 1,
|
|
"AutoReconnectEnabled": true
|
|
}
|
|
},
|
|
"BatteryTada": {
|
|
"DeviceId": "battery-tada-001",
|
|
"Enabled": false,
|
|
"DeviceName": "Battery Tada 1",
|
|
"DeviceType": "Battery",
|
|
"DriverName": "TadaBattery",
|
|
"DriverVersion": "1.0.0",
|
|
"Connection": {
|
|
"Port": "/dev/ttyS1",
|
|
"BaudRate": 19200,
|
|
"AutoReconnectEnabled": true,
|
|
"ReconnectDelayMs": 3000,
|
|
"MaxReconnectAttempts": 0
|
|
}
|
|
},
|
|
"MBDV_Servo01": {
|
|
"DeviceId": "right-wheel",
|
|
"Enabled": true,
|
|
"DeviceType": "CiA402Servo",
|
|
"DeviceName": "Right Wheel Servo",
|
|
"DriverName": "CiA402Servo",
|
|
"DriverVersion": "1.0.0",
|
|
"Description": "Right Wheel servo motor (Profile Velocity mode)",
|
|
"Connection": {
|
|
"CanInterface": "can0",
|
|
"NodeId": "1",
|
|
"AutoReconnectEnabled": true,
|
|
"ReconnectDelayMs": 3000,
|
|
"MaxReconnectAttempts": 0,
|
|
"PdoConfigRetryCount": 3,
|
|
"PdoConfigRetryTimeoutMs": 1000,
|
|
"UseHeartbeatCheck": true,
|
|
"AllowedHomingMethods": [],
|
|
"ObjectInitialValues": [],
|
|
"PdoMappings": {
|
|
"_Comment": "CiA402 Object Dictionary Index Definitions: 0x6040=Controlword[WO UINT16] - State machine control (Enable/Disable/Fault Reset), 0x6041=Statusword[RO UINT16] - Motor status (Ready/Enabled/Fault), 0x6060=ModesOfOperation[RW INT8] - Operation mode (1=PP/3=PV/4=PT/6=HM/8=CSP/9=CSV/10=CST), 0x6061=ModesOfOperationDisplay[RO INT8] - Current active mode, 0x6064=PositionActualValue[RO INT32] - Actual position (encoder counts), 0x606C=VelocityActualValue[RO INT32] - Actual velocity (user units/s), 0x6071=TargetTorque[RW INT16] - Target torque (per-mille of rated torque), 0x607A=TargetPosition[RW INT32] - Target position (Profile Position mode), 0x6081=ProfileVelocity[RW UINT32] - Max profile velocity (user units/s), 0x6083=ProfileAcceleration[RW UINT32] - Profile acceleration (user units/s²), 0x6084=ProfileDeceleration[RW UINT32] - Profile deceleration (user units/s²), 0x60FF=TargetVelocity[RW INT32] - Target velocity (Profile Velocity mode). Wheel motors use Profile Velocity mode (mode 3).",
|
|
"RPDO1": [
|
|
{
|
|
"Index": "0x6040",
|
|
"_Description": "Controlword - State machine control (Enable/Disable/Fault Reset/Quick Stop)",
|
|
"SubIndex": 0,
|
|
"BitLength": 16
|
|
},
|
|
{
|
|
"Index": "0x6060",
|
|
"_Description": "Modes of Operation - Operation mode (1=PP/3=PV/4=PT/6=HM/8=CSP/9=CSV/10=CST)",
|
|
"SubIndex": 0,
|
|
"BitLength": 8
|
|
}
|
|
],
|
|
"RPDO2": [
|
|
{
|
|
"Index": "0x6081",
|
|
"_Description": "Profile Velocity - Max profile velocity for profile motion (user units/s)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"RPDO3": [
|
|
{
|
|
"Index": "0x6083",
|
|
"_Description": "Profile Acceleration - Profile acceleration for profile motion (user units/s²)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
},
|
|
{
|
|
"Index": "0x6084",
|
|
"_Description": "Profile Deceleration - Profile deceleration for profile motion (user units/s²)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"RPDO4": [
|
|
{
|
|
"Index": "0x60FF",
|
|
"_Description": "Target Velocity - Target velocity in Profile Velocity mode (user units/s)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"TPDO1": [
|
|
{
|
|
"Index": "0x6041",
|
|
"_Description": "Statusword - Motor status (Ready/Enabled/Fault/Warning/Target Reached)",
|
|
"SubIndex": 0,
|
|
"BitLength": 16
|
|
},
|
|
{
|
|
"Index": "0x6061",
|
|
"_Description": "Modes of Operation Display - Current active/running operation mode",
|
|
"SubIndex": 0,
|
|
"BitLength": 8
|
|
}
|
|
],
|
|
"TPDO2": [
|
|
{
|
|
"Index": "0x6064",
|
|
"_Description": "Position Actual Value - Current actual position (encoder counts, real-time feedback)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"TPDO3": [
|
|
{
|
|
"Index": "0x606C",
|
|
"_Description": "Velocity Actual Value - Current actual velocity (user units/s or RPM, real-time feedback)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
]
|
|
},
|
|
"TPDOEventTimers": {
|
|
"TPDO1": 0,
|
|
"TPDO2": 0,
|
|
"TPDO3": 50
|
|
},
|
|
"TPDOInhibitTimes": {
|
|
"TPDO1": 100,
|
|
"TPDO2": 10,
|
|
"TPDO3": 10
|
|
}
|
|
}
|
|
},
|
|
"MBDV_Servo02": {
|
|
"DeviceId": "left-wheel",
|
|
"Enabled": true,
|
|
"DeviceType": "CiA402Servo",
|
|
"DeviceName": "Left Wheel Servo",
|
|
"DriverName": "CiA402Servo",
|
|
"DriverVersion": "1.0.0",
|
|
"Description": "Left Wheel servo motor (Profile Velocity mode)",
|
|
"Connection": {
|
|
"CanInterface": "can0",
|
|
"NodeId": "2",
|
|
"AutoReconnectEnabled": true,
|
|
"ReconnectDelayMs": 3000,
|
|
"MaxReconnectAttempts": 0,
|
|
"PdoConfigRetryCount": 3,
|
|
"PdoConfigRetryTimeoutMs": 1000,
|
|
"UseHeartbeatCheck": true,
|
|
"AllowedHomingMethods": [],
|
|
"ObjectInitialValues": [],
|
|
"PdoMappings": {
|
|
"RPDO1": [
|
|
{
|
|
"Index": "0x6040",
|
|
"_Description": "Controlword - State machine control (Enable/Disable/Fault Reset/Quick Stop)",
|
|
"SubIndex": 0,
|
|
"BitLength": 16
|
|
},
|
|
{
|
|
"Index": "0x6060",
|
|
"_Description": "Modes of Operation - Operation mode (1=PP/3=PV/4=PT/6=HM/8=CSP/9=CSV/10=CST)",
|
|
"SubIndex": 0,
|
|
"BitLength": 8
|
|
}
|
|
],
|
|
"RPDO2": [
|
|
{
|
|
"Index": "0x6081",
|
|
"_Description": "Profile Velocity - Max profile velocity for profile motion (user units/s)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"RPDO3": [
|
|
{
|
|
"Index": "0x6083",
|
|
"_Description": "Profile Acceleration - Profile acceleration for profile motion (user units/s²)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
},
|
|
{
|
|
"Index": "0x6084",
|
|
"_Description": "Profile Deceleration - Gia tốc giảm tốc trong profile motion (user units/s²)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"RPDO4": [
|
|
{
|
|
"Index": "0x60FF",
|
|
"_Description": "Target Velocity - Target velocity in Profile Velocity mode (user units/s)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"TPDO1": [
|
|
{
|
|
"Index": "0x6041",
|
|
"_Description": "Statusword - Motor status (Ready/Enabled/Fault/Warning/Target Reached)",
|
|
"SubIndex": 0,
|
|
"BitLength": 16
|
|
},
|
|
{
|
|
"Index": "0x6061",
|
|
"_Description": "Modes of Operation Display - Current active/running operation mode",
|
|
"SubIndex": 0,
|
|
"BitLength": 8
|
|
}
|
|
],
|
|
"TPDO2": [
|
|
{
|
|
"Index": "0x6064",
|
|
"_Description": "Position Actual Value - Current actual position (encoder counts, real-time feedback)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"TPDO3": [
|
|
{
|
|
"Index": "0x606C",
|
|
"_Description": "Velocity Actual Value - Vận tốc thực tế hiện tại (user units/s hoặc RPM, real-time feedback)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
]
|
|
},
|
|
"TPDOEventTimers": {
|
|
"TPDO1": 0,
|
|
"TPDO2": 0,
|
|
"TPDO3": 50
|
|
},
|
|
"TPDOInhibitTimes": {
|
|
"TPDO1": 100,
|
|
"TPDO2": 10,
|
|
"TPDO3": 10
|
|
}
|
|
}
|
|
},
|
|
"Kinco_Servo01": {
|
|
"DeviceId": "motor-lift",
|
|
"Enabled": true,
|
|
"DeviceType": "CiA402Servo",
|
|
"DeviceName": "Lift Servo",
|
|
"DriverName": "CiA402Servo",
|
|
"DriverVersion": "1.0.0",
|
|
"Description": "Lift servo motor (Profile Position mode)",
|
|
"Connection": {
|
|
"CanInterface": "can1",
|
|
"NodeId": "1",
|
|
"AutoReconnectEnabled": true,
|
|
"ReconnectDelayMs": 3000,
|
|
"MaxReconnectAttempts": 0,
|
|
"PdoConfigRetryCount": 3,
|
|
"PdoConfigRetryTimeoutMs": 1000,
|
|
"UseHeartbeatCheck": true,
|
|
"AllowedHomingMethods": [],
|
|
"ObjectInitialValues": [
|
|
{
|
|
"Index": 4119,
|
|
"SubIndex": 0,
|
|
"Type": "UInt16",
|
|
"Value": "500"
|
|
}
|
|
],
|
|
"PdoMappings": {
|
|
"RPDO1": [
|
|
{
|
|
"Index": "0x6040",
|
|
"_Description": "Controlword - State machine control (Enable/Disable/Fault Reset/Quick Stop)",
|
|
"SubIndex": 0,
|
|
"BitLength": 16
|
|
},
|
|
{
|
|
"Index": "0x6060",
|
|
"_Description": "Modes of Operation - Operation mode (1=PP/3=PV/4=PT/6=HM/8=CSP/9=CSV/10=CST)",
|
|
"SubIndex": 0,
|
|
"BitLength": 8
|
|
}
|
|
],
|
|
"RPDO2": [
|
|
{
|
|
"Index": "0x607A",
|
|
"_Description": "Target Position - Target position in Profile Position mode (encoder counts)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
},
|
|
{
|
|
"Index": "0x6081",
|
|
"_Description": "Profile Velocity - Max profile velocity for profile motion (user units/s)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"RPDO3": [
|
|
{
|
|
"Index": "0x6083",
|
|
"_Description": "Profile Acceleration - Profile acceleration for profile motion (user units/s²)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
},
|
|
{
|
|
"Index": "0x6084",
|
|
"_Description": "Profile Deceleration - Profile deceleration for profile motion (user units/s²)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"RPDO4": [
|
|
{
|
|
"Index": "0x60FF",
|
|
"_Description": "Target Velocity - Target velocity in Profile Velocity mode (user units/s)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"TPDO1": [
|
|
{
|
|
"Index": "0x6041",
|
|
"_Description": "Statusword - Motor status (Ready/Enabled/Fault/Warning/Target Reached)",
|
|
"SubIndex": 0,
|
|
"BitLength": 16
|
|
},
|
|
{
|
|
"Index": "0x6061",
|
|
"_Description": "Modes of Operation Display - Current active/running operation mode",
|
|
"SubIndex": 0,
|
|
"BitLength": 8
|
|
}
|
|
],
|
|
"TPDO2": [
|
|
{
|
|
"Index": "0x6064",
|
|
"_Description": "Position Actual Value - Current actual position (encoder counts, real-time feedback)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"TPDO3": [
|
|
{
|
|
"Index": "0x606C",
|
|
"_Description": "Velocity Actual Value - Vận tốc thực tế hiện tại (user units/s hoặc RPM, real-time feedback)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
]
|
|
},
|
|
"TPDOEventTimers": {
|
|
"TPDO1": 0,
|
|
"TPDO2": 0,
|
|
"TPDO3": 0
|
|
},
|
|
"TPDOInhibitTimes": {
|
|
"TPDO1": 100,
|
|
"TPDO2": 10,
|
|
"TPDO3": 10
|
|
}
|
|
}
|
|
},
|
|
"Kinco_Servo02": {
|
|
"DeviceId": "motor-rotary",
|
|
"Enabled": true,
|
|
"DeviceType": "CiA402Servo",
|
|
"DeviceName": "Station Rotary Servo",
|
|
"DriverName": "CiA402Servo",
|
|
"DriverVersion": "1.0.0",
|
|
"Description": "Station Rotary servo motor (Profile Position mode)",
|
|
"Connection": {
|
|
"CanInterface": "can1",
|
|
"NodeId": "2",
|
|
"AutoReconnectEnabled": true,
|
|
"ReconnectDelayMs": 3000,
|
|
"MaxReconnectAttempts": 0,
|
|
"PdoConfigRetryCount": 3,
|
|
"PdoConfigRetryTimeoutMs": 1000,
|
|
"UseHeartbeatCheck": true,
|
|
"AllowedHomingMethods": [],
|
|
"ObjectInitialValues": [
|
|
{
|
|
"Index": 4119,
|
|
"SubIndex": 0,
|
|
"Type": "UInt16",
|
|
"Value": "500"
|
|
}
|
|
],
|
|
"PdoMappings": {
|
|
"RPDO1": [
|
|
{
|
|
"Index": "0x6040",
|
|
"_Description": "Controlword - State machine control (Enable/Disable/Fault Reset/Quick Stop)",
|
|
"SubIndex": 0,
|
|
"BitLength": 16
|
|
},
|
|
{
|
|
"Index": "0x6060",
|
|
"_Description": "Modes of Operation - Operation mode (1=PP/3=PV/4=PT/6=HM/8=CSP/9=CSV/10=CST)",
|
|
"SubIndex": 0,
|
|
"BitLength": 8
|
|
}
|
|
],
|
|
"RPDO2": [
|
|
{
|
|
"Index": "0x607A",
|
|
"_Description": "Target Position - Target position in Profile Position mode (encoder counts)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
},
|
|
{
|
|
"Index": "0x6081",
|
|
"_Description": "Profile Velocity - Max profile velocity for profile motion (user units/s)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"RPDO3": [
|
|
{
|
|
"Index": "0x6083",
|
|
"_Description": "Profile Acceleration - Profile acceleration for profile motion (user units/s²)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
},
|
|
{
|
|
"Index": "0x6084",
|
|
"_Description": "Profile Deceleration - Gia tốc giảm tốc trong profile motion (user units/s²)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"RPDO4": [
|
|
{
|
|
"Index": "0x60FF",
|
|
"_Description": "Target Velocity - Target velocity in Profile Velocity mode (user units/s)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"TPDO1": [
|
|
{
|
|
"Index": "0x6041",
|
|
"_Description": "Statusword - Motor status (Ready/Enabled/Fault/Warning/Target Reached)",
|
|
"SubIndex": 0,
|
|
"BitLength": 16
|
|
},
|
|
{
|
|
"Index": "0x6061",
|
|
"_Description": "Modes of Operation Display - Current active/running operation mode",
|
|
"SubIndex": 0,
|
|
"BitLength": 8
|
|
}
|
|
],
|
|
"TPDO2": [
|
|
{
|
|
"Index": "0x6064",
|
|
"_Description": "Position Actual Value - Current actual position (encoder counts, real-time feedback)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
],
|
|
"TPDO3": [
|
|
{
|
|
"Index": "0x606C",
|
|
"_Description": "Velocity Actual Value - Current actual velocity (user units/s or RPM, real-time feedback)",
|
|
"SubIndex": 0,
|
|
"BitLength": 32
|
|
}
|
|
]
|
|
},
|
|
"TPDOEventTimers": {
|
|
"TPDO1": 0,
|
|
"TPDO2": 0,
|
|
"TPDO3": 0
|
|
},
|
|
"TPDOInhibitTimes": {
|
|
"TPDO1": 100,
|
|
"TPDO2": 10,
|
|
"TPDO3": 10
|
|
}
|
|
}
|
|
},
|
|
"SickLidar01": {
|
|
"DeviceId": "sick-lidar-001",
|
|
"Enabled": true,
|
|
"DeviceName": "SICK Safety Scanner LiDAR 1",
|
|
"DeviceType": "Lidar",
|
|
"DriverName": "SickLidarDriver",
|
|
"DriverVersion": "1.0.0",
|
|
"Description": "SICK Safety Scanner LiDAR Driver - UDP Streaming Mode",
|
|
"Connection": {
|
|
"IpAddress": "192.168.254.11",
|
|
"TcpPort": 2122,
|
|
"UdpLocalPort": 6060,
|
|
"HostIp": null,
|
|
"StartAngle": null,
|
|
"EndAngle": null,
|
|
"ConnectTimeoutMs": 5000,
|
|
"CommandTimeoutMs": 5000,
|
|
"AutoReconnectEnabled": true,
|
|
"ReconnectDelayMs": 5000,
|
|
"MaxReconnectAttempts": 5,
|
|
"ScanTopic": "/scan",
|
|
"FrameId": "lidar_frame"
|
|
}
|
|
},
|
|
"SickLidar02": {
|
|
"DeviceId": "sick-lidar-002",
|
|
"Enabled": true,
|
|
"DeviceName": "SICK Safety Scanner LiDAR 2",
|
|
"DeviceType": "Lidar",
|
|
"DriverName": "SickLidarDriver",
|
|
"DriverVersion": "1.0.0",
|
|
"Description": "SICK Safety Scanner LiDAR with custom scan angle configuration",
|
|
"Connection": {
|
|
"IpAddress": "192.168.254.12",
|
|
"TcpPort": 2122,
|
|
"UdpLocalPort": 6061,
|
|
"HostIp": null,
|
|
"StartAngle": null,
|
|
"EndAngle": null,
|
|
"ConnectTimeoutMs": 10000,
|
|
"CommandTimeoutMs": 10000,
|
|
"AutoReconnectEnabled": true,
|
|
"ReconnectDelayMs": 5000,
|
|
"MaxReconnectAttempts": 5,
|
|
"ScanTopic": "/scan",
|
|
"FrameId": "lidar_frame"
|
|
}
|
|
},
|
|
"Oleilidar": {
|
|
"DeviceId": "olei-front",
|
|
"Enabled": true,
|
|
"DeviceName": "Olei",
|
|
"DeviceType": "Lidar",
|
|
"DriverName": "Olei2dLidarDriver",
|
|
"DriverVersion": "1.0.0",
|
|
"Description": "Olei Safety Scanner LiDAR with custom scan angle configuration",
|
|
"Connection": {
|
|
"UdpPort": 2368,
|
|
"FrameId": "olei-front"
|
|
}
|
|
},
|
|
"WheeltecIMU": {
|
|
"DeviceId": "wheetec-imu",
|
|
"Enabled": true,
|
|
"DeviceName": "Wheetec N100 IMU",
|
|
"DeviceType": "IMU",
|
|
"DriverName": "WheeltecN100IMU",
|
|
"DriverVersion": "1.0.0",
|
|
"Description": "IMU",
|
|
"Connection": {
|
|
"Port": "/dev/ttyUSB0",
|
|
"BaudRate": 921600,
|
|
"Timeout": 2000
|
|
}
|
|
},
|
|
"PLC": {
|
|
"DeviceId": "plc-001",
|
|
"Enabled": true,
|
|
"DeviceName": "PLC_Controller",
|
|
"DeviceType": "ModbusTcp",
|
|
"DriverName": "ModbusTCP",
|
|
"DriverVersion": "1.0.0",
|
|
"Connection": {
|
|
"Port": 502,
|
|
"IpAddress": "192.168.254.5",
|
|
"SlaveId": 1,
|
|
"SyncIntervalMs": 200,
|
|
"ConnectTimeoutMs": 5000,
|
|
"AutoReconnectEnabled": true,
|
|
"Coils": {
|
|
"Range1": {
|
|
"StartAddress": 2848,
|
|
"Quantity": 32,
|
|
"Name": "Input PLC"
|
|
},
|
|
"Range2": {
|
|
"StartAddress": 2948,
|
|
"Quantity": 33,
|
|
"Name": "Output PLC"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"HikVisionQr": {
|
|
"DeviceId": "hik-qr-001",
|
|
"Enabled": true,
|
|
"DeviceName": "HikVision QR Camera",
|
|
"DeviceType": "CameraQr",
|
|
"DriverName": "HikVisionQr",
|
|
"DriverVersion": "1.0.0",
|
|
"Description": "HikVision Camera for QR Code Detection",
|
|
"Connection": {
|
|
"LocalIP": "192.168.254.2",
|
|
"LocalPort": 1024,
|
|
"CameraWidth": 800,
|
|
"CameraHeight": 600,
|
|
"DistanceToQr": 0.115,
|
|
"FovRangeWidthMm": 170.0,
|
|
"FovRangeHeightMm": 130.0,
|
|
"FovRangeDistanceMm": 100.0,
|
|
"QrDataTimeoutSeconds": 3.0,
|
|
"AutoReconnectEnabled": true,
|
|
"ReconnectDelayMs": 3000,
|
|
"MaxReconnectAttempts": 0
|
|
}
|
|
}
|
|
},
|
|
"Motion": {
|
|
"DifferentialDrive": {
|
|
"Enable": true,
|
|
"LeftWheel": {
|
|
"DeviceId": "left-wheel",
|
|
"Position": {
|
|
"Position": {
|
|
"X": 0.0,
|
|
"Y": 0.398,
|
|
"Z": 0.0
|
|
},
|
|
"Orientation": {
|
|
"X": 0.0,
|
|
"Y": 0.0,
|
|
"Z": 0.7071067,
|
|
"W": 0.7071067
|
|
}
|
|
},
|
|
"WheelDiameter": 0.18,
|
|
"PulsesPerRevolution": 100000,
|
|
"IsReversed": true
|
|
},
|
|
"RightWheel": {
|
|
"DeviceId": "right-wheel",
|
|
"Position": {
|
|
"Position": {
|
|
"X": 0.0,
|
|
"Y": -0.398,
|
|
"Z": 0.0
|
|
},
|
|
"Orientation": {
|
|
"X": 0.0,
|
|
"Y": 0.0,
|
|
"Z": -0.7071067,
|
|
"W": 0.7071067
|
|
}
|
|
},
|
|
"WheelDiameter": 0.18,
|
|
"PulsesPerRevolution": 100000,
|
|
"IsReversed": false
|
|
},
|
|
"Ekf": {
|
|
"Enable": true,
|
|
"ImuDeviceId": "wheetec-imu",
|
|
"ImuPose": {
|
|
"Position": {
|
|
"X": 0.0,
|
|
"Y": 0.0,
|
|
"Z": 0.0
|
|
},
|
|
"Orientation": {
|
|
"_comment": "IMU mounted upside-down: 180deg rotation around X-axis. This inverts Z-axis.",
|
|
"X": 1.0,
|
|
"Y": 0.0,
|
|
"Z": 0.0,
|
|
"W": 0.0
|
|
}
|
|
},
|
|
"InitialPositionVariance": 0.001,
|
|
"InitialOrientationVariance": 0.001,
|
|
"InitialVelocityVariance": 0.01,
|
|
"ProcessNoisePosition": 0.0001,
|
|
"ProcessNoiseOrientation": 0.001,
|
|
"_comment_ProcessNoiseOrientation": "Increased from 0.00001 to 0.001 for faster response to IMU. Higher value = more responsive to measurements, lower = more trust in encoder model.",
|
|
"ProcessNoiseVelocity": 0.01,
|
|
"MeasurementNoiseOdometryVelocity": 0.05,
|
|
"MeasurementNoiseOdometryAngular": 0.01,
|
|
"MeasurementNoiseImuAccel": 0.1,
|
|
"MeasurementNoiseImuAngular": 0.005,
|
|
"_comment_MeasurementNoiseImuAngular": "Reduced from 0.01 to 0.005 to trust IMU angular velocity more"
|
|
}
|
|
},
|
|
"ManualControl": {
|
|
"Enable": true,
|
|
"UsingKeyboard": false,
|
|
"RfHandleDeviceId": "rfhandle-YNZDH-001",
|
|
"MinLinearVelocity": 0.0,
|
|
"MaxLinearVelocity": 1.5,
|
|
"MinAngularVelocity": 0.0,
|
|
"MaxAngularVelocity": 1.0,
|
|
"UpdateRate": 20.0,
|
|
"Acceleration": 0.5,
|
|
"Deceleration": 0.5
|
|
}
|
|
},
|
|
"Modules": {
|
|
"LiftModule": {
|
|
"Enable": true,
|
|
"DeviceId": "motor-lift",
|
|
"HomingMethod": 17,
|
|
"HomingSpeed": 5000000,
|
|
"HomingOffset": 10000,
|
|
"ProfileVelocity": 10000000,
|
|
"ProfileAcceleration": 50000,
|
|
"ProfileDeceleration": 50000,
|
|
"MinPosition": 0,
|
|
"MaxPosition": 3500000,
|
|
"StatusWordCheckIntervalMs": 50
|
|
},
|
|
"RotationModule": {
|
|
"Enable": true,
|
|
"DeviceId": "motor-rotary",
|
|
"HomingMethod": 20,
|
|
"HomingSpeed": 5000000,
|
|
"HomingOffset": -21000,
|
|
"ProfileVelocity": 5000000,
|
|
"ProfileAcceleration": 10000,
|
|
"ProfileDeceleration": 10000,
|
|
"Resolution": 3556000,
|
|
"IsReversed": true,
|
|
"MinAngle": null,
|
|
"MaxAngle": null,
|
|
"StatusWordCheckIntervalMs": 50
|
|
}
|
|
},
|
|
"Cartographer": {
|
|
"Enabled": true,
|
|
"UseOdometry": true,
|
|
"Sensors": {
|
|
"OdometryUpdateIntervalMs": 5,
|
|
"ImuUpdateIntervalMs": 0,
|
|
"Lidars": [
|
|
{
|
|
"DeviceId": "sick-lidar-001",
|
|
"Enabled": true,
|
|
"Transform": {
|
|
"Translation": {
|
|
"X": 0.488,
|
|
"Y": 0.39,
|
|
"Z": 0.0
|
|
},
|
|
"Rotation": {
|
|
"X": 0.0,
|
|
"Y": 0.0,
|
|
"Z": -0.3826834,
|
|
"W": 0.9238795
|
|
}
|
|
},
|
|
"AngleMin": -40,
|
|
"AngleMax": 220
|
|
},
|
|
{
|
|
"DeviceId": "sick-lidar-002",
|
|
"Enabled": true,
|
|
"Transform": {
|
|
"Translation": {
|
|
"X": -0.488,
|
|
"Y": -0.39,
|
|
"Z": 0.0
|
|
},
|
|
"Rotation": {
|
|
"X": 0.0,
|
|
"Y": 0.0,
|
|
"Z": 0.9238795,
|
|
"W": 0.3826834
|
|
}
|
|
},
|
|
"AngleMin": -40,
|
|
"AngleMax": 220
|
|
}
|
|
],
|
|
"Imu": {
|
|
"DeviceId": "wheetec-imu",
|
|
"Enabled": false,
|
|
"Transform": {
|
|
"Translation": {
|
|
"X": 0.0,
|
|
"Y": 0.0,
|
|
"Z": 0.0
|
|
},
|
|
"Rotation": {
|
|
"X": 1.0,
|
|
"Y": 0.0,
|
|
"Z": 0.0,
|
|
"W": 0.0
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"TrajectoryBuilder": {
|
|
"Use2D": true,
|
|
"MinRange": 0.5,
|
|
"MaxRange": 18.0,
|
|
"MinZ": -0.8,
|
|
"MaxZ": 2.0,
|
|
"MissingDataRayLength": 5.0,
|
|
"VoxelFilterSize": 0.025,
|
|
"NumAccumulatedRangeData": 2,
|
|
"UseImuData": false,
|
|
"UseOnlineCorrelativeScanMatching": true,
|
|
"RealTimeCorrelativeScanMatcherOptions": {
|
|
"LinearSearchWindow": 0.15,
|
|
"AngularSearchWindow": 0.1745329252,
|
|
"TranslationDeltaCostWeight": 20.0,
|
|
"RotationDeltaCostWeight": 20.0,
|
|
"NumThreads": 8
|
|
},
|
|
"CeresScanMatcherOptions": {
|
|
"OccupiedSpaceWeight": 10.0,
|
|
"TranslationWeight": 40.0,
|
|
"RotationWeight": 100.0,
|
|
"HighResOccupiedSpaceWeight": 5.0,
|
|
"HighResTranslationWeight": 40.0,
|
|
"HighResRotationWeight": 100.0,
|
|
"LandmarkWeight": 0.0,
|
|
"CeresSolverOptions": {
|
|
"UseNonmonotonicSteps": false,
|
|
"MaxNumIterations": 20,
|
|
"NumThreads": 8,
|
|
"_comment_tolerances": "Aggressive tolerances for fast convergence with accurate odometry/IMU",
|
|
"FunctionTolerance": 0.0001,
|
|
"GradientTolerance": 0.000001,
|
|
"ParameterTolerance": 0.000001
|
|
}
|
|
},
|
|
"InitialPoseRealTimeCorrelativeScanMatcherOptions": {
|
|
"_comment": "Enhanced scan matching for SetInitialPoseAsync - wider search window for relocalization",
|
|
"LinearSearchWindow": 0.5,
|
|
"AngularSearchWindow": 0.5,
|
|
"TranslationDeltaCostWeight": 1.0,
|
|
"RotationDeltaCostWeight": 1.0,
|
|
"NumThreads": 8
|
|
},
|
|
"InitialPoseCeresScanMatcherOptions": {
|
|
"_comment": "Stricter Ceres optimization for SetInitialPoseAsync - higher weights for better accuracy",
|
|
"OccupiedSpaceWeight": 20.0,
|
|
"TranslationWeight": 50.0,
|
|
"RotationWeight": 10.0,
|
|
"CeresSolverOptions": {
|
|
"UseNonmonotonicSteps": true,
|
|
"MaxNumIterations": 20,
|
|
"NumThreads": 8,
|
|
"FunctionTolerance": 0.0001,
|
|
"GradientTolerance": 0.000001,
|
|
"ParameterTolerance": 0.000001
|
|
}
|
|
},
|
|
"MotionFilterOptions": {
|
|
"MaxTimeSeconds": 5.0,
|
|
"MaxDistanceMeters": 0.1,
|
|
"MaxAngleRadians": 0.0873
|
|
},
|
|
"AdaptiveVoxelFilterOptions": {
|
|
"MaxLength": 0.8,
|
|
"MinNumPoints": 100,
|
|
"MaxRange": 50.0
|
|
},
|
|
"LoopClosureAdaptiveVoxelFilterOptions": {
|
|
"MaxLength": 0.9,
|
|
"MinNumPoints": 100,
|
|
"MaxRange": 50.0
|
|
},
|
|
"PoseExtrapolatorOptions": {
|
|
"UseImuBased": false,
|
|
"ConstantVelocity": {
|
|
"ImuGravityTimeConstant": 10.0,
|
|
"PoseQueueDuration": 0.05
|
|
},
|
|
"ImuBased": {
|
|
"PoseQueueDuration": 1.0,
|
|
"GravityConstant": 9.806,
|
|
"PoseTranslationWeight": 1.0,
|
|
"PoseRotationWeight": 1.0,
|
|
"ImuAccelerationWeight": 1.0,
|
|
"ImuRotationWeight": 1.0,
|
|
"OdometryTranslationWeight": 0.5,
|
|
"OdometryRotationWeight": 0.5,
|
|
"SolverOptions": {
|
|
"UseNonmonotonicSteps": false,
|
|
"MaxNumIterations": 20,
|
|
"NumThreads": 8,
|
|
"FunctionTolerance": 0.0001,
|
|
"GradientTolerance": 0.000001,
|
|
"ParameterTolerance": 0.000001
|
|
}
|
|
},
|
|
"_comment_deprecated": "The following fields are DEPRECATED and IGNORED by PoseExtrapolator (removed in C++ port to match original Cartographer): VelocityThreshold, AccelerationThreshold, GravityDeviationThreshold, UseOdometryDirectly. They remain here for backward compatibility but have no effect.",
|
|
"VelocityThreshold": 0.003,
|
|
"AccelerationThreshold": 0.4,
|
|
"GravityDeviationThreshold": 0.1,
|
|
"UseOdometryDirectly": true
|
|
},
|
|
"ScanMatchingDebugOptions": {
|
|
"EnableDebugMode": true,
|
|
"MinCostReductionPercent": 80.0,
|
|
"MaxPoseChangeDistanceMeters": 0.5,
|
|
"MaxPoseChangeRotationDegrees": 15.0
|
|
},
|
|
"SubmapsOptions": {
|
|
"NumRangeData": 90,
|
|
"GridOptions": {
|
|
"GridType": 2,
|
|
"Resolution": 0.05
|
|
},
|
|
"RangeDataInserterOptions": {
|
|
"RangeDataInserterType": 2,
|
|
"ProbabilityGridRangeDataInserterOptions": {
|
|
"HitProbability": 0.55,
|
|
"MissProbability": 0.49,
|
|
"InsertFreeSpace": true
|
|
},
|
|
"TsdfRangeDataInserterOptions": {
|
|
"TruncationDistance": 0.3,
|
|
"MaximumWeight": 5.0,
|
|
"UpdateFreeSpace": true,
|
|
"NormalEstimationOptions": {
|
|
"NumNormalSamples": 4,
|
|
"SampleRadius": 0.5
|
|
},
|
|
"ProjectSdfDistanceToScanNormal": true,
|
|
"UpdateWeightRangeExponent": 1,
|
|
"UpdateWeightAngleScanNormalToRayKernelBandwidth": 0.5,
|
|
"UpdateWeightDistanceCellToHitKernelBandwidth": 0.5
|
|
}
|
|
}
|
|
},
|
|
"HighResGridOptions": {
|
|
"GridType": 2,
|
|
"Resolution": 0.025
|
|
},
|
|
"HighResAdaptiveVoxelFilterOptions": {
|
|
"MaxLength": 0.5,
|
|
"MinNumPoints": 200,
|
|
"MaxRange": 50.0
|
|
},
|
|
"HighResVoxelFilterSize": 0.025,
|
|
"LandmarkThreshold": {
|
|
"MirrorLandmarkMatchingDistance": 0.5,
|
|
"NewLandmarkDistance": 2.0,
|
|
"LocalLandmarksHistory": 80
|
|
},
|
|
"NumDuplicateInsertToAccurateSubmap": 1,
|
|
"TrueScoreCellThreshold": 0.75,
|
|
"_comment_ProvideConfidenceScore": "When enabled, computes a confidence score for each pose estimate using RealTimeCorrelativeScanMatcher. The confidence score indicates how well the scan matches the current submap (0.0 = poor match, 1.0 = perfect match). Useful for detecting localization failures or low-quality pose estimates. Default: false (disabled for performance).",
|
|
"ProvideConfidenceScore": true,
|
|
"_comment_CeresScoreLimits": "Two-tier Ceres cost thresholds calibrated for TSDF (FinalCost range ~0-4.5). TSDF FinalCost scale is much smaller than ProbabilityGrid (~17-50). SoftLimit: cost above this skips submap insertion but trusts pose. HardLimit: cost above this rejects pose entirely (uses odometry). After MaxConsecutiveHighCostBeforeNewSubmap consecutive hard failures, a new submap is forced.",
|
|
"CeresScoreSoftLimit": 1.0,
|
|
"CeresScoreHardLimit": 1.5,
|
|
"MaxConsecutiveHighCostBeforeNewSubmap": 8
|
|
},
|
|
"MapBuilder": {
|
|
"UseTrajectoryBuilder2D": true,
|
|
"UseTrajectoryBuilder3D": null,
|
|
"NumBackgroundThreads": 16,
|
|
"CollateByTrajectory": true,
|
|
"OptimizeEveryNNodes": 90,
|
|
"MatcherTranslationWeight": 500.0,
|
|
"MatcherRotationWeight": 1600.0,
|
|
"MaxNumFinalIterations": 200,
|
|
"GlobalSamplingRatio": 0.3,
|
|
"LogResidualHistograms": false,
|
|
"GlobalConstraintSearchAfterNSeconds": 5.0,
|
|
"EnableSingleTrajectoryLoopClosure": true,
|
|
"SingleTrajectoryLoopClosureDistanceThreshold": 3.0,
|
|
"PoseGraphOptimizationProblemOptions": {
|
|
"HuberScale": 10.0,
|
|
"OdometryHuberScale": 2.0,
|
|
"LocalSlamPoseHuberScale": 1.0,
|
|
"AccelerationWeight": 110.0,
|
|
"RotationWeight": 16000.0,
|
|
"LocalSlamPoseTranslationWeight": 10.0,
|
|
"LocalSlamPoseRotationWeight": 10.0,
|
|
"OdometryTranslationWeight": 5.0,
|
|
"OdometryRotationWeight": 5.0,
|
|
"FixedFramePoseTranslationWeight": 10.0,
|
|
"FixedFramePoseRotationWeight": 100.0,
|
|
"FixedFramePoseUseTolerantLoss": false,
|
|
"FixedFramePoseTolerantLossParamA": 1.0,
|
|
"FixedFramePoseTolerantLossParamB": 1.0,
|
|
"LogSolverSummary": false,
|
|
"MaxNumIterations": 70,
|
|
"CeresSolverOptions": {
|
|
"UseNonmonotonicSteps": true,
|
|
"MaxNumIterations": 70,
|
|
"NumThreads": 8,
|
|
"FunctionTolerance": 0.0001,
|
|
"GradientTolerance": 0.0000001,
|
|
"ParameterTolerance": 0.0000001
|
|
}
|
|
},
|
|
"ConstraintBuilderOptions": {
|
|
"SamplingRatio": 0.5,
|
|
"MaxConstraintDistance": 15.0,
|
|
"MinScore": 0.45,
|
|
"GlobalLocalizationMinScore": 0.5,
|
|
"LoopClosureTranslationWeight": 11000.0,
|
|
"LoopClosureRotationWeight": 100000.0,
|
|
"LogMatches": true,
|
|
"FastCorrelativeScanMatcherOptions": {
|
|
"LinearSearchWindow": 5,
|
|
"AngularSearchWindow": 0.34906585,
|
|
"BranchAndBoundDepth": 7,
|
|
"LocalizationLinearSearchWindow": 3.0,
|
|
"LocalizationAngularSearchWindow": 3.14159
|
|
},
|
|
"CeresScanMatcherOptions": {
|
|
"OccupiedSpaceWeight": 20.0,
|
|
"TranslationWeight": 10.0,
|
|
"RotationWeight": 1.0,
|
|
"HighResOccupiedSpaceWeight": 1.0,
|
|
"HighResTranslationWeight": 10.0,
|
|
"HighResRotationWeight": 40.0,
|
|
"LandmarkWeight": 0.0,
|
|
"CeresSolverOptions": {
|
|
"UseNonmonotonicSteps": true,
|
|
"MaxNumIterations": 20,
|
|
"NumThreads": 8,
|
|
"FunctionTolerance": 0.0001,
|
|
"GradientTolerance": 0.0000001,
|
|
"ParameterTolerance": 0.0000001
|
|
}
|
|
}
|
|
},
|
|
"OverlappingSubmapsTrimmer2D": {
|
|
"FreshSubmapsCount": 2,
|
|
"MinCoveredArea": 1.0,
|
|
"MinAddedSubmapsCount": 5
|
|
}
|
|
},
|
|
"MapStorage": {
|
|
"Directory": "./bin/maps",
|
|
"OccupancyGridResolution": 0.05,
|
|
"MapPadding": 0.5,
|
|
"LocalizingStateDirectory": "./bin/localizing_state",
|
|
"PoseSyncIntervalSeconds": 5.0,
|
|
"PngVisualizationOptions": {
|
|
"ShowGrid": true,
|
|
"ShowTrajectory": true,
|
|
"GridColor": "#CCCCCC",
|
|
"TrajectoryColor": "#FF0000"
|
|
}
|
|
},
|
|
"Mcl": {
|
|
"_comment": "Monte Carlo Localization (xloc MCL). Params aligned with refs/xloc_cpp-main/configuration_files/mcl.yaml and MCLThread convergence (pose_change 0.03m, yaw 0.05rad, stable 0.3s, reliability>=0.9, mae<=0.12, timeout 3s).",
|
|
"Enabled": true,
|
|
"PrimaryLidarId": "sick-lidar-002",
|
|
"InitialNoiseX": 1.0,
|
|
"InitialNoiseY": 1.0,
|
|
"InitialNoiseYaw": 0.3,
|
|
"InitialNoiseWhenPoseGivenX": 0.15,
|
|
"InitialNoiseWhenPoseGivenY": 0.15,
|
|
"InitialNoiseWhenPoseGivenYaw": 0.05,
|
|
"ParticlesNum": 1000,
|
|
"UseAugmentedMcl": true,
|
|
"AddRandomParticlesInResampling": true,
|
|
"RandomParticlesRate": 0.1,
|
|
"RandomParticlesNoise": [
|
|
0.05,
|
|
0.05,
|
|
0.1
|
|
],
|
|
"OdomNoiseDdm": [
|
|
1.0,
|
|
0.5,
|
|
0.5,
|
|
1.5
|
|
],
|
|
"OdomNoiseOdm": [
|
|
4.0,
|
|
1.0,
|
|
1.0,
|
|
1.0,
|
|
4.0,
|
|
1.0,
|
|
1.0,
|
|
1.0,
|
|
8.0
|
|
],
|
|
"UseOmniDirectionalModel": false,
|
|
"MeasurementModelType": 2,
|
|
"ScanStep": 10,
|
|
"ZHit": 0.9,
|
|
"ZShort": 0.2,
|
|
"ZMax": 0.05,
|
|
"ZRand": 0.05,
|
|
"VarHit": 0.08,
|
|
"LambdaShort": 1.0,
|
|
"LambdaUnknown": 0.01,
|
|
"KnownClassPrior": 0.5,
|
|
"UnknownScanProbThreshold": 0.9,
|
|
"AlphaSlow": 0.001,
|
|
"AlphaFast": 0.99,
|
|
"RejectUnknownScan": true,
|
|
"ResampleThresholdEss": 0.5,
|
|
"ResampleThresholds": [
|
|
0.2,
|
|
0.2,
|
|
0.2,
|
|
0.02,
|
|
-99999.0
|
|
],
|
|
"RelTransDdm": [
|
|
0.0,
|
|
0.0
|
|
],
|
|
"RelTransOdm": [
|
|
0.0,
|
|
0.0,
|
|
0.0
|
|
],
|
|
"ClassifierType": 0,
|
|
"EstimateReliability": true,
|
|
"FailureThreshold": 0.12,
|
|
"UseGLPoseSampler": true,
|
|
"GLSampledPoseTimeTH": 0.5,
|
|
"GmmPositionalVariance": 0.1,
|
|
"GmmAngularVariance": 0.1,
|
|
"PredDistUnifRate": 0.05,
|
|
"ConvergencePoseChangeThresholdMeters": 0.03,
|
|
"ConvergenceYawChangeThresholdRad": 0.05,
|
|
"ConvergenceStableDurationSeconds": 0.3,
|
|
"ConvergenceReliabilityMin": 0.9,
|
|
"ConvergenceMaeMaxMeters": 0.12,
|
|
"ConvergenceTimeoutSeconds": 30.0,
|
|
"ConvergenceMaxIterations": 1500,
|
|
"ConvergenceMinIterations": 10,
|
|
"ReliabilityMonitoring": {
|
|
"EnableReliabilityMonitoring": true,
|
|
"MonitoringIntervalSeconds": 2.0,
|
|
"MonitoringParticlesNum": 500,
|
|
"MonitoringIterationsPerCycle": 5
|
|
}
|
|
},
|
|
"OccupancyGrid": {
|
|
"OccupancyGrid": {
|
|
"MergeStrategy": 1,
|
|
"LogOddsClamp": 6.0,
|
|
"UseLogOddsAverage": true,
|
|
"FreeSpaceThreshold": 100,
|
|
"OccupiedSpaceThreshold": 0,
|
|
"UseBinaryOutput": false,
|
|
"EnableWallThinning": false,
|
|
"WallThinningIterations": 1,
|
|
"MinWallThicknessPixels": 1,
|
|
"AmbiguousCellValue": -1,
|
|
"AmbiguousRangeLower": 0.35,
|
|
"AmbiguousRangeUpper": 0.65,
|
|
"EnableMedianFilter": true,
|
|
"MedianFilterKernelSize": 3,
|
|
"TsdfFreeThreshold": 0.03,
|
|
"TsdfOccupiedThreshold": -0.01,
|
|
"TsdfMinWeight": 0.5,
|
|
"TsdfMaxTsd": 0.3
|
|
}
|
|
}
|
|
},
|
|
"Detection": {
|
|
"MarkerDetector": {
|
|
"LidarDevices": [
|
|
{
|
|
"DeviceId": "olei-front",
|
|
"IntensityThreshold": 2500,
|
|
"Position": {
|
|
"X": 0.527,
|
|
"Y": 0.0,
|
|
"Z": 0.0
|
|
},
|
|
"Orientation": {
|
|
"X": 0.1,
|
|
"Y": 0.0,
|
|
"Z": 0.0,
|
|
"W": 0.0
|
|
}
|
|
},
|
|
{
|
|
"DeviceId": "sick-lidar-001",
|
|
"IntensityThreshold": 0.89,
|
|
"Position": {
|
|
"X": 0.488,
|
|
"Y": 0.39,
|
|
"Z": 0.0
|
|
},
|
|
"Orientation": {
|
|
"X": 0.0,
|
|
"Y": 0.0,
|
|
"Z": -0.3826834,
|
|
"W": 0.9238795
|
|
}
|
|
}
|
|
],
|
|
"QrDevices": [
|
|
{
|
|
"DeviceId": "hik-qr-001",
|
|
"Position": {
|
|
"X": 0.0,
|
|
"Y": 0.0,
|
|
"Z": 0.0
|
|
},
|
|
"Orientation": {
|
|
"X": 0.0,
|
|
"Y": 0.0,
|
|
"Z": 0.0,
|
|
"W": 1.0
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
}
|