Difference between revisions of "ROS2"

From ElphelWiki
Jump to: navigation, search
(Test Talker and Listener)
(News)
 
(125 intermediate revisions by the same user not shown)
Line 1: Line 1:
==<font color='blue'>GitHub</font>==
+
==<font color='blue'>About</font>==
https://github.com/bmwcarit/meta-ros.git
+
Use ROS2 in Elphel single or multi-camera systems. The cameras are 10393 system boards based on Xilinx Zynq, ARM.
  
==<font color='blue'>ROS1</font>==
+
==<font color='blue'>Goals</font>==
 +
<font color='green'>'''Notes:'''
 +
* Controlling and initializing of multi-camera systems is already implemented using PHP API (autocampars.php), Python and lighttpd.
 +
* Using ROS2 is intended to simplify/standardize the above.
 +
* Using ROS2 is intended to make cameras compatible with other hardware supported by ROS1/2.
 +
</font>
 +
 
 +
Having ROS2 cross-compiled and installed on each camera:
 +
* '''Initialize cameras in a pre-defined multi-camera system''' - sync and sequence critical init
 +
* '''Control multiple cameras from any camera of the system''' - parameters, recording
 +
* '''Control multiple cameras from a PC''' (with ROS2 for PC installed).
 +
* '''Control multiple cameras from a network device''' (w/o ROS2 installed, but with a browser) - by accessing a web server running on a camera interfaced with ROS2 of the camera. Can use nodejs or just lighttpd+php.
 +
 
 +
==<font color='blue'>Status</font>==
 +
Development
 +
==<font color='blue'>News</font>==
 +
* [2019/01/03] Updated the cross-compiled version from '''ardent''' to '''bouncy'''. PC was already at '''bouncy''' because rclnodejs will work with '''bouncy''' only (not yet compatible with '''crystal''').
 +
Updated because ''bouncy'' would not 'see' ''ardent'' nodes & services and vice versa.
 +
 
 +
==<font color='blue'>Interfaces</font>==
 +
ROS2 nodes communicate over:
 +
* '''1 GigE LAN''' or (possibly) '''wifi''' (camera1-camera2..N, pc-camera1..N, pc1-pc2..M)
 +
* within a single device
 +
<font color='green'>'''Notes:'''
 +
* image sensors, IMS (or GPS & IMU), any other sensors are attached to cameras via a custom interface or USB, with appropriate driver support.
 +
* normally cameras in the system are synced with a custom trigger cable - this is setup over network
 +
* any device attached to PC?
 +
</font>
 +
 
 +
==<font color='blue'>ROS2 on Zynq</font>==
  
