# drawing-robot-ros2 This repository contains ROS2 packages which make up a system used for drawing SVG images on different robots. These packages are in 'src/'. Documentation and build scripts for the entire project are at the top level. The simplest way to run the project currently is by building and running the docker container. ## Docker ### Build container ``` sh bash .docker/build.bash ``` ### Run built container ``` sh bash .docker/run.bash ``` If active changes are being made, run: ``` sh bash .docker/devel.bash ``` This will mount the host `drawing-robot-ros2` directory in the container at `src/drawing-robot-ros2`. ## TODO Building locally Requirements: - python3-pip - python3-pil.imagetk - ros-humble-moveit - ros-humble-ros-gz - ignition-fortress ``` sh ./rebuild.sh ``` ``` sh source src/install/local_setup.bash ``` ## Running ### RobotController One of the following RobotControllers should be started: DummyController echoes Motion messages to the terminal. ``` sh ros2 run robot_controller dummy_controller ``` AxidrawController draws on the axidraw robot ``` sh ros2 launch axidraw_controller axidraw_controller ``` This starts the simulated lite6 ``` sh ros2 launch lite6_controller lite6_gazebo.launch.py ``` This runs the real lite6 ``` sh ros2 launch lite6_controller lite6_real.launch.py ``` This runs the real lite6 without Rviz (can be run on headless device over ssh) ``` sh ros2 launch lite6_controller lite6_real_no_gui.launch.py ``` ### DrawingController Once a RobotController is running, simultaneously (using tmux or another terminal) run ``` sh ros2 run drawing_controller drawing_controller svg/test.svg ``` This will draw the svg image given as the last argument. ## SVG compatibility info Tested with SVG from the following programs - Inkscape - Inkpad - Affinitydraw - vtracer Delimiter characters seem to vary somewhat. The following examples work: TODO ADD EXAMPLES OF SVG PATHS The following SVG primitives are supported: | Primitive | Support | |-------------------------------------|----------| | a | no | | animate | no | | animateMotion | no | | animateTransform | no | | circle | no | | clipPath | no | | defs | no | | desc | no | | discard | no | | ellipse | no | | feBlend | no | | feColorMatrix | no | | feComponentTransfer | no | | feComposite | no | | feConvolveMatrix | no | | feDiffuseLighting | no | | feDisplacementMap | no | | feDistantLight | no | | feDropShadow | no | | feFlood | no | | feFuncA | no | | feFuncB | no | | feFuncG | no | | feFuncR | no | | feGaussianBlur | no | | feImage | no | | feMerge | no | | feMergeNode | no | | feMorphology | no | | feOffset | no | | fePointLight | no | | feSpecularLighting | no | | feSpotLight | no | | feTile | no | | feTurbulence | no | | filter | no | | foreignObject | no | | g | yes | | hatch | no | | hatchpath | no | | image | no | | line | yes | | linearGradient | no | | marker | no | | mask | no | | metadata | no | | mpath | no | | path | partial | | pattern | no | | polygon | yes | | polyline | yes | | radialGradient | no | | rect | no | | script | no | | set | no | | stop | no | | style | no | | svg | no | | switch | no | | symbol | no | | text | no | | textPath | no | | title | no | | tspan | no | | use | no | | view | no | And the following SVG path commands are supported: | Command type | Supported | Unsupported | |------------------------|-------------------|-------------| | MoveTo | M, m | | | LineTo | L, l, H, h, V, v | | | Cubic Bézier Curve | C, c, S, s | | | Quadratic Bézier Curve | | Q, q, T, t | | Elliptical Arc Curve | | A, a | | ClosePath | Z, z | | ## Axidraw concerns ## xArm concerns TODO make TCP height diagram The following paths work, notic ## Creating compatible SVG images https://github.com/visioncortex/vtracer Use single layer (g) SVGs ## ROS2 rpi4 https://github.com/ros-realtime/ros-realtime-rpi4-image/releases After unpacking the tar file, flash it to sd card. Log in with "ubuntu:ubuntu". ``` sh sudo -i loadkeys fi passwd ubuntu #change from default 'ubuntu' to '1234' apt-mark hold $(uname -r) linux-firmware u-boot-rpi u-boot-tools #prevent kernel updates apt-mark hold libraspberrypi-bin libraspberrypi-dev libraspberrypi-doc libraspberrypi0 apt-mark hold raspberrypi-bootloader raspberrypi-kernel raspberrypi-kernel-headers apt update && apt upgrade apt install ros-dev-tools ``` ``` sh adduser ubuntu dialout #give access to serial devices (axidraw) ``` ### Misc commands ``` sh apt update apt install git tmux python3-colcon-ros python3-pip ros-humble-moveit ``` ``` sh apt install colcon apt search colcon apt install ros-dev-tools vi /etc/issue systemctl stop wpa_supplicant wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf wpa_cli ip link set wlan0 up wpa_cli dhclient wlan0 ping google.com apt install ros-galactic-moveit apt install xauth vim /etc/ssh/sshd_config systemctl restart sshd colcon build --packages-select robot_interfaces robot_controller ``` sets priority for wlan0; uses it as gateway if connected. /etc/netplan/50-cloud-init.yaml ``` sh network: wifis: wlan0: dhcp4: true dhcp4-overrides: route-metric: 100 optional: true access-points: "SSID": password: "PSK" ethernets: eth0: dhcp4: true dhcp4-overrides: route-metric: 200 optional: true version: 2 ``` /etc/ssh/sshd: ``` X11Forwarding yes X11UseLocalhost no ``` ### Access xarm webUI from different network If connected to the pi on 192.168.22.199, one can forward the webUI to localhost:8080 with the following: ``` sh ssh -L 8080:192.168.1.150:18333 ubuntu@192.168.22.199 ``` ## Moveit2 docs ``` sh git clone https://github.com/ros-planning/moveit2.git cd moveit2 git checkout humble sudo apt-get install doxygen graphviz DOXYGEN_OUTPUT_DIRECTORY=docs doxygen firefox docs/index.html ```