# Raspberry Pi Sensors Installation Web version: https://hackmd.io/@cocobird231/BJidBuC6i *`Updated: 2024/04/26`* :::warning **Guidance for hardware installation:** [rpi_sensors Hardware Installation](https://hackmd.io/@cocobird231/rkUS37lKc) ::: The package installer for sensor depends on Raspberry Pi 4. The ROS2 environment is based on Docker. **System requirements**: - OS: Raspberry Pi OS (64-bit recommend) - RAM: 4G or higher :::info [How to write Raspberry Pi OS into SD card?](https://hackmd.io/@cocobird231/S1eCXHR6i) ::: **Now supported sensor types**: - GPS module (MAX-M8Q GNSS, ZED-F9P HAT) - SenseHat module (IMU and environment sensors) - RF Communication module (send and receive) - Ultrasound module (HC-SR04 sensors) - Webcam module (Based on OpenCV4) - WebRTC streaming camera (Based on GStreamer) --- ## Usage ### For Newly Install (No `ros2_docker` Under Home Path) Run the pre-install script`get-rpi-sensors-install.sh` to grab git controlled SensorPack directory (renamed as `ros2_docker`). **Make sure Raspberry Pi 4 is connected to the internet before installation.** ```bash curl -fsSL ftp://61.220.23.239/rv-12/get-rpi-sensors-install.sh | bash ``` The new directory `ros2_docker` will be created under `$HOME`. ### Module Installation 1. Run the script `install.sh` under `ros2_docker` to install package for selected module. ```bash . ~/ros2_docker/install.sh ``` Select a number for module installation 2. Determine the network interface and IP for program to execute. 3. Reboot while installation finished. The program will be running at startup automatically. :::warning **Effects After Installation** - Files Creation: - Under `$HOME/ros2_docker` - `run.sh.tmp` - `Dockerfile.tmp` - `.modulename` (selected module pack name) - `.moduleinterface` (interface setting) - `.modulename` (IP setting) - `common.yaml` (copy from codePack package) - `service.json` (copy from codePack package) - Under System Environment - `/boot/config.txt.tmp` - `/etc/dhcpcd.conf.tmp` - `/etc/xdg/autostart/ros2_docker.desktop` (startup) - Dependencies Installation - `python3` `python3-dev` `python3-pip` `git` `curl` - `Docker` - APT installed packages were listed under `requirement_apt.txt`. - Python3 pip installed packages were listed under `requirement_pip.txt`. ::: ### Module Update 1. Run the script `install.sh` under `ros2_docker` directory and enter `u` for update process. ```bash . install.sh # Enter 'u' for update process ``` 2. The update process will update `codePack` under `ros2_docker` by pulling repositories from git server. 3. After pulling, the module program will start rebuilding if module program had been installed before. ### Module Removal 1. Run the script `install.sh` under `ros2_docker` directory and enter `r` for package remove process. ```bash . install.sh # Enter 'r' for update process ``` The files which describes at **Effects After Installation** section will be removed except the files installed from `requirement_apt.txt` and `requirement_pip.txt`. - **Remove docker image (option)** check container ```bash sudo docker ps -a ``` stop and delete container if running ```bash sudo docker stop <container_id> ``` ```bash sudo docker rm <container_id> ``` check images ```bash sudo docker images ``` delete image ```bash sudo docker rmi <image_id> ``` ### Parameters Setting for ROS2 Settings may be varient in different sensors, but there are some common parameters need to be changed: 1. Device node name (under `generic_prop` tag) 2. Device ID (under `generic_prop` tag) 3. Topic name (may be one or more) 4. Publish interval (Need to be float, e.g. not `1` but `1.0`) Modify the settings under `$HOME/ros2_docker/common.yaml` and reboot device. ![](https://hackmd.io/_uploads/ByKJA8Syp.png) --- ### One Line Command :::success The `install.sh` now supported parser installation. ::: The package installation, updating and removal functions can be done by adding some arguments while running `install.sh`. #### **Overall arguments** ```bash! . install.sh [[-i|--install] <package_name>] [--interface <network_interface>] [--ip [<static_ip>|dhcp]] [-rm|--remove] [-u|--update] [-p|--preserve] ``` - Command explanation - **`-i|--install`**: install specific package from codePack to Docker. - **`-rm|--remove`**: remove package settings and environment settings. - **`-u|--update`**: update codePack without install packages. - **`-p|--preserve`**: preserve `common.yaml` file during installation. - **`--interface`**: determine the network interface during installation. - **`--ip`**: determine the network ip during installation. - Variable explanation - **package_name**: real package name under codePack. If variable set to `auto`, the process will automatically detect current installed module settings, then install the packages. - **network_interface**: the network interface to detect network or internet connection, e.g. `eth0` or `wlan0`. - **static_ip**: the format should be like `ip/mask`, e.g. `192.168.1.10/16`. :::info - **For Commands** The three commands `-i`, `-u` and `-rm` can be work independently. The priority order of the three commands from high to low are: `-rm` > `-u` > `-i`. That is, if three commands exists at the same time, the process will be: 1. Remove installed package settings and environment settings. (The Docker container will be preserved) 2. Update codePack without install any packages. 3. Install packages from codePack to Docker. The flag `-p` tells the installer to keep old `common.yaml` file. If `-p` set but `-i` not set, the `-p` will be ignored. If `-p` set but the `common.yaml` file not found, the preservation will be ignored. The `--interface` determines the network interface for network detection or internet detection while installed program startup. The `--interface` will be ignored if `-i` not set. The `--interface` is not necessary and will be set to default `eth0`. The `--ip` can be set to `dhcp` and `<static_ip>`. If `<static_ip>` used, The `/etc/dhcpcd.conf` will be configured. The `--ip` is not necessary and will be set to default `dhcp`. ::: :::warning - **For Variables** The default value of the variables describes as following: - `package_name`: `NONE` - `network_interface`: `eth0` - `static_ip`: `NONE` The `package_name` is necessary if `-i` set. The valid name of `package_name` were shown under codePack. If the package had installed before, set `package_name` to `auto` is valid for process to auto detect the package name. If `package_name` set to `auto`, the process will ignored `--interface` and `--ip` settings. The `network_interface` is necessary if `--interface` set. The `network_interface` do not have any valid check mechanism, be careful of the mistyping. The `static_ip` is necessary if `--ip` not set to `dhcp`. ::: #### **Examples** - Install package ```bash! . install.sh -i <package_name> [--interface <network_interface>] [--ip [<static_ip> | dhcp]] ``` - Update codePack ```bash! . install.sh -u ``` - Update codePack then install package ```bash! . install.sh -i <package_name> [--interface <network_interface>] [--ip [<static_ip> | dhcp]] -u ``` - Update current package while preserve `common.yaml` ```bash! . install.sh -u -i auto -p ``` - Remove current package ```bash . install.sh -rm ``` - Remove current package, update codePack and install package ```bash! . install.sh -rm -u -i <package_name> [--interface <network_interface>] [--ip [<static_ip> | dhcp]] ```