===Build===
+
===Installation===
* Won't build
+
* For Embedded Linux (but not Ubuntu Distro) use [https://github.com/bmwcarit/meta-ros.git meta-ros.git]. What about <font color='red'>[https://github.com/erlerobot/meta-ros2 meta-ros2]</font>?
===Work===
+
<font color='green'><s>'''TODO:''' Include [https://github.com/bmwcarit/meta-ros.git meta-ros.git] in [https://git.elphel.com/Elphel/elphel393 elphel393] build system.</s></font>
* Won't work
 
  
==<font color='blue'>ROS2</font>==
+
<font color='green'>'''DONE:''' included a forked version [https://github.com/okdzhimiev/meta-ros/ okdzhimiev/meta-ros]</font>
  
===Build===
+
====Include meta-ros to elphel393====
 
* Add path to bblayers.conf
 
* Add path to bblayers.conf
 
* Add to "IMAGE_INSTALL_append" of core-image-elphel393.bb:
 
* Add to "IMAGE_INSTALL_append" of core-image-elphel393.bb:
  ros2-demo-nodes-cpp \
+
  <font size='2'>packagegroup-ros2-world \</font>
ros2topic \
 
ros2msg \
 
ros2run \
 
  
===Work===
+
===Notes===
====1. Test Talker and Listener====
+
* Cross-compilation for ARM
* SSH session 1:
+
* ROS2 for python populates '''/usr/lib/python3.5/site-packages/''' so python scripts can live anywhere.
  root@elphel393:~# AMENT_PREFIX_PATH=/usr ros2 run demo_nodes_cpp talker
+
* For command line apps, like ''ros2 ...'', if AMENT_PREFIX_PATH is not set then:
* SSH session 2:
+
  <font size='1' color='red'>'''OSError: Environment variable 'AMENT_PREFIX_PATH' is not set or empty'''</font>
  root@elphel393:~# AMENT_PREFIX_PATH=/usr ros2 run demo_nodes_cpp listener
+
* Useful commands (command line):
 +
  <font size='2'>export AMENT_PREFIX_PATH=/usr</font>
  
Note: If AMENT_PREFIX_PATH is not set then:
+
<font size='2'>ros2 pkg list
  <font size='1'>Traceback (most recent call last):
+
ros2 node list
  File "/usr/bin/ros2", line 11, in <module>
+
ros2 srv list
    load_entry_point('ros2cli==0.4.0', 'console_scripts', 'ros2')()
+
ros2 srv show std_srvs/Trigger
  File "/usr/lib/python3.5/site-packages/ros2cli/cli.py", line 64, in main
+
ros2 msg list
    rc = extension.main(parser=parser, args=args)
+
ros2 msg show std_msgs/String</font>
  File "/usr/lib/python3.5/site-packages/ros2run/command/run.py", line 59, in main
+
 
    executable_name=args.executable_name)
+
===Demos===
  File "/usr/lib/python3.5/site-packages/ros2run/api/__init__.py", line 30, in get_executable_path
+
====talker-listener cpp====
    paths = get_executable_paths(package_name=package_name)
+
  <font size='2'>''# terminal 1:''
  File "/usr/lib/python3.5/site-packages/ros2pkg/api/__init__.py", line 41, in get_executable_paths
+
export AMENT_PREFIX_PATH=/usr
    prefix_path = get_prefix_path(package_name)
+
ros2 run demo_nodes_cpp talker
  File "/usr/lib/python3.5/site-packages/ros2pkg/api/__init__.py", line 34, in get_prefix_path
+
    prefix_path = get_package_prefix(package_name)
+
''# terminal 2:''
  File "/usr/lib/python3.5/site-packages/ament_index_python/packages.py", line 49, in get_package_prefix
+
export AMENT_PREFIX_PATH=/usr
    content, package_prefix = get_resource('packages', package_name)
+
ros2 run demo_nodes_cpp listener</font>
  File "/usr/lib/python3.5/site-packages/ament_index_python/resources.py", line 37, in get_resource
+
 
    for path in get_search_paths():
+
===Workflow===
  File "/usr/lib/python3.5/site-packages/ament_index_python/search_paths.py", line 30, in get_search_paths
+
* Use example recipes from [https://github.com/bmwcarit/meta-ros.git meta-ros.git]
    "Environment variable '{}' is not set or empty".format(AMENT_PREFIX_PATH_ENV_VAR))
+
* ''bitbake package-name'', check output and logs in the poky build tree
<font color='red'>'''OSError: Environment variable 'AMENT_PREFIX_PATH' is not set or empty'''</font></font>
+
* List package in core-image-elphel393.bb's ''IMAGE_INSTALL_append''
 +
<font color='green'>'''TODO:'''
 +
* Add ''target-scp'' and an example empty recipe</font>
 +
 
 +
==<font color='blue'>ROS2 on PC</font>==
 +
===Installation===
 +
* Google and follow the [https://index.ros.org/doc/ros2/ general instructions].
 +
 
 +
===Notes===
 +
* Switched to installing from a ''fat'' archive
 +
* Terminal setup:
 +
<font size='2'>''source /path/setup.bash''</font>
 +
 
 +
===Workflow===
 +
* Create a workspace
 +
* Create some packages inside or clone - they have a [https://github.com/dirk-thomas/vcstool vcs tool] to clone all repos from a text file.
 +
* Install [https://colcon.readthedocs.io/en/released/user/quick-start.html colcon]
 +
* Then build with colcon
 +
* New packages will not get installed anywhere. They live in their folders.
 +
* To use a package:
 +
<font size='2'>source ~/ros2_ws/some-package/install/setup.bash
 +
ros2 pkg list
 +
then run anything in this terminal</font>
 +
* Python scripts can live anywhere - just run them from that sourced terminal
 +
 
 +
==<font color='blue'>ROS2 in Docker</font>==
 +
docker pull osrf/ros2:bouncy-desktop
 +
docker run -i -t osrf/ros2:bouncy-desktop
 +
No network, no colcon, no ament...
 +
 
 +
==<font color='blue'>ROS2 General Notes</font>==
 +
===Notes===
 +
* SROS is Secure ROS or something
 +
 
 +
===Useful links===
 +
 
 +
* [http://docs.erlerobotics.com/robot_operating_system/ros2 ErleRobotics Tutorials on ROS2] - very useful
 +
 
 +
* [https://index.ros.org/doc/ros2/Ament-Tutorial/ Ament tutorial] - build system for new packages
 +
** works and supported in meta-ros
 +
** will not work for PC because repo hashes moved on?
 +
 
 +
* [https://index.ros.org/doc/ros2/Colcon-Tutorial/ Colcon tutorial] - newest build system for new packages
 +
** works for PC, even in 16.04
 +
** not supported in meta-ros (as of 2018/12/07)
 +
** [https://colcon.readthedocs.io/en/released/user/how-to.html#build-only-a-single-package-or-selected-packages colcon docs]
 +
 
 +
* [https://discourse.ros.org/search?q=meta-ros%20order%3Alatest About meta-ros] and [https://discourse.ros.org/search?q=meta-ros2%20order%3Alatest about meta-ros2] - are they merged?
 +
 
 +
Networking:
 +
 
 +
* [http://design.ros2.org/articles/ros_on_dds.html ROS on DDS]
 +
<font size='2'>...
 +
if you are concerned about latency, like for soft real-time, you can basically tune DDS to be just a UDP blaster. In another scenario you might need something that behaves like TCP, but needs to be more
 +
tolerant to long dropouts, and with DDS all of these things can be controlled by changing the QoS parameters.
 +
...</font>
 +
 
 +
* [http://www.eprosima.com/index.php/resources-all/performance/40-eprosima-fast-rtps-performance FastRTPS benchmarks]
 +
* [http://docs.eprosima.com/en/latest/advanced.html FastRTPS max message size]
 +
* [https://erlerobotics.gitbooks.io/erle-robotics-python-gitbook-free/udp_and_tcp/a_simple_tcp_client_and_server.html Good book about UDP?]
 +
 
 +
ROS2 Services:
 +
 
 +
* [https://wiki.ros.org/Services Request-Response is done with '''service''']. Format [https://wiki.ros.org/srv srv]
 +
* [https://discourse.ros.org/t/suggestions-for-std-srvs/1079/16 STD-SRVS '''discussion'''] & [https://github.com/ros2/examples/issues/4 ROS2 examples(?)]
 +
 
 +
===Reference ROS repos===
 +
* [https://github.com/inertialsense/inertial_sense_ros.git inertial_sense_ros.git] - cpp
 +
* [https://github.com/intel/ros2_intel_realsense.git ros2_intel_realsense.git] - cpp
 +
* [https://github.com/ros-drivers/axis_camera.git axis_camera.git] - python
 +
* [https://github.com/bmwcarit/meta-ros.git meta-ros.git] - layer for Yocto
 +
 
 +
==<font color='blue'>ROS1</font>==
 +
<font color='red'>'''Won't build'''</font>. [[ROS1|More info]].

Latest revision as of 16:00, 3 January 2019

About

Use ROS2 in Elphel single or multi-camera systems. The cameras are 10393 system boards based on Xilinx Zynq, ARM.

Goals

Notes:

  • Controlling and initializing of multi-camera systems is already implemented using PHP API (autocampars.php), Python and lighttpd.
  • Using ROS2 is intended to simplify/standardize the above.
  • Using ROS2 is intended to make cameras compatible with other hardware supported by ROS1/2.

Having ROS2 cross-compiled and installed on each camera:

  • Initialize cameras in a pre-defined multi-camera system - sync and sequence critical init
  • Control multiple cameras from any camera of the system - parameters, recording
  • Control multiple cameras from a PC (with ROS2 for PC installed).
  • Control multiple cameras from a network device (w/o ROS2 installed, but with a browser) - by accessing a web server running on a camera interfaced with ROS2 of the camera. Can use nodejs or just lighttpd+php.

Status

Development

News

  • [2019/01/03] Updated the cross-compiled version from ardent to bouncy. PC was already at bouncy because rclnodejs will work with bouncy only (not yet compatible with crystal).

Updated because bouncy would not 'see' ardent nodes & services and vice versa.

Interfaces

ROS2 nodes communicate over:

  • 1 GigE LAN or (possibly) wifi (camera1-camera2..N, pc-camera1..N, pc1-pc2..M)
  • within a single device

Notes:

  • image sensors, IMS (or GPS & IMU), any other sensors are attached to cameras via a custom interface or USB, with appropriate driver support.
  • normally cameras in the system are synced with a custom trigger cable - this is setup over network
  • any device attached to PC?

ROS2 on Zynq

Installation

TODO: Include meta-ros.git in elphel393 build system.

DONE: included a forked version okdzhimiev/meta-ros

Include meta-ros to elphel393

  • Add path to bblayers.conf
  • Add to "IMAGE_INSTALL_append" of core-image-elphel393.bb:
packagegroup-ros2-world \

Notes

  • Cross-compilation for ARM
  • ROS2 for python populates /usr/lib/python3.5/site-packages/ so python scripts can live anywhere.
  • For command line apps, like ros2 ..., if AMENT_PREFIX_PATH is not set then:
OSError: Environment variable 'AMENT_PREFIX_PATH' is not set or empty
  • Useful commands (command line):
export AMENT_PREFIX_PATH=/usr
ros2 pkg list
ros2 node list
ros2 srv list
ros2 srv show std_srvs/Trigger
ros2 msg list
ros2 msg show std_msgs/String

Demos

talker-listener cpp

# terminal 1:
export AMENT_PREFIX_PATH=/usr
ros2 run demo_nodes_cpp talker

# terminal 2:
export AMENT_PREFIX_PATH=/usr
ros2 run demo_nodes_cpp listener

Workflow

  • Use example recipes from meta-ros.git
  • bitbake package-name, check output and logs in the poky build tree
  • List package in core-image-elphel393.bb's IMAGE_INSTALL_append

TODO:

  • Add target-scp and an example empty recipe

ROS2 on PC

Installation

Notes

  • Switched to installing from a fat archive
  • Terminal setup:
source /path/setup.bash

Workflow

  • Create a workspace
  • Create some packages inside or clone - they have a vcs tool to clone all repos from a text file.
  • Install colcon
  • Then build with colcon
  • New packages will not get installed anywhere. They live in their folders.
  • To use a package:
source ~/ros2_ws/some-package/install/setup.bash
ros2 pkg list
then run anything in this terminal
  • Python scripts can live anywhere - just run them from that sourced terminal

ROS2 in Docker

docker pull osrf/ros2:bouncy-desktop
docker run -i -t osrf/ros2:bouncy-desktop 
No network, no colcon, no ament...

ROS2 General Notes

Notes

  • SROS is Secure ROS or something

Useful links

  • Ament tutorial - build system for new packages
    • works and supported in meta-ros
    • will not work for PC because repo hashes moved on?
  • Colcon tutorial - newest build system for new packages
    • works for PC, even in 16.04
    • not supported in meta-ros (as of 2018/12/07)
    • colcon docs

Networking:

... 
if you are concerned about latency, like for soft real-time, you can basically tune DDS to be just a UDP blaster. In another scenario you might need something that behaves like TCP, but needs to be more 
tolerant to long dropouts, and with DDS all of these things can be controlled by changing the QoS parameters.
...

ROS2 Services:

Reference ROS repos

ROS1

Won't build. More info.