|
|
(40 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| Short note on installation of (parts of) mobotware on Raspberry Pi (or Beagle-bone)
| | Back to [[Robobot]] |
|
| |
|
| For Beagle-bone skip to "Login" with adduser or installation o, the rest should work, as they are both almost the same processor and operating system. Note this guide is not pt. tested on beagle-bone.
| | Back to [[Flexbot]] |
|
| |
|
| == Hardware schematics ==
| |
|
| |
|
| Power and IO connections on version B+ can be found here:
| | == Prerequisite == |
| https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/Raspberry-Pi-B-Plus-V1.2-Schematics.pdf
| |
|
| |
|
| | * Raspberry pi - version 3 or 4 |
| | * SD-card preferably at least 16Gb |
| | * Monitor with HDMI (version 3) or micro HDMI (version 4) cable |
| | * keyboard - and optional a mouse |
| | * Access to network (wired or wifi) |
| | * Power - either an USB charger or cable to a PC (micro USB (version 3) or USB-C (version 4) |
|
| |
|
| == Prerequisite ==
| | It should be possible to start using USB or wifi connection from a PC without extra screen or keyboard, find solutions on internet - I have not tried. |
|
| |
|
| Make a SD-card bootable with NOOBS. | | ====Make SD card a FAT32 partision, if reusing an old card==== |
|
| |
|
| ====Make SD card a FAT32 partision, if not already====
| | A new SD-card is fine as is, else |
|
| |
|
| see http://qdosmsq.dunbar-it.co.uk/blog/2013/06/noobs-for-raspberry-pi/ for instruction to prepare any old or new SD-card | | see http://qdosmsq.dunbar-it.co.uk/blog/2013/06/noobs-for-raspberry-pi/ for instruction to prepare any old or new SD-card |
|
| |
|
| ====add boot-files to SD card==== | | ====Add boot-files to SD card==== |
| | |
| | =====RPI imager ===== |
| | |
| | Version 10 (buster) is easily installed using the 'Raspberry pi imager', |
| | on Linux install with |
| | |
| | snap install rpi-imager |
| | rpi-imager |
| | |
| | and follow the screen |
| | |
| | =====manual ===== |
| | |
| | or |
|
| |
|
| Get the install zip-file from https://www.raspberrypi.org/downloads/noobs/ | | Get the install zip-file from https://www.raspberrypi.org/downloads/noobs/ |
|
| |
|
| Then unpack NOOBS zip-file to the new disk, like | | Then unpack NOOBS zip-file to the new disk (use the newest version), like |
| unzip NOOBS_v3_0_0.zip -d /media/xxx/yyyy or | | for the network version |
| unzip NOOBS_lite_v3_0.zip -d /media/xxx/yyyy or | | unzip NOOBS_lite_v3_5_1.zip -d /media/xxx/yyyy or |
| unzip ~/Downloads/raspberry/NOOBS_lite_v3_0.zip . (if you are on the empty flash) | | unzip ~/Downloads/raspberry/NOOBS_lite_v3_5_1.zip (if you are on the empty flash) |
| | or for the full version |
| | unzip NOOBS_v3_5_1.zip -d /media/xxx/yyyy or |
| | unzip ~/Downloads/raspberry/NOOBS_v3_5_1.zip (if you are on the empty flash) |
|
| |
|
| ====Reboot==== | | ====Reboot==== |
|
| |
|
| That is all, Raspberry should boot on that.
| | * Insert SD card on Raspberry, |
| | * Mount a heatsink - especially needed on version 4, |
| | * Connect monitor, keyboard and (USB) power |
|
| |
|
| or see instructions on e.g.: https://www.raspberrypi.org/help/noobs-setup/
| | That is all, Raspberry should boot on that, and take some time to prepare the SD-Card. |
| | Or see instructions on e.g.: https://www.raspberrypi.org/help/noobs-setup/ |
|
| |
|
| Boot the raspberry and install the DEBIAN Linux. | | * Boot the raspberry and install the Raspberry Pi OS full (Debian). |
| | * On the bottom of the screen select keyboard layout and language, |
|
| |
|
| Assuming DEBIAN is up and running - with internet access:
| | Settings |
| | |
| | * Leave the pi password as is (for future reuse) |
| | * Select language (prefer English - also for future reuse) |
| | * select wifi access - if not using a cable. |
| | |
| | ==Usefull Linux commands== |
| | |
| | Here are some common commands in Linux |
| | |
| | ls (directory file list) |
| | cd (change to home directory) |
| | cd some_directory (change to a subdirectory) |
| | exit (logout, e.g. of a ssh session) |
| | grep -n string_to_look_for_in_a_file *.cpp (find a string in a file, e.g. a variable or a function) |
| | sudo some_command (execute a command as "root" - root is a superuser with administrator rights to everything) |
| | pkill some_application_name (stop (or kill) a running process with name "some_application_name") |
| | pgrep some_application_name (see if a process is running - good to use before a kill) |
| | mv from_file to_file (rename a file) |
| | cp from_file to_file (copy a file) |
| | rm some_file (remove (delete) a file) |
| | nano some_file (simple text editor) |
| | zip, unzip (pack or unpack files - try zip --help to see how. |
| | top (see process load and memory usage) |
| | make (compile all as described in the "Makefile" in the same directory) |
| | make -j4 (compile using up to 4 CPU cores - faster if more files need to be compiled) |
| | |
| | All commands have an online help if you add --help or -h after the command. |
| | If this is not enough, then try |
| | man ls |
| | to get the manual page for the ls command. |
|
| |
|
| == Configure == | | == Configure == |
Line 45: |
Line 100: |
|
| |
|
| Using ''raspi-config'' | | Using ''raspi-config'' |
| Expand Filesystem (if not OK already)
| |
| Set keyboard layout
| |
| Enable Camera | | Enable Camera |
| Set hostname | | Set hostname (one word, no space) |
| Enable SSH | | Enable SSH |
| Enable i2c - load module as default
| |
| Disable Serial login | | Disable Serial login |
| boot as a console with login | | boot as a console with login |
| Update firmware | | Update firmware |
| Set locale to "en_DK.UTF-8 UTF-8" (danish keyboard, but english language) | | Set locale to "en_DK.UTF-8 UTF-8" (danish keyboard, but English language) |
| | |
| ==== Beagle bone ====
| |
| | |
| login as root (no password)
| |
| | |
| After installing a boot-image on a microsd-card with debian, follow the instaructions to expand the boot image to use the full sd-card, as described in: http://elinux.org/Beagleboard:Expanding_File_System_Partition_On_A_microSD
| |
|
| |
|
| === Update operating system === | | === Update operating system === |
Line 69: |
Line 115: |
| sudo apt-get dist-upgrade | | sudo apt-get dist-upgrade |
| sudo reboot | | sudo reboot |
|
| |
| === Login ===
| |
|
| |
| login as ''pi'', password ''raspberry'' - password may have changed
| |
|
| |
| or on beaglebone as root (no password)
| |
|
| |
| add a user called ''local''
| |
|
| |
| sudo adduser local
| |
| sudo usermod -a --groups adm,cdrom,sudo,audio,video,plugdev,games,users,netdev,input,spi,gpio,i2c,dialout local
| |
|
| |
| switch user to ''local'', and ensure groups are OK, and network is running
| |
|
| |
| su - local
| |
| groups
| |
| ifconfig
| |
|
| |
| Note the inet address.
| |
|
| |
| Now it is possible to login (as ''local'') from network.
| |
|
| |
| === Get access using hostname ===
| |
|
| |
| You may change the hostname by changing the name in /etc/hostname. If you do so, then you should probably restart before the new hostname works.
| |
|
| |
| Now from another PC on the local network
| |
|
| |
| ping hostname.local
| |
|
| |
| where "hostname" is replaced with the hostname in /etc/hostname.
| |
|
| |
| === Get filesystem on normal Linux PC ===
| |
|
| |
| From another (Linux) PC, mount the raspberry filesystem
| |
|
| |
| mkdir rpi (where the filesystem will be mounted)
| |
| sshfs local@10.59.8.141: rpi (replace IP number with inet address from above, or use ''sshfs local@hostnale.local: rpi'')
| |
|
| |
| Then in directory ''rpi'' the user files on the raspberry can be manipulated.
| |
|
| |
| for other access, use (with IP address as found above, or IP replaced with ''hostname.local'')
| |
|
| |
| ssh -X local@10.59.8.141
| |
|
| |
| === Packages needed ===
| |
|
| |
| sudo apt -y install cmake
| |
| sudo apt -y install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libgtk2.0-dev libatlas-base-dev gfortran libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev subversion libreadline-dev
| |
| # video for linux had some error, maybe this will help
| |
| cd /usr/include/linux
| |
| sudo ln -s -f ../libv4l1-videodev.h videodev.h
| |
| # opencv
| |
| sudo apt install libopencv-dev
| |
|
| |
|
| |
| ==== Stop here if you install ROBOBOT ====
| |
|
| |
| ==== Opencv ====
| |
|
| |
| As of June 2019 opencv 3.2 is installed using line above
| |
|
| |
| Newer version of Opencv could be installed manually if you really need functions not available in 3.2.
| |
| For newer installation use
| |
|
| |
| # make a directory for the opencv source
| |
| cd
| |
| mkdir -p git
| |
| cd git
| |
| # get source
| |
| wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.4.zip
| |
| unzip opencv.zip
| |
| wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/3.4.zip
| |
| unzip opencv_contrib.zip
| |
| # you will need this - if you use python - takes some minutes
| |
| pip install numpy
| |
| # prepare compilation
| |
| cd ~/git/opencv-3.4/
| |
| mkdir build
| |
| cd build
| |
| cmake -D CMAKE_BUILD_TYPE=RELEASE \
| |
| -D CMAKE_INSTALL_PREFIX=/usr/local \
| |
| -D INSTALL_PYTHON_EXAMPLES=ON \
| |
| -D OPENCV_EXTRA_MODULES_PATH=~/git/opencv_contrib-3.4/modules \
| |
| -D BUILD_EXAMPLES=ON ..
| |
| # inspect printout to see if needed features are enabled
| |
| # use -j2 option not to overload or overheat the processor (j2 means use 2 cores only)
| |
| # this probably takes an hour or so
| |
| make -j2
| |
| # install into /usr/local
| |
| sudo make install
| |
| # load environment settings
| |
| sudo ldconfig
| |
|
| |
| === Packages needed for Mobotware RHD/MRC ===
| |
|
| |
| Package list for RHD and MRC (paste the last line to a terminal window):
| |
|
| |
| libexpat-dev (RHD)
| |
| pciutils-dev (RHD)
| |
| libncurses-dev (RHD)
| |
| bison (MRC)
| |
| libsdl-dev (MRC)
| |
| telnet (MRC test)
| |
| sshfs (may be a good idea to access filesystem from another PC)
| |
| sudo apt-get install subversion libexpat-dev pciutils-dev libncurses-dev bison libsdl-dev telnet sshfs
| |
|
| |
| === Additional for AURS (e.g. camera server) ===
| |
|
| |
| Package list - opencv removed as newer version installed above (paste the last line to a terminal window)
| |
| cmake
| |
| # libopencv-dev
| |
| libreadline-dev
| |
| libudev-dev
| |
| libusb-dev
| |
| # libv4l-dev
| |
| python-dev
| |
| libgstreamer0.10-dev
| |
| libboost-dev
| |
| libboost-system-dev
| |
| python-opencv (not needed, but nice)
| |
| sudo apt-get install cmake libreadline-dev libudev-dev libusb-dev libgstreamer0.10-dev libboost-dev libboost-system-dev python-opencv
| |
|
| |
| ==== Python ====
| |
|
| |
| Further python image processing install
| |
|
| |
| sudo pip install Image
| |
|
| |
| ==== Camera driver source ====
| |
|
| |
| (not for beaglebone)
| |
|
| |
| To use the raspberry camera (and compile the aupicam plugin) the ''userland'' sourcecode (from https://github.com/raspberrypi/userland):
| |
|
| |
| git clone https://github.com/raspberrypi/userland.git userland-master
| |
|
| |
| the version at October 2015 crashes when closing the camera, to avoid this, with no observed side effects, comment out a line:
| |
|
| |
| In file userland-master/interface/mmal/util/mmal_util.c, remove the ' ''if (!vcos_verify(!port->is_enabled))'' ' line:
| |
|
| |
| /** Destroy a pool of MMAL_BUFFER_HEADER_T */
| |
| void mmal_port_pool_destroy(MMAL_PORT_T *port, MMAL_POOL_T *pool)
| |
| {
| |
| if (!port || !port->priv || !pool)
| |
| return;
| |
| LOG_TRACE("%s(%i:%i) port %p, pool %p", port->component->name,
| |
| (int)port->type, (int)port->index, port, pool);
| |
| /* if (!vcos_verify(!port->is_enabled)) */ <-------------------comment out this line
| |
| {
| |
| LOG_ERROR("port %p, pool %p destroyed while port enabled", port, pool);
| |
| mmal_port_disable(port);
| |
| }
| |
| mmal_pool_destroy(pool);
| |
| }
| |
|
| |
| You can compile without the change, but may experience that camera server crashes when changing parameters and when closing.
| |
|
| |
| Now:
| |
|
| |
| cd ~/userland-master
| |
| mkdir build
| |
| cd build
| |
| cmake ..
| |
| make
| |
| sudo make install
| |
|
| |
| This will copy the needed header and library files to ''/opt/vc'' and other places.
| |
|
| |
| === Mount filesystem ===
| |
|
| |
| As an option, mount the home directory on raspberry-pi to your local PC for easy
| |
| file modification.
| |
|
| |
| On your PC type make a directory for the filesystem
| |
|
| |
| mkdir rpi
| |
| sshfs local@10.59.8.141: rpi
| |
| ls rpi
| |
|
| |
| with your IP address or IP replaced by ''hostname.local''.
| |
|
| |
| Unmount with
| |
|
| |
| fusermount -u rpi
| |
|
| |
| ==Mobotware ==
| |
|
| |
| Get and unpack mobotware - see main page of this wiki for info
| |
|
| |
| Either from SVN - if you have access, or from our lab-computers as a mobotware-XXX.tar.gz file, where XXX is version number.
| |
|
| |
| unpack if a .gz file and make a symbolic link to "mobotware" to make this guide work.
| |
|
| |
| tar -xzf mobotware-XXX.tar.gz
| |
| ln -s mobotware-XXX mobotware
| |
|
| |
| or, if from SVN:
| |
|
| |
| svn co svn://repos.gbar.dtu.dk/jcan/mobotware mobotware
| |
|
| |
| this makes a mobotware directory with all the files.
| |
|
| |
| === Modify makefiles ===
| |
|
| |
| Not all parts of Mobotware runs on a raspberry, so some parts must be removed from the Makefiles:
| |
|
| |
| Enter the mobotware directory
| |
|
| |
| cd mobotware-XXX
| |
|
| |
| ==== main Makefile ====
| |
|
| |
| nano -w Makefile
| |
|
| |
| Change this section
| |
|
| |
| APPSUBDIRS = aumat/trunk \
| |
| aurobotservers/trunk/include \
| |
| aurobotservers/trunk/libs \
| |
| mapbase/trunk \
| |
| rhd/trunk \
| |
| mrc/trunk \
| |
| hakoclient/trunk \
| |
| aurs-plugins/aumanager aurs-plugins/aumrcobst aurs-plugins/auplanner/trunk \
| |
| aurs-plugins/auzoneobst \
| |
| aurobotservers/trunk \
| |
| simulator/trunk
| |
|
| |
| delete the lines
| |
|
| |
| hakoclient/trunk (GUI for HAKO tractor)
| |
| simulator/trunk (simulator will not run on raspberry)
| |
|
| |
| so that it looks like
| |
|
| |
| APPSUBDIRS = aumat/trunk \
| |
| aurobotservers/trunk/include \
| |
| aurobotservers/trunk/libs \
| |
| mapbase/trunk \
| |
| rhd/trunk \
| |
| mrc/trunk \
| |
| aurs-plugins/aumanager aurs-plugins/aumrcobst aurs-plugins/auplanner/trunk \
| |
| aurs-plugins/auzoneobst \
| |
| aurobotservers/trunk
| |
|
| |
| Remember to remove the last back-slash
| |
|
| |
| ==== RHD plugins Makefile ====
| |
|
| |
| cd rhd/trunk/plugins
| |
| nano -w Makefile
| |
|
| |
| In this section
| |
|
| |
| PLUGINLIST := auserial gps crossbow fogyro hakocan smrdserial rflex \
| |
| rs232linesensor powercube esm slugs usbiss sf9dof \
| |
| joycontrol gdm8246 buspiratei2c buspiratead \
| |
| herkulex saberandmagenc imu gps2\
| |
| smrarm rhdlog hexakopter gbprofibus roboteq gpsSocket \
| |
| fieldsteer fielddrive fieldfrontenc \
| |
| dynamixel cruizcore simstage3
| |
|
| |
| Remove
| |
| gbprofibus
| |
| simstage3
| |
|
| |
| ==== server Plug-ins etc.====
| |
|
| |
| Some servers and plug-ins are excluded from raspberry pi (''qclient'', ''kinect'' and point-cloud related plug-ins)
| |
| in the respective Makefiles.
| |
|
| |
| === Build ===
| |
| Build mobotware:
| |
| cd ~/mobotwareXXX
| |
| make
| |
|
| |
| This should now compile with warnings only
| |
|
| |
| (''augraphplan.h not found'' may appear,
| |
| but try one more ''make'', then it usually works
| |
| @todo - find out why)
| |
|
| |
| === install ===
| |
|
| |
| The easyest way to use Mobotware is then to install into /usr/local/smr.
| |
|
| |
| This is done by
| |
|
| |
| sudo make install
| |
|
| |
| There will be a few error messages related to the uncompileable modules: qclient, hakoclient, simserver and libstage, this is OK.
| |
|
| |
| ==== setup path ====
| |
|
| |
| Add the mobotware bin-directory into default PATH in ''/etc/profile''
| |
|
| |
| sudo nano -w /etc/profile
| |
|
| |
| append the PATH line with '':/usr/local/smr/bin'' two places, like:
| |
|
| |
| ...
| |
| if [ "`id -u`" -eq 0 ]; then
| |
| PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/smr/bin"
| |
| else
| |
| PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/local/smr/bin"
| |
| fi
| |
| ...
| |
|
| |
| And add mobotware AURS library path into .bashrc
| |
|
| |
| nano -w ~/.bashrc
| |
|
| |
| append a line like this
| |
|
| |
| export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/smr/lib"
| |
|
| |
| To make this work, you have to logout and login again.
| |
|
| |
| === Make a Mobotware test configuration ===
| |
|
| |
| Logout and login to ensure that the PATH settings gets implemented
| |
|
| |
| Make a directory to run from
| |
|
| |
| mkdir ~/live
| |
| cd ~/live
| |
|
| |
| Copy a robot configuration file
| |
|
| |
| cp -r /usr/local/etc/mobotware/calib .
| |
|
| |
| make a ''rhdconfig.xml'' file with this content (loads a ''joystick'' and ''log'' plugin only).
| |
| Look in ''mobotware/build/config'' for specific versions for different robots.
| |
|
| |
| <?xml version="1.0" ?>
| |
| <!--
| |
| Configuration file for
| |
| Robot Hardware Daemon
| |
| -->
| |
| <!-- Starting RHD Configuration -->
| |
| <rhd>
| |
| <!-- *** Core Components Configuration *** -->
| |
| <!-- Sheduler configuration -->
| |
| <sheduler>
| |
| <period value="12000"/><!--in usec-->
| |
| <type value="LXRT"/><!--"usleep","itimer","LXRT" -->
| |
| </sheduler>
| |
| <!-- Server configuration -->
| |
| <server>
| |
| <port value="24902"/>
| |
| <clients number="10" allwriters="1"/>
| |
| </server>
| |
| <!-- *** Plugins Configuration *** -->
| |
| <plugins basepath="/usr/local/smr/lib/rhdplugin/">
| |
| <!--
| |
| Add your plugin here after this comment and
| |
| leave joycontrol and log - they may be usefull.
| |
| -->
| |
| <joycontrol enable="true"
| |
| lib="libjoycontrol.so.1"
| |
| critical="false"
| |
| safety="1">
| |
| <joystick port="/dev/input/js0"/>
| |
| <!-- speed:
| |
| maxfwd is max speed reference value send to device
| |
| maxturn is max turn-angle angle-vel send to device
| |
| fastBut is button number on joypad (0..10)
| |
| slowFactor used when fastBut is not pressed (0.1 .. 1.0) 1.0 is default -->
| |
| <speed maxfwd="900"
| |
| maxturn="900"
| |
| fastBut="5"
| |
| slowFactor="0.3"/>
| |
| <!-- deadband for joy-controll in joy-control units (+/- 32000) -->
| |
| <deadband max="767" min="-767"/>
| |
| <control enable="true"/>
| |
| </joycontrol>
| |
| <!-- rhdlog will open a file rhdlog.txt and write all symbol values here as fast as possible.
| |
| it may not keep up writeing with the tick interval specified (can be changed online)
| |
| interval = 0 (default) for no log - can be set online from rhdtest or MRC.
| |
| interval = N if N=1 every tick, N=2 every other, N=3..
| |
| File is created in default directory.
| |
| After each write operation the data is flushed to disk (using fflush()).
| |
| each line starts with a unix timestamp (gettimeofday) - set at tick call -->
| |
| <rhdlog enable="true"
| |
| lib="rhdlog.so.1"
| |
| critical="false"
| |
| interval="1"
| |
| safety="2"
| |
| debug="0">
| |
| </rhdlog>
| |
| </plugins>
| |
| </rhd>
| |
|
| |
| === Test Mobotware ===
| |
|
| |
| ==== RHD ====
| |
|
| |
| Hardware abstraction layer (Robot Hardware Daemon)
| |
|
| |
| Start RHD
| |
|
| |
| rhd
| |
|
| |
| It should end saying "RHD is running"
| |
|
| |
| (Stops with ctrl-C)
| |
|
| |
| ==== MRC ====
| |
|
| |
| Mobile Robot Control.
| |
|
| |
| While the RHD is running (in another terminal)
| |
|
| |
| start the MRC
| |
|
| |
| cd ~/live
| |
| mrc
| |
|
| |
| This should show a list of options
| |
|
| |
| -press 5 to quit
| |
|
| |
| ==== Laser scanner server ====
| |
|
| |
| Start laser scanner server
| |
|
| |
| ulmsserver
| |
|
| |
| There will be some errors as there is no laserscanner ...
| |
|
| |
| Press enter a few times to get a prompt ">>"
| |
|
| |
| Type
| |
| help
| |
| this should show a list of loaded plugins, like
| |
|
| |
| ...
| |
| Available commands (from currently loaded modules):
| |
| - push q server help shelp module do BASH alive quit exit
| |
| - scanGet scanPush scanSet
| |
| - odoPose odoPosePush
| |
| - mapPose mapPosePush
| |
| - utmPose utmPosePush
| |
| - var varPush
| |
| - poly
| |
| - mapbase
| |
| - settable addline setinitpose setinitcov localizeMHF localize resetlocalizer outputdist odoposeupdate resample localizeUKF
| |
| ...
| |
|
| |
| Try e.g.
| |
| scanget fake=3
| |
| this should show a lot of HEX numbers and a few more errors.
| |
|
| |
| Press ''q'' to quit
| |
|
| |
| ==== Camera server ====
| |
|
| |
| Copy the camera server configuration for raspberry camera (otherwise a default ucamserver.ini will be created without the raspberry plugins).
| |
|
| |
| cp ~/mobotware/build/config/raspberry/ucamserver.ini .
| |
|
| |
| Start the camera server - and optionally load the camera plug-in.
| |
|
| |
| ucamserver
| |
|
| |
| This should end with something like this
| |
|
| |
| Camera_server 2.1966 (May 1 2015 13:42:21 jca@oersted.dtu.dk)
| |
| - on port 24920
| |
| - type h for help, q for quit
| |
|
| |
| If camera is available, then use
| |
|
| |
| poollist
| |
|
| |
| to se if camera is running.
| |
|
| |
| Pres ''q'' to quit
| |
|
| |
| ===Code change===
| |
|
| |
| Every time you recompile any module, it is not implemented until you also run
| |
|
| |
| cd ~/mobotware
| |
| sudo make install
| |
|
| |
| To implement newly compiled modules right away, change a symbolic link:
| |
|
| |
| cd /usr/local
| |
| sudo rm smr
| |
| sudo ln -s ~/mobotware/build smr
| |