diff --git a/micro_ros_agent/CMakeLists.txt b/micro_ros_agent/CMakeLists.txt index b6eee22..9734ffa 100644 --- a/micro_ros_agent/CMakeLists.txt +++ b/micro_ros_agent/CMakeLists.txt @@ -122,7 +122,7 @@ if(UROSAGENT_GENERATE_PROFILE) set(_XML_DEFAULT_READ_BIN "${_OUTPUT_PATH}/bin/Xml_read_default_profiles.py") normalize_path(_XML_DEFAULT_READ_BIN "${_XML_DEFAULT_READ_BIN}") - set(_PYTHON_PKG_TOOL ${PROJECT_NAME}) + set(_PYTHON_PKG_TOOL utils) set(_RESOURCE_DIR "${_OUTPUT_PATH}/resource") normalize_path(_RESOURCE_DIR "${_RESOURCE_DIR}") @@ -198,7 +198,7 @@ from ${_PYTHON_PKG_TOOL} import * endforeach() execute_process( - COMMAND + COMMAND "${PYTHON_EXECUTABLE}" "${_XML_DEFAULT_READ_BIN}" "--default-xml-path" "${_RESOURCE_DIR}" OUTPUT_VARIABLE _XmlDoc @@ -207,7 +207,7 @@ from ${_PYTHON_PKG_TOOL} import * ) if(NOT _result EQUAL 0) - message(FATAL_ERROR "Error in typesuppor generation") + message(FATAL_ERROR "Error in typesupport generation") endif() foreach(package ${_packages}) @@ -241,7 +241,7 @@ from ${_PYTHON_PKG_TOOL} import * ) if(NOT _result EQUAL 0) - message(FATAL_ERROR "Error in typesuppor generation") + message(FATAL_ERROR "Error in typesupport generation") endif() set(_XmlDoc "${_XmlDoc}${_XmlGen}") diff --git a/micro_ros_agent/micro_ros_agent/__init__.py b/micro_ros_agent/utils/__init__.py similarity index 100% rename from micro_ros_agent/micro_ros_agent/__init__.py rename to micro_ros_agent/utils/__init__.py diff --git a/snap/hooks/configure b/snap/hooks/configure new file mode 100755 index 0000000..d51603c --- /dev/null +++ b/snap/hooks/configure @@ -0,0 +1,104 @@ +#!/bin/sh -e + +# Confirm that the transport is valid +transport="$(snapctl get transport)" +case "$transport" in + udp4) ;; + udp6) ;; + tcp4) ;; + tcp6) ;; + serial) ;; + pseudoterminal) ;; + *) + echo "'$transport' is not a supported transport" >&2 + return 1 + ;; +esac + +# Confirm that the middleware is valid +middleware="$(snapctl get middleware)" +case "$middleware" in + dds) ;; + rtps) ;; + ced) ;; + *) + echo "'$middleware' is not a supported middleware" >&2 + return 1 + ;; +esac + +if [ "$transport" = "serial" ] || [ "$transport" = "pseudoterminal" ]; then + # A serial transport if being used, which requires a valid baud rate + # as well as a valid device + baudrate="$(snapctl get baudrate)" + if ! expr "$baudrate" : '^[0-9]\+$' > /dev/null; then + echo "'$baudrate' is not a valid baud rate" >&2 + return 1 + fi + + device="$(snapctl get device)" + if [ -z "$device" ]; then + echo "Device must be specified" >&2 + return 1 + fi +else + port="$(snapctl get port)" + if ! expr "$port" : '^[0-9]\+$' > /dev/null; then + echo "'$port' is not a valid port" >&2 + return 1 + fi +fi + +# Confirm that discovery is a boolean +discovery="$(snapctl get discovery)" +case "$discovery" in + true) + # Confirm that discovery port is valid + port="$(snapctl get discovery-port)" + if ! expr "$port" : '^[0-9]\+$' > /dev/null; then + echo "'$port' is not a valid discovery port" >&2 + return 1 + fi + ;; + false) ;; + *) + echo "'$discovery' is not a valid boolean for discovery" >&2 + return 1 + ;; +esac + +# Confirm that the verbosity is valid +verbosity="$(snapctl get verbosity)" +if ! expr "$verbosity" : '^[0-6]$' > /dev/null; then + echo "'$verbosity' is not a valid verbosity" >&2 + return 1 +fi + +# Confirm that p2p port is valid (assuming it's set) +p2p_port="$(snapctl get p2p-port)" +if [ -n "$p2p_port" ]; then + port="$(snapctl get p2p-port)" + if ! expr "$port" : '^[0-9]\+$' > /dev/null; then + echo "'$port' is not a valid p2p port" >&2 + return 1 + fi +fi + +# Confirm that daemon is a boolean, and enable the service if true +daemon="$(snapctl get daemon)" +case "$daemon" in + true) + snapctl start --enable "$SNAP_INSTANCE_NAME.daemon" + + # In case it was alraedy started and the configuration changed, + # restart the service + snapctl restart "$SNAP_INSTANCE_NAME.daemon" + ;; + false) + snapctl stop --disable "$SNAP_INSTANCE_NAME.daemon" + ;; + *) + echo "'$daemon' is not a valid boolean for daemon" >&2 + return 1 + ;; +esac \ No newline at end of file diff --git a/snap/hooks/install b/snap/hooks/install new file mode 100755 index 0000000..5040035 --- /dev/null +++ b/snap/hooks/install @@ -0,0 +1,19 @@ +#!/bin/sh -e + +# Set default configuration values +snapctl set transport=udp4 +snapctl set middleware=dds +snapctl set verbosity=4 +snapctl set discovery=false +snapctl set discovery-port=7400 +snapctl set p2p-port! # unset + +# Network-specific things +snapctl set port=8888 + +# Serial-specific things +snapctl set baudrate=115200 +snapctl set device! # unset + +# By default the daemon is disabled +snapctl set daemon=false \ No newline at end of file diff --git a/snap/local/micro-ros-agent-daemon b/snap/local/micro-ros-agent-daemon new file mode 100755 index 0000000..1ec437e --- /dev/null +++ b/snap/local/micro-ros-agent-daemon @@ -0,0 +1,27 @@ +#!/bin/sh -e + +set -- --middleware "$(snapctl get middleware)" "$@" +set -- --verbose "$(snapctl get verbosity)" "$@" + +transport="$(snapctl get transport)" +if [ "$transport" = "serial" ] || [ "$transport" = "pseudoterminal" ]; then + set -- --dev "$(snapctl get device)" "$@" +else + set -- --port "$(snapctl get port)" "$@" +fi + +if [ "$(snapctl get discovery)" = "true" ]; then + set -- --discovery "$@" + + discovery_port="$(snapctl get discovery-port)" + if [ -n "$discovery_port" ]; then + set -- --disport "$discovery_port" "$@" + fi +fi + +p2p_port="$(snapctl get p2p-port)" +if [ -n "$p2p_port" ]; then + set -- --p2p "$p2p_port" "$@" +fi + +exec "$SNAP/lib/micro_ros_agent/micro_ros_agent" "$transport" "$@" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml new file mode 100644 index 0000000..f5fb9e7 --- /dev/null +++ b/snap/snapcraft.yaml @@ -0,0 +1,119 @@ +name: micro-ros-agent +base: core20 +version: git +summary: Bridge between Micro ROS client applications and ROS 2 +description: | + Micro-ROS, whose default implementation is based on eProsima's + Micro XRCE-DDS middleware, is composed of client applications + which interact with the ROS 2 world by means of an Agent. + This agent keeps tracks of the entities created by means of + requests performed on the microcontroller side, and uses them + to communicate with the ROS 2 dataspace. + + Being an extension of the Micro XRCE-DDS Agent, the micro-ROS + agent supports being run by the user like this: + + $ micro-ros-agent --help + + In addition, the Agent supports running as a service that can be + enabled with: + + $ snap set micro-ros-agent daemon=true + + If the service is enabled, by default it uses the `udp4` transport on + port 8888. The following parameters can be changed (these are + specific to the service, the `micro-ros-agent` command simply + takes command-line arguments, but the capabilities are the same): + + * `transport`. Supported transports are `udp4`, `udp6`, `tcp4`, + `tcp6`, `serial`, and `pseudoterminal`. Default is `udp4`. Change + with: + + $ snap set micro-ros-agent transport="new transport" + + * `middleware`. Supported kinds of middleware are `ced`, `rtps`, and + `dds`. Default is `dds`. Change with: + + $ snap set micro-ros-agent middleware="new middleware" + + * `verbosity`. Supported verbosity levels are 0-6, defaulting to 4. + Change with: + + $ snap set micro-ros-agent verbosity="selected verbosity" + + * `discovery`. Enable or disable the discovery server. Defaults to + "false". Change with: + + $ snap set micro-ros-agent discovery="true or false" + + * `discovery-port`. Port on which the discovery server (see above) + listens. Defaults to 7400. Change with: + + $ snap set micro-ros-agent discovery-port="selected port" + + * `p2p-port`. Port to use for the P2P profile. Change with: + + $ snap set micro-ros-agent p2p-port="selected port" + + * `port`. Port on which the agent listens. Only applicable to one of + the UDP or TCP transports (see above). Defaults to 8888. Change with: + + $ snap set micro-ros-agent port="selected port" + + * `baudrate`. Baud rate to use when accessing serial ports. Only + applicable when using the `serial` or `pseudoterminal` transport. + Defaults to 115200. Change with: + + $ snap set micro-ros-agent baudrate="baud rate" + + * `device`. The serial device to use. Only applicable when using the + `serial` or `pseudoterminal` transport. Change with: + + $ snap set micro-ros-agent device="device path" + + +grade: stable +confinement: strict + +architectures: + - build-on: amd64 + - build-on: arm64 + - build-on: armhf + - build-on: ppc64el + +parts: + + uros-agent: + plugin: colcon + source: . + override-build: | + git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git -b $ROS_DISTRO + git clone https://github.com/eProsima/Micro-CDR.git -b $ROS_DISTRO + git clone https://github.com/micro-ROS/micro_ros_msgs.git -b $ROS_DISTRO + git clone https://github.com/micro-ROS/rosidl_typesupport_microxrcedds.git -b $ROS_DISTRO + git clone https://github.com/micro-ROS/rmw-microxrcedds.git -b $ROS_DISTRO + . /opt/ros/$ROS_DISTRO/setup.sh + colcon build --merge-install --install-base $SNAPCRAFT_PRIME --cmake-args '-DUAGENT_CLI_PROFILE=OFF -DUAGENT_BUILD_EXECUTABLE=OFF' --packages-up-to micro_ros_agent + build-packages: [make, gcc, g++] + stage-packages: [ros-foxy-ros2launch] + + runner: + plugin: dump + source: snap/local/ + organize: + '*': usr/bin/ + +apps: + micro-ros-agent: + command: lib/micro_ros_agent/micro_ros_agent + environment: + LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP/lib" + plugs: [network, network-bind, serial-port] + extensions: [ros2-foxy] + + daemon: + command: usr/bin/micro-ros-agent-daemon + environment: + LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP/lib" + daemon: simple + plugs: [network, network-bind, serial-port]