Files
orisys_arm/station/test/test_position_command_fence.py
T

48 lines
2.4 KiB
Python

"""Compile/run the actual hardware guard without ROS or a robot connection."""
import subprocess
import tempfile
from pathlib import Path
from unittest import TestCase
class PositionCommandFenceTest(TestCase):
def test_reject_old_targets_after_enable_and_native_movel(self):
root = Path(__file__).resolve().parents[2]
include = root / 'src/flexiv_ros2/flexiv_hardware/include'
code = r"""
#include <cassert>
#include <limits>
#include "flexiv_hardware/position_command_fence.hpp"
int main() {
flexiv_hardware::MotionExecutionLatch latch;
assert(!latch.observe(true, true, false)); // not activated
latch.activate(); assert(latch.observe(true, true, false));
assert(!latch.observe(true, false, false)); // physical E-stop
for (int i=0; i<2000; ++i) assert(!latch.observe(true, true, false)); // Enable cannot resume
latch.activate(); assert(latch.observe(true, true, false));
assert(!latch.observe(true, true, true)); // fault
assert(!latch.observe(true, true, false)); // clear fault cannot resume
latch.activate(); assert(!latch.observe(false, true, false)); // disconnect
assert(!latch.observe(true, true, false));
flexiv_hardware::PositionCommandFence fence;
std::vector<double> current(7, .74), old(7, 0.);
for (int i=0; i<2000; ++i) assert(!fence.accept(old, current));
assert(!fence.accept({}, current));
auto invalid = current; invalid[0] = std::numeric_limits<double>::quiet_NaN();
assert(!fence.accept(invalid, current));
assert(fence.accept(current, current));
assert(fence.accept(old, current)); // normal trajectory after handshake
fence.reset(); // native MoveL / controller activation
for (int i=0; i<2000; ++i) assert(!fence.accept(old, current));
auto start = current; start[0] += .0001;
assert(fence.accept(start, current));
assert(fence.accept(old, current));
}
"""
with tempfile.TemporaryDirectory() as folder:
source = Path(folder)/'fence.cpp'; binary = Path(folder)/'fence'
source.write_text(code)
built = subprocess.run(['g++','-std=c++17','-I',str(include),str(source),'-o',str(binary)],capture_output=True,text=True,timeout=30)
self.assertEqual(built.returncode,0,built.stderr)
result = subprocess.run([str(binary)],capture_output=True,text=True,timeout=5)
self.assertEqual(result.returncode,0,result.stderr)