RTnet setup on Xenomai¶
Official website : http://www.rtnet.org/index.html
RTnet allows you to send and receive data with very strict constraints, in a real-time environment (RTAI, Xenomai). It only works with a very limited set of ethernet cards (RTnet includes “real-time” re-written drivers) : Intel PRO/1000, 82574L, any card with r8169 (xenomai < 2.6.4 only) and others.
First make sure your followed the Xenomai installation instructions and you are running the Xenomai kernel (uname -a).
Recommended hardware¶
- Intel Pro/1000 GT : e1000e driver <– Recommended
- D-Link DGE-528T : r8169s driver
Check which kernel driver you use¶
lspci -vvv -nn | grep -C 10 Ethernet
And check if the rt_ version exists in RTnet’s drivers.
Note
We’re using a custom website that fixes compilation problems for kernel > 3.10 source.
Installation¶
We’ll need the following options:
* Variant
--> Xenomai 2.1
* Protocol Stack
--> TCP Support (for ATI Force Sensor)
* Drivers
--> The driver you use (New Intel PRO/1000 in our case)
--> Loopback (optional)
* Add-Ons
--> Real-Time Capturing Support (optional, for Wireshark debugging)
* Examples
--> RTnet Application Examples
--> Enable (optional)
sudo apt install libncurses5-dev
cd RTnet
make menuconfig
# Configure the options below
# Then hit ESC 2 times, save the config, and build
make
# Install in /usr/local/rtnet/ (default location)
sudo make install
Configuration¶
The configuration file is located by default at /usr/local/rtnet/etc/rtnet.conf
Take a look at this configuration file.
- RT_DRIVER=”rt_e1000e” The driver we use (we have the Intel PRO/1000 GT)
- REBIND_RT_NICS=”0000:05:00.0 0000:06:00.0” NIC addresses of the 2 cards we use for RTnet (you can check the NIC address typing ‘lshw -C network’ and looking at “bus info: pci@…”. It is useful to have a fix master/slave config order (card1->robot, card2->Sensor for example).
- IPADDR=”192.168.100.101” IP of the master (your computer). ALl the slaves will send/receive to/from master IP.
- NETMASK=”255.255.255.0” The other slave will have IPs 192.168.100.XXX.
- RT_LOOPBACK=”no” Not used now. Might be useful to use it somehow.
- RT_PROTOCOLS=”udp packet tcp” Robot sends via UDP, ATI Sensor via TCP for config, UDP otherwise.
- RTCAP=”yes” To debug with Wireshark
- TDMA_CYCLE=”450” and TDMA_OFFSET=”50” Data from robot/ sensor takes about 350us to receive (using Wireshark).
Allow non-root users¶
To allow commands like rtnet start
etc to be used without sudo
, we will use visudo
.
We remove password in certain commands only for people in the xenomai group.
sudo visudo
# then add the following at the end
%xenomai ALL=(root) NOPASSWD:/sbin/insmod
%xenomai ALL=(root) NOPASSWD:/sbin/rmmod
%xenomai ALL=(root) NOPASSWD:/sbin/modprobe
%xenomai ALL=(root) NOPASSWD:/bin/echo
%xenomai ALL=(root) NOPASSWD:/bin/mknod
%xenomai ALL=(root) NOPASSWD:/usr/bin/service
%xenomai ALL=(root) NOPASSWD:/usr/sbin/service
%xenomai ALL=(root) NOPASSWD:/usr/local/rtnet/sbin/rtcfg
%xenomai ALL=(root) NOPASSWD:/usr/local/rtnet/sbin/rtifconfig
%xenomai ALL=(root) NOPASSWD:/usr/local/rtnet/sbin/rtiwconfig
%xenomai ALL=(root) NOPASSWD:/usr/local/rtnet/sbin/rtnet
%xenomai ALL=(root) NOPASSWD:/usr/local/rtnet/sbin/rtping
%xenomai ALL=(root) NOPASSWD:/usr/local/rtnet/sbin/rtroute
%xenomai ALL=(root) NOPASSWD:/usr/local/rtnet/sbin/tdmacfg
Test your installation¶
Using the test script¶
A launch script can be found here. Adjust the following settings to your needs :
- SLAVES=”192.168.100.102 192.168.100.103”
- SLAVES_NAMES=”Kuka ATISensor”
Then to use it :
./path/to/script/rtnet start
Manually¶
cd /usr/local/rtnet/sbin
# Start the rt kernel drivers
sudo ./rtnet start
# Bringup connection
sudo ./rtifconfig rteth0 up 192.168.100.101 netmask 255.255.255.0
# Bringup slaves
sudo ./rtroute solicit 192.168.100.102 dev rteth0
# Ping Slave
sudo ./rtping 192.168.100.102
# Stop everything
sudo ./rtnet stop
Note
You might have to remove the non-rt kernel driver before rtnet start :
sudo rmmod e1000e
sudo ./rtnet start
Note
You should see rt_e1000e as the kernel driver currently used
lspci -vvv -nn | grep -C 10 Ethernet
lsmod | grep rt_
Use RTnet in C++¶
The API is the same as regular socket in C, except that the functions start with rt_*
.
To make sure it compiles on every platform, add the following to your headers :
#ifndef HAVE_RTNET
// Rename the standard functions
// And use theses ones to be RTnet-compatible when available
#define rt_dev_socket socket
#define rt_dev_setsockopt setsockopt
#define rt_dev_bind bind
#define rt_dev_recvfrom recvfrom
#define rt_dev_sendto sendto
#define rt_dev_close close
#define rt_dev_connect connect
#else
// Use RTnet in Xenomai
#include <rtdm/rtdm.h>
#endif
And in your CMakeLists.txt (example) :
# Add the path to the FindRTnet.cmake folder
# Let's assume you put it in /path/to/project/cmake
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
if($ENV{OROCOS_TARGET} STREQUAL "xenomai")
find_package(RTnet)
if(NOT ${RTnet_FOUND})
message(ERROR "RTnet cannot be used without Xenomai")
else()
message(STATUS "RTnet support enabled")
set_property(TARGET ${TARGET_NAME} APPEND PROPERTY COMPILE_DEFINITIONS HAVE_RTNET XENOMAI)
endif()
endif()