• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..--

.github/workflows/25-Apr-2025-6962

py/pica/25-Apr-2025-5,7224,920

res/25-Apr-2025-

src/25-Apr-2025-5,1984,281

static/25-Apr-2025-1,142971

tests/25-Apr-2025-794608

.gitignoreD25-Apr-202549 65

Android.bpD25-Apr-20251.2 KiB6257

CONTRIBUTING.mdD25-Apr-20251.1 KiB3021

Cargo.lockD25-Apr-202525.5 KiB1,022909

Cargo.tomlD25-Apr-20251.6 KiB6455

LICENSED25-Apr-202511.1 KiB202169

METADATAD25-Apr-2025434 1917

MODULE_LICENSE_APACHE2D25-Apr-20250

OWNERSD25-Apr-202584 54

README.mdD25-Apr-20255.8 KiB140115

build.rsD25-Apr-20251.6 KiB4728

README.md

1[![Crate](https://img.shields.io/crates/v/pica?style=flat-square)](https://crates.io/crates/pica)
2[![Build workflow](https://img.shields.io/github/actions/workflow/status/google/pica/build.yml?style=flat-square)](https://github.com/google/pica/actions/workflows/build_and_test.yml?query=branch%3Amain)
3
4# Pica
5
6Pica is a virtual UWB Controller implementing the FiRa UCI specification.
7It has been designed for testing UWB ranging capabilities.
8Pica supports the following features:
9
10- Pica keeps an internal representation of a 3-D scene.
11- Pica lets multiple clients connect through TCP sockets.
12  Each new connection spawns an attached UWB subsystem. Connected hosts can
13  interact together as if they existed in a single 3-D scene.
14- Pica implements a nice GUI through a web server.
15- Pica provides HTTP commands to interact with the scene directly such as create and destroy
16  virtual anchors.
17
18# Build and Run
19
20```bash
21$> git clone https://github.com/google/pica.git
22$> cd pica/
23$> cargo run
24```
25
26You should receive the following output:
27
28```
29Pica: Listening on: 7000
30Pica: Web server started on http://0.0.0.0:3000
31```
32
33You can now open the web interface at `http://0.0.0.0:3000` and the HTTP commands documentation
34at `http://0.0.0.0:3000/openapi`. The scene should be empty and look like this:
35
36![Pica empty scene](./res/empty_scene.png)
37
38# Command line
39
40A command line tool is available to trigger some action such as creating an anchor.
41Run pica in a terminal then open a new one and do:
42```
43$> cd pica/
44$> python3 scripts/console.py
45```
46
47If you hit `Enter`, the console will list you all the available commands:
48```
49device_reset                    Reset the UWBS.
50get_device_info                 Retrieve the device information like (UCI version and other vendor specific info).
51get_caps_info                   Get the capability of the UWBS.
52session_init                    Initialize the session
53session_deinit                  Deinitialize the session
54session_set_app_config          set APP Configuration Parameters for the requested UWB session.
55session_get_app_config          retrieve the current APP Configuration Parameters of the requested UWB session.
56session_get_count               Retrieve number of UWB sessions in the UWBS.
57session_get_state               Query the current state of the UWB session.
58range_start                     start a UWB session.
59range_stop                      Stop a UWB session.
60get_ranging_count               Get the number of times ranging has been attempted during the ranging session..
61pica_create_anchor              Create a Pica anchor
62pica_destroy_anchor             Destroy a Pica anchor
63pica_get_state                  Return the internal Pica state
64pica_init_uci_device            Initialize an uci device
65pica_set_position               Set the position of a Device
66```
67
68If you wish to create a virtual anchor:
69
70```bash
71$> cd pica/ && python3 scripts/console.py # If the console is not started yet
72$> --> pica_create_anchor 00:00 # pica_create_anchor <mac_address>
73$> --> pica_create_anchor 00:01 # Create another one
74```
75# Architecture
76
77- *Device* UWB subsystem created for a connected host.
78- *Session* UWB ranging session opened by a connected host.
79- *Anchor* virtual UWB host, responding to ranging requests from
80  connected hosts.
81
82```
83                 ┌────────────────────┐
84                 │ Web                │
85                 │                    │
86                 └─────┬─────────▲────┘
87                       │         │    HTTP localhost:3000
88  ┌────────────────────▼─────────┴───────┐
89  │                                      │
90  │                 Pica                 │
91  │                                      │
92  │  ┌────────┐  ┌────────┐  ┌────────┐  │
93  │  │Anchor1 │  │Device1 │  │Device2 │  │
94  │  ├────────┤  │        │  │        │  │
95  │  │Anchor2 │  ├────────┤  ├────────┤  │
96  │  ├────────┤  │Session1│  │Session1│  │
97  │  │...     │  ├────────┤  ├────────┤  │
98  │  │        │  │Session2│  │Session2│  │
99  │  └────────┘  └──▲──┬──┘  └──▲──┬──┘  │
100  │                 │  │        │  │     │
101  └─────────────────┼──┼────────┼──┼─────┘
102                    │  │        │  │  TCP localhost:7000
103                 ┌──┴──▼──┐  ┌──┴──▼──┐
104                 │Client1 │  │Client2 │
105                 │        │  │        │
106                 ├────────┤  ├────────┤
107                 │VirtIO  │  │        │
108                 ├────────┤  │        │
109                 │UWB HAL │  │        │
110                 ├────────┤  │Python  │
111                 │Cuttle  │  │console │
112                 │fish    │  │        │
113                 └────────┘  └────────┘
114```
115
116# Http commands
117
118Pica also implements HTTP commands, the documentation is available at `http://0.0.0.0:3000/openapi`.
119The set of HTTP commands let the user interact with Pica amd modify its scene.
120
121# Tests
122
123Setup your python env:
124
125```bash
126python3 -m venv venv
127source venv/bin/activate
128pip install pytest
129pip install pytest_asyncio
130pip install -e py/pica/
131```
132
133Then run the tests
134
135```bash
136pytest --log-cli-level=DEBUG -v
137```
138
139The tests are located in `./tests/`
140