Skip to content

Commit e9405dc

Browse files
committed
header with editmode button,
move savepose button to edit mode
1 parent 4dde478 commit e9405dc

3 files changed

Lines changed: 46 additions & 33 deletions

File tree

kalman_gs/node_project/src/panels/arm.tsx

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ function isCloseEnough(jointsA: number[], jointsB: number[], maxDistance: number
105105

106106
function ArmStatus({
107107
editMode
108-
}: {
109-
editMode: boolean
108+
}: {
109+
editMode: boolean
110110
}) {
111111
const [rerenderCount, setRerenderCount] = useState(0);
112112
const [linearScale, setLinearScale] = useState<number | null>(lastServoLinearScale);
@@ -211,11 +211,11 @@ function ArmStatus({
211211
if (!poseName) return;
212212

213213
const currentValues = namesAndValues.map(joint => joint.value);
214-
214+
215215
const savedPosesRaw = localStorage.getItem('custom_arm_poses');
216216
const savedPoses = savedPosesRaw ? JSON.parse(savedPosesRaw) : [];
217-
218-
217+
218+
219219
const newPose: ArmPose= {
220220
id: Date.now(),
221221
name: poseName,
@@ -324,14 +324,12 @@ function PoseRequester({
324324
onSelectPose: (pose: ArmPose) => void;
325325
}) {
326326
const [rerenderCount, setRerenderCount] = useState(0);
327-
<<<<<<< HEAD
328327
const keepAlive = useRef(false);
329-
=======
330-
const [keepAlive, setKeepAlive] = useState(false);
328+
329+
// const [keepAlive, setKeepAlive] = useState(false);
331330
const [customPoses, setCustomPoses] = useState<ArmPose[]>([]);
332331

333332

334-
>>>>>>> 9c33c1a (edit panel)
335333
const rerender = useCallback(() => {
336334
setRerenderCount((count) => count + 1);
337335
}, [setRerenderCount]);
@@ -376,13 +374,13 @@ function PoseRequester({
376374
}, []);
377375

378376
const allPoses: ArmPose[] = [
379-
...predefinedPoses.poses.map((p) => ({
380-
...p,
381-
isCustom: false
377+
...predefinedPoses.poses.map((p) => ({
378+
...p,
379+
isCustom: false
382380
})),
383-
...customPoses.map((p) => ({
384-
...p,
385-
isCustom: true
381+
...customPoses.map((p) => ({
382+
...p,
383+
isCustom: true
386384
}))
387385
];
388386

@@ -466,9 +464,9 @@ function PoseRequester({
466464
reader.onload = (event) => {
467465
try {
468466
const importedData = JSON.parse(event.target?.result as string);
469-
467+
470468
const importedArray = Array.isArray(importedData) ? importedData : [importedData];
471-
469+
472470
const savedPosesRaw = localStorage.getItem('custom_arm_poses');
473471
let existingPoses: ArmPose[] = savedPosesRaw ? JSON.parse(savedPosesRaw) : [];
474472

@@ -487,7 +485,7 @@ function PoseRequester({
487485
});
488486

489487
localStorage.setItem('custom_arm_poses', JSON.stringify(existingPoses));
490-
488+
491489
window.dispatchEvent(new Event('local-poses-update'));
492490
alert(`Successfully imported ${importedArray.length} pose(s).`);
493491
} catch (err) {
@@ -502,13 +500,13 @@ function PoseRequester({
502500
<div className={styles['pose-requester']}>
503501
<div className={styles['header-container']}>
504502
<h2 className={styles['pose-header']}>Pose Requester</h2>
505-
503+
506504
{editMode && (<label className={styles['import-label']}>
507-
<input
508-
type="file"
509-
accept=".json"
510-
style={{ display: 'none' }}
511-
onChange={handleImportSinglePose}
505+
<input
506+
type="file"
507+
accept=".json"
508+
style={{ display: 'none' }}
509+
onChange={handleImportSinglePose}
512510
/>
513511
<div className={styles['joint-lock']} title="Import Pose JSON">
514512
<FontAwesomeIcon icon={faDownload} />
@@ -735,11 +733,11 @@ function EditPanel({
735733

736734
const saved = JSON.parse(localStorage.getItem('custom_arm_poses') || '[]');
737735
const poseIndex = saved.findIndex((p: ArmPose) => p.id === pose.id);
738-
736+
739737
if (poseIndex !== -1) {
740738
const updatedPose = { ...saved[poseIndex], [field]: value };
741739
saved[poseIndex] = updatedPose;
742-
740+
743741
localStorage.setItem('custom_arm_poses', JSON.stringify(saved));
744742
window.dispatchEvent(new Event('local-poses-update'));
745743
onChangePose({ ...pose, [field]: value });
@@ -757,12 +755,12 @@ function EditPanel({
757755
const newArray = currentArray.includes(jointNum)
758756
? currentArray.filter(n => n !== jointNum)
759757
: [...currentArray, jointNum].sort((a, b) => a - b);
760-
758+
761759
updatePoseField(field, newArray);
762760
};
763761
function JointGrid(){
764762
interface Jointsprops {
765-
data: any;
763+
data: any;
766764
name: string;
767765
};
768766
const JointCheckbox = ({data, name}: Jointsprops) => {
@@ -810,7 +808,7 @@ function EditPanel({
810808
</div>
811809
<JointGrid />
812810
<p className={styles['warn']} style={{ visibility: isReadOnly ? 'visible' : 'hidden' }}>⚠️ Predefined poses cannot be modified.</p>
813-
811+
814812
<div className={styles['edit-actions']} style={{ opacity: isReadOnly ? 0.3 : 1, pointerEvents: isReadOnly ? 'none' : 'auto' }}>
815813
<div onClick={handleRename} className={styles['edit-button']}>Rename</div>
816814
<div onClick={handleDelete} className={styles['edit-button']}>
@@ -842,7 +840,7 @@ export default function Arms() {
842840
<div className={styles['arm-panel']}>
843841
<ArmStatus editMode={isEditMode} />
844842
<div className={styles['trajectory-and-pose']}>
845-
<PoseRequester
843+
<PoseRequester
846844
editMode={isEditMode}
847845
onSelectPose={(pose) => setSelectedPose(pose)}
848846
/>

kalman_gs/node_project/src/panels/index.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import Arms from './arm';
2-
<<<<<<< HEAD
32
import Camera2Dof from './camera-2dof';
4-
=======
53
import ArmHeader from './arm.header';
6-
>>>>>>> 6a5d02f (header with editmode button,)
74
import Feeds from './feeds';
85
import Imu from './imu';
96
import Map from './map';

kalman_wheels/kalman_wheels/gamepad_driving_node.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,24 @@ def __init__(self):
2828
self.last_drive_msg = Drive()
2929

3030
def joy_cb(self, msg: Joy):
31+
left_trigger = msg.axes[LEFT_TRIGGER]
32+
right_trigger = msg.axes[RIGHT_TRIGGER]
33+
if left_trigger == 0:
34+
left_trigger = 1
35+
if right_trigger == 0:
36+
right_trigger = 1
37+
# ^ Needed to avoid situation where gamepad after initialization might send 0s
38+
3139
# Detect if turning in place.
3240
if msg.buttons[LEFT_SHOULDER] or msg.buttons[RIGHT_SHOULDER]:
3341
# Read input.
42+
<<<<<<< HEAD
3443
speed = (-msg.axes[LEFT_TRIGGER] * 0.5 + 0.5) - (
3544
-msg.axes[RIGHT_TRIGGER] * 0.5 + 0.5
3645
)
46+
=======
47+
speed = (-left_trigger * 0.5 + 0.5) - (-right_trigger * 0.5 + 0.5)
48+
>>>>>>> 0c56e8f (bug fix headless driving:)
3749
speed *= min(msg.buttons[LEFT_SHOULDER] + msg.buttons[RIGHT_SHOULDER], 1)
3850
if speed == 0:
3951
speed = 0.0001
@@ -45,13 +57,19 @@ def joy_cb(self, msg: Joy):
4557
drive = Drive()
4658
drive.sin_angle = msg.axes[RIGHT_X]
4759
drive.inv_radius = msg.axes[LEFT_X] / self.turn_radius.value
60+
<<<<<<< HEAD
4861
drive.speed = (-msg.axes[RIGHT_TRIGGER] * 0.5 + 0.5) - (
4962
-msg.axes[LEFT_TRIGGER] * 0.5 + 0.5
5063
)
5164

5265
if self.drive_msg_is_zero(drive) and self.drive_msg_is_zero(
5366
self.last_drive_msg
5467
):
68+
=======
69+
drive.speed = (-right_trigger * 0.5 + 0.5) - (-left_trigger * 0.5 + 0.5)
70+
71+
if self.drive_msg_is_zero(drive) and self.drive_msg_is_zero(self.last_drive_msg):
72+
>>>>>>> 0c56e8f (bug fix headless driving:)
5573
return
5674

5775
self.last_drive_msg = drive

0 commit comments

Comments
 (0)