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:
@@ -122,7 +122,7 @@ if(UROSAGENT_GENERATE_PROFILE)
|
|||||||
set(_XML_DEFAULT_READ_BIN "${_OUTPUT_PATH}/bin/Xml_read_default_profiles.py")
|
set(_XML_DEFAULT_READ_BIN "${_OUTPUT_PATH}/bin/Xml_read_default_profiles.py")
|
||||||
normalize_path(_XML_DEFAULT_READ_BIN "${_XML_DEFAULT_READ_BIN}")
|
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")
|
set(_RESOURCE_DIR "${_OUTPUT_PATH}/resource")
|
||||||
normalize_path(_RESOURCE_DIR "${_RESOURCE_DIR}")
|
normalize_path(_RESOURCE_DIR "${_RESOURCE_DIR}")
|
||||||
@@ -207,7 +207,7 @@ from ${_PYTHON_PKG_TOOL} import *
|
|||||||
)
|
)
|
||||||
|
|
||||||
if(NOT _result EQUAL 0)
|
if(NOT _result EQUAL 0)
|
||||||
message(FATAL_ERROR "Error in typesuppor generation")
|
message(FATAL_ERROR "Error in typesupport generation")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
foreach(package ${_packages})
|
foreach(package ${_packages})
|
||||||
@@ -241,7 +241,7 @@ from ${_PYTHON_PKG_TOOL} import *
|
|||||||
)
|
)
|
||||||
|
|
||||||
if(NOT _result EQUAL 0)
|
if(NOT _result EQUAL 0)
|
||||||
message(FATAL_ERROR "Error in typesuppor generation")
|
message(FATAL_ERROR "Error in typesupport generation")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(_XmlDoc "${_XmlDoc}${_XmlGen}")
|
set(_XmlDoc "${_XmlDoc}${_XmlGen}")
|
||||||
|
|||||||
+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