Move from other project.
This commit is contained in:
commit
352126327b
|
|
@ -0,0 +1,13 @@
|
|||
cmake_minimum_required(VERSION 4.2)
|
||||
project(j7s_ros_common)
|
||||
|
||||
# find dependencies
|
||||
find_package(ament_cmake REQUIRED)
|
||||
|
||||
# Install launch and param files.
|
||||
install(DIRECTORY
|
||||
launch config
|
||||
DESTINATION share/${PROJECT_NAME}/
|
||||
)
|
||||
|
||||
ament_package()
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
{
|
||||
/// The node's mode (router, peer or client)
|
||||
mode: "router",
|
||||
|
||||
/// Which endpoints to connect to. E.g. tcp/localhost:7447.
|
||||
/// This should list all the routers for this robot.
|
||||
connect: {
|
||||
endpoints: [
|
||||
],
|
||||
},
|
||||
|
||||
/// Which endpoints to listen on. E.g. tcp/0.0.0.0:7447.
|
||||
listen: {
|
||||
endpoints: [
|
||||
"tcp/0.0.0.0:7447",
|
||||
],
|
||||
},
|
||||
/// Configure the scouting mechanisms and their behaviours
|
||||
scouting: {
|
||||
/// Disable multicast.
|
||||
multicast: {
|
||||
/// Whether multicast scouting is enabled or not
|
||||
enabled: false,
|
||||
},
|
||||
/// Enable gossip scouting.
|
||||
gossip: {
|
||||
/// Whether gossip scouting is enabled or not
|
||||
enabled: true,
|
||||
},
|
||||
},
|
||||
|
||||
/// Configuration of data messages timestamps management.
|
||||
timestamping: {
|
||||
/// ROS setting: PublicationCache which is required for transient_local durability
|
||||
/// only works when time-stamping is enabled.
|
||||
enabled: true,
|
||||
},
|
||||
|
||||
/// Configure internal transport parameters
|
||||
transport: {
|
||||
unicast: {
|
||||
compression: {
|
||||
enabled: true,
|
||||
},
|
||||
},
|
||||
link: {
|
||||
tx: {
|
||||
queue: {
|
||||
congestion_control: {
|
||||
drop: {
|
||||
/// The maximum time in microseconds to wait for an available batch (place in queue) before dropping
|
||||
/// a droppable message if still no batch is available.
|
||||
wait_before_drop: 100000,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
/// Shared memory configuration.
|
||||
shared_memory: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
{
|
||||
/// The node's mode (router, peer or client)
|
||||
mode: "peer",
|
||||
|
||||
/// Which endpoints to connect to. E.g. tcp/localhost:7447.
|
||||
/// By configuring the endpoints, it is possible to tell zenoh which router/peer to connect to at startup.
|
||||
/// We only connect our local router at first.
|
||||
connect: {
|
||||
endpoints: [
|
||||
"tcp/localhost:7447",
|
||||
],
|
||||
retry: {
|
||||
period_init_ms: 100,
|
||||
period_max_ms: 10000
|
||||
},
|
||||
},
|
||||
|
||||
/// Which endpoints to listen on. E.g. tcp/0.0.0.0:7447.
|
||||
/// By configuring the endpoints, it is possible to tell zenoh which are the endpoints that other routers,
|
||||
/// peers, or client can use to establish a zenoh session.
|
||||
/// "tcp/[::]:0", "udp/0.0.0.0:0?rel=1;mixed_rel=1"
|
||||
listen: {
|
||||
endpoints: [
|
||||
"tcp/0.0.0.0:0", "udp/0.0.0.0:0?rel=1;mixed_rel=1"
|
||||
],
|
||||
},
|
||||
|
||||
/// Configure the scouting mechanisms and their behaviours
|
||||
scouting: {
|
||||
/// Disable multicast.
|
||||
multicast: {
|
||||
enabled: false,
|
||||
},
|
||||
/// Enable gossip.
|
||||
gossip: {
|
||||
enabled: true,
|
||||
},
|
||||
},
|
||||
|
||||
/// Configuration of data messages timestamps management.
|
||||
timestamping: {
|
||||
/// ROS setting: PublicationCache which is required for transient_local durability
|
||||
/// only works when time-stamping is enabled.
|
||||
enabled: true,
|
||||
},
|
||||
|
||||
/// Configure internal transport parameters
|
||||
transport: {
|
||||
unicast: {
|
||||
compression: {
|
||||
enabled: true,
|
||||
},
|
||||
},
|
||||
link: {
|
||||
tx: {
|
||||
queue: {
|
||||
congestion_control: {
|
||||
drop: {
|
||||
/// The maximum time in microseconds to wait for an available batch (place in queue) before dropping
|
||||
/// a droppable message if still no batch is available.
|
||||
wait_before_drop: 100000,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
/// Shared memory configuration.
|
||||
shared_memory: {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
#!/usr/bin/env bash
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||
|
||||
export RMW_IMPLEMENTATION=rmw_zenoh_cpp
|
||||
export ZENOH_ROUTER_CHECK_ATTEMPTS=-1
|
||||
export ZENOH_ROUTER_CONFIG_URI=${SCRIPT_DIR}/ROUTER_CONFIG.json5
|
||||
export ZENOH_SESSION_CONFIG_URI=${SCRIPT_DIR}/SESSION_CONFIG.json5
|
||||
export ROS_STATIC_PEERS=""
|
||||
|
||||
# This can be called to setup which routers to connect to.
|
||||
# I.E. On my laptop I source this config. I want to connect to
|
||||
# a robot with IP address 192.168.1.100
|
||||
# I can call `zenoh_router_ip 192.168.1.100` and then I will talk to its
|
||||
# router.
|
||||
zenoh_router_ip() {
|
||||
local endpoints=()
|
||||
for ip in "$@"; do
|
||||
endpoints+=("'tcp/$ip:7447'")
|
||||
done
|
||||
local IFS=,
|
||||
export ZENOH_CONFIG_OVERRIDE="connect/endpoints=[${endpoints[*]}];"
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
import launch
|
||||
import launch_ros.actions
|
||||
import launch.substitutions
|
||||
import launch.substitution
|
||||
from launch.some_substitutions_type import SomeSubstitutionsType
|
||||
import launch.conditions
|
||||
|
||||
import socket
|
||||
|
||||
def generate_launch_description():
|
||||
nodes = []
|
||||
nodes.append(make_router())
|
||||
return launch.LaunchDescription(nodes)
|
||||
|
||||
def setup_router_env():
|
||||
# In theory you can use this to set up the environment on the router
|
||||
# in a unique way.
|
||||
# I tried something like wat you see below at one point, though
|
||||
# it didn't pan out.
|
||||
# I'm just goint to leave it as an example here.
|
||||
#zenoh_runtime_settings = "( rx: (worker_threads: 2), acc: (worker_threads: 2), tx: (worker_threads: 2), app: (worker_threads: 2) )"
|
||||
#env = {"ZENOH_RUNTIME": zenoh_runtime_settings}
|
||||
env = None
|
||||
return env
|
||||
|
||||
def make_router():
|
||||
zenoh_is_rmw = launch.substitutions.EqualsSubstitution(
|
||||
'rmw_zenoh_cpp',
|
||||
launch.substitutions.EnvironmentVariable('RMW_IMPLEMENTATION', default_value='')
|
||||
)
|
||||
router_port_is_free = PortIsFree('7447')
|
||||
|
||||
condition = launch.conditions.IfCondition(
|
||||
launch.substitutions.AndSubstitution(zenoh_is_rmw, router_port_is_free)
|
||||
)
|
||||
node = launch_ros.actions.Node(
|
||||
package = "rmw_zenoh_cpp",
|
||||
executable="rmw_zenohd",
|
||||
name="zenoh_router",
|
||||
condition=condition,
|
||||
additional_env=setup_router_env()
|
||||
)
|
||||
return node
|
||||
|
||||
######
|
||||
# Custom actions/substitutions
|
||||
######
|
||||
|
||||
class PortIsFree(launch.substitution.Substitution):
|
||||
def __init__(self, port: SomeSubstitutionsType):
|
||||
super().__init__()
|
||||
self._port = port
|
||||
|
||||
def perform(self, context):
|
||||
port_as_string = self._port if isinstance(self._port, str) else self._port.perform(context)
|
||||
port_as_int = int(port_as_string)
|
||||
|
||||
if is_port_in_use_for_tcp(port_as_int):
|
||||
return "False"
|
||||
return "True"
|
||||
|
||||
def is_port_in_use_for_tcp(port):
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
||||
return sock.connect_ex(('localhost', port)) == 0
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0"?>
|
||||
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="3">
|
||||
<name>j7s_ros_common</name>
|
||||
<version>0.0.0</version>
|
||||
<description>TODO: Package description</description>
|
||||
<maintainer email="jpace121@gmail.com">jimmy</maintainer>
|
||||
<license>TODO: License declaration</license>
|
||||
|
||||
<buildtool_depend>ament_cmake</buildtool_depend>
|
||||
|
||||
<export>
|
||||
<build_type>ament_cmake</build_type>
|
||||
</export>
|
||||
</package>
|
||||
Loading…
Reference in New Issue