如果 m & (m - 1) == 0,则m是2的n次方
|
1 2 3 |
public static boolean isPower2(int i){ return (i > 0) && ((i & (i - 1)) == 0); } |
如果 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 |
Ubuntu 17.10上比较好用的串口终端是minicom,下面我们介绍一下使用方法。
OpenMediaVault-4.0.15执行更新(apt update)时报错,详细错误信息如下:
|
1 2 3 4 5 6 7 8 9 10 |
命中:12 http://packages.openmediavault.org/public arrakis InRelease Exception ignored in: <function WeakValueDictionary.__init__.<locals>.remove at 0x7f7dc337b730> Traceback (most recent call last): File "/usr/lib/python3.5/weakref.py", line 117, in remove TypeError: 'NoneType' object is not callable Exception ignored in: <function WeakValueDictionary.__init__.<locals>.remove at 0x7f7dc337b730> Traceback (most recent call last): File "/usr/lib/python3.5/weakref.py", line 117, in remove TypeError: 'NoneType' object is not callable |
通过观察发现,只要从packages.openmediavault.org中下载文件失败,就会报告这个错误。
发生错误之后,重新执行
|
1 |
$ sudo apt update |
即可解决这个问题,或者忽略这个错误信息即可。