mirror of
https://github.com/micro-ROS/micro-ROS-Agent.git
synced 2026-09-06 09:55:15 +02:00
Snap build for the micro-ROS-Agent (#43)
* Add snap packaging * First approach for snap packaging * Working state * Fixes * Simplify snapcraft.yaml * Fix snapcraft build * Fix daemon * Fix compilation due to external micro_ros_msgs * CMakeLists cleanup
This commit is contained in:
+104
@@ -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
|
||||
Executable
+19
@@ -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
|
||||
Executable
+27
@@ -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" "$@"
|
||||
@@ -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]
|
||||
Reference in New Issue
Block a user