从国外下载ROS
安装包,有时候会非常耗时。国内镜像的地址参考如下:
1 2 |
#中科大源 $ sudo sh -c 'echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' |
从国外下载ROS
安装包,有时候会非常耗时。国内镜像的地址参考如下:
1 2 |
#中科大源 $ sudo sh -c 'echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' |
执行如下命令安装:
1 2 3 4 5 6 7 |
$ sudo apt-get update #日志位于 /var/log/upstart/docker.log #解决无法启动 "Shutting down daemon due to errors: Error loading docker apparmor profile: exec: "/sbin/apparmor_parser": stat /sbin/apparmor_parser: no such file or directory ()" $ sudo apt-get install apparmor $ sudo apt-get install -y docker.io |
启动服务:
1 |
$ sudo service docker start |
测试服务是否正常:
1 |
$ sudo docker run hello-world |
创建基础镜像:
1 2 3 4 5 6 7 |
$ cd ~ $ mkdir basic_docker $ cd basic_docker $ touch Dockerfile |
接下来,就是Dockerfile
里面的内容了:
1 2 3 4 5 6 7 8 |
#从基础镜像派生,基础镜像从Docker官网下载 FROM ubuntu:14.04 #镜像所有者 MAINTAINER www.mobibrw.com #安装命令,安装镜像需要的软件 RUN apt-get update && apt-get install -y php5 |
构建Docker
镜像:
1 2 3 4 5 6 |
#注意 -t 参数指定镜像名,后面可以用":"来指定版本号 比如 “-t basic_docker:1.0" #创建好的镜像的默认存放路径为"/var/lib/docker" $ sudo docker build -t basic_docker . #创建完成后,查看机器上已经创建的镜像列表 $ sudo docker images |
运行刚刚创建好的镜像:
1 2 3 |
#执行之后,当前Shell被切换到了Docker内部的Shell中 $ sudo docker run -t -i basic_docker /bin/bash |
导出刚刚创建好的镜像:
1 |
$ sudo docker save basic_docker > basic_docker.tar |
其他机器上加载我们导出的镜像:
1 |
$ sudo docker load --input basic_docker.tar |
删除不再使用的镜像:
1 2 3 4 5 6 7 8 9 10 11 12 |
#停止所有的container,这样才能够删除其中的images $ sudo docker stop $(sudo docker ps -a -q) #删除所有container解除对镜像的引用 $ sudo docker rm $(sudo docker ps -a -q) #创建完成后,查看机器上已经创建的镜像列表 $ sudo docker images $ sudo docker rmi ${IMAGE ID} #想要删除untagged images,也就是那些id为<None>的image的话可以用,注意 awk部分必须是单引号' $ sudo docker rmi $(sudo docker images | grep "^<none>" | awk '{print $3}') |
如果运行时报错:
1 |
Error response from daemon: Cannot start container 915xxxxxxxxxx: [8] System error: mountpoint for devices not found |
则尝试安装:
1 |
$ sudo apt-get install cgroup-bin |
如果 m & (m - 1) == 0,则m是2的n次方
1 2 3 |
public static boolean isPower2(int i){ return (i > 0) && ((i & (i - 1)) == 0); } |
1 2 3 4 5 6 7 |
$ cd ~ $ git clone https://github.com/opencv/opencv.git $ cd opencv $ git checkout 2.4.13.5 |
1 2 3 4 |
$ sudo apt-get install -y cmake #借助系统自带的opencv简化依赖安装步骤 $ sudo apt-get install -y libopencv-dev |
1 2 3 4 5 6 7 8 9 10 11 |
$ cd ~ $ cd opencv $ mkdir build $ cd build $ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. $ make -j 10 |
如果要生成DEB
安装包,则上面的命令修改成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ cd opencv $ mkdir build $ cd build $ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CPACK_BINARY_DEB=ON .. $ make -j 10 $ sudo make install $ sudo cpack runs #最后在当前目录下生成DEB安装包 |
1 |
$ sudo make install |
如果执行cmake
时候出现如下错误信息
1 2 3 4 5 6 7 8 9 10 |
CMake Error at CMakeLists.txt:11 (message): FATAL: In-source builds are not allowed. You should create separate directory for build files. -- Configuring incomplete, errors occurred! |
则应该是在代码根目录下直接执行过cmake
,导致根目录下生成了CMakeCache.txt
,需要删除CMakeCache.txt
再次执行编译即可。
正常情况下我们使用已经编译好的ROS
安装包来安装配置默认的ROS
环境,就可以比较好的完成工作了。具体参考Ubuntu14.04安装和配置ROS Indigo。
但是在某些情况下,比如,我们需要替换或更新里面的某些默认安装包的版本(比如OpenCV
)。
这种情况下,我们就只能重新从源代码开始编译,或者构建自己的安装源了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' $ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116 $ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get dist-upgrade $ sudo apt-get install python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential $ sudo rosdep init $ rosdep update $ mkdir ~/ros_catkin_ws $ cd ~/ros_catkin_ws $ export ROS_VER_NAME=indigo $ export OS_VER_NAME=trusty #如果是全部重新编译,则删除整个src目录再进行操作 $ rosinstall_generator desktop_full --rosdistro $ROS_VER_NAME --deps --wet-only --tar > $ROS_VER_NAME-desktop-full-wet.rosinstall $ wstool init -j8 src $ROS_VER_NAME-desktop-full-wet.rosinstall $ rosdep install --from-paths src --ignore-src --rosdistro $ROS_VER_NAME -y $ ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release #如果想一步到位,安装到最终目录,请执行如下命令,主要是 --install-space /opt/ros/$ROS_VER_NAME # sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/$ROS_VER_NAME |
上面的操作是生成完整的文件,然后再拷贝到需要安装的最终目录(--install-space /opt/ros/$ROS_VER_NAME
指定),但是并没有生成DEB
格式的安装包。
如果我们需要建立自己的安装源,那么参照上面的操作,并且正常编译完成后,使用下面的步骤编译安装包:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
$ export ROS_VER_NAME=indigo $ export OS_VER_NAME=trusty #如果要生成deb安装包,需要按照顺序操作 $ sudo apt-get install python-bloom #编译并安装基础核心模块 #-----------------------catkin------------------------------- $ cd ~/ros_catkin_ws/src/catkin/ $ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME $ fakeroot debian/rules binary #需要安装,后续的模块编译依赖前面编译的模块 $ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-catkin*.deb #部分Python模块依赖我们刚刚编译的模块,把路径加入,否在后续模块编译会报错 $ export PYTHONPATH=$PYTHONPATH:/opt/ros/indigo/lib/python2.7/dist-packages #-----------------------genmsg------------------------------- $ cd ~/ros_catkin_ws/src/genmsg/ $ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME $ fakeroot debian/rules binary $ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-genmsg*.deb #-----------------------genpy------------------------------- $ cd ~/ros_catkin_ws/src/genpy/ $ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME $ fakeroot debian/rules binary $ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-genpy*.deb #-----------------------gencpp------------------------------- $ cd ~/ros_catkin_ws/src/gencpp/ $ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME $ fakeroot debian/rules binary $ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-gencpp*.deb #-----------------------genlisp------------------------------- $ cd ~/ros_catkin_ws/src/genlisp/ $ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME $ fakeroot debian/rules binary $ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-genlisp*.deb #-----------------------message_generation------------------------------- $ cd ~/ros_catkin_ws/src/message_generation/ $ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME $ fakeroot debian/rules binary $ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-message-generation*.deb #-----------------------message_runtime------------------------------- $ cd ~/ros_catkin_ws/src/message_runtime/ $ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME $ fakeroot debian/rules binary $ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-message-runtime*.deb ........................................................................ #-----------------------std_msgs------------------------------- $ cd ~/ros_catkin_ws/src/std_msgs/ $ bloom-generate rosdebian --os-name ubuntu --os-version $OS_VER_NAME --ros-distro $ROS_VER_NAME $ fakeroot debian/rules binary $ sudo dpkg -i ~/ros_catkin_ws/src/ros-$ROS_VER_NAME-std-msgs*.deb |
至于如何建立自己的源,请参考:建立自己的apt-get源。
对于替换OpenCV
重新编译的情况,参考Ubuntu 14.04.5编译安装OpenCV-2.4.13.5,然后执行sudo apt-get remove libopencv-dev
&&sudo apt-get autoremove
&& rm -rf ~/ros_catkin_ws/install_isolated
删除已经安装好的OpenCV
以及临时文件,然后重新编译ROS
源代码。最后可以从~/ros_catkin_ws/install_isolated/share/cv_bridge/cmake/cv_bridgeConfig.cmake
中看到已经链接刚刚编译安装的OpenCV
版本了。
腾讯云介绍的挂载数据盘的操作比较繁琐,如果只有一块数据盘,并且数据盘只创建一个分区,而且磁盘空间不超过2TB
,可以使用下面的方法:
1 2 3 4 5 6 7 8 9 10 |
$ sudo parted /dev/vdb mklabe msdos $ sudo parted /dev/vdb mkpart primary ext4 0% 100% $ sudo mkfs.ext4 /dev/vdb1 $ sudo mkdir /data $ sudo mount /dev/vdb1 /data $ sudo sed -i '$a\/dev/vdb1 /data ext4 defaults 0 0' /etc/fstab |
最近尝试迁移向腾讯云,然后通过SSH
登陆到服务器,发现编辑脚本的时候中文会显示为乱码。
服务器的版本是Ubuntu 16.04.3 Server
。
解决方法非常简单,执行如下命令即可:
1 2 3 |
#解决ssh登陆中文显示问题 $ sudo apt-get install language-pack-zh-hans |
最新的Ubuntu 16.10/17.10
上已经找不到/etc/rc.local
这个文件了。但是我们很多配置都是写在这个文件里面的,因此如果直接按照systemd
配置服务的话,需要修改很多。这里我们使用一个比较简单的兼容方案。
创建systemd
的服务脚本
1 |
$ sudo vim /etc/systemd/system/rc-local.service |
里面的内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target |
激活服务
1 |
$ sudo systemctl enable rc-local.service |
手工创建或者拷贝已有的/etc/rc.local
,这里我们以手工创建为例子:
1 2 3 4 5 |
$ echo '#!/bin/bash\n' | sudo tee /etc/rc.local #后面是详细的需要开机执行的 #给予脚本执行权限 $ sudo chmod +x /etc/rc.local |
树莓派官方已经放出了Raspbian 8 Jessie
。这是Raspbian Wheezy 2015.5.5
之后的一次比较大的版本更新。而老的Raspbian Wheezy
版本也可以通过简单的步骤升级到Raspbian 8 Jessie
且不用重新刷写镜像。下面将介绍如何升级,要知道,升级有可能会破坏现有系统,在此之前请一定注意备份好老的系统。如果你对之前的系统做的更改越小,升级将会越顺利。
1 2 3 4 5 |
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get dist-upgrade |
1 2 3 4 5 |
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak $ sudo sed -i 's/wheezy/jessie/g' /etc/apt/sources.list $ sudo sed -i 's/#deb http:\/\/mirrordirector/deb http:\/\/mirrordirector/g' /etc/apt/sources.list |
Raspbian 8 Jessie
1 2 3 4 5 |
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get dist-upgrade |
Ubuntu 14.04
修改配置,重启网卡没有生效,出现如下问题:
1 2 3 4 5 6 7 8 |
$ service networking restart //重启网络服务 stop: Job failed while stopping start: Job is already running: networking $ tail -f /var/log/upstart/networking.log //查看错误日志 Stopping or restarting the networking job is not supported. Use ifdown & ifup to reconfigure desired interface. |
从以上日志内容可以看出,传统的service
重启和停止网络已经不再支持了,需要通过使用ifdown
& ifup
来实现相应的操作。
1 2 3 |
$ sudo ifdown eth0 $ sudo ifup eth0 |
如果在远程Shell
操作的情况,上面的命令可能会只执行了ifdown
,然后连接就断开,而无法执行后面的ifup
命令,导致无法继续操作。
解决方法是把上面的命令写入一个脚本文件执行:
1 2 3 4 5 |
$ echo 'ifdown eth0 && ifup eth0' >> restart_eth.sh $ chmod +x restart_eth.sh $ sudo ./restart_eth.sh |