当时买RAV4的时候,展车是改装了10.2存屏幕的,当时脑子一冲动,就要求4S店加装,结果就是这个飞歌导航G6S二代。
刚刚安装好,还是不错的,但是半年左右的样子,就开始出现异响,后来声音越来越大,一直吱吱吱的不停,都有些神经衰弱了。
于是手工拆开,自己动手解决异响问题。
当时买RAV4的时候,展车是改装了10.2存屏幕的,当时脑子一冲动,就要求4S店加装,结果就是这个飞歌导航G6S二代。
刚刚安装好,还是不错的,但是半年左右的样子,就开始出现异响,后来声音越来越大,一直吱吱吱的不停,都有些神经衰弱了。
于是手工拆开,自己动手解决异响问题。
注意,升级BIOS,不需要创建启动U盘,更不需要安装Windows系统,只需要网页端通过iLO操作即可实现。
iLO 当前的版本分为硬件版本和软件版本
可以根据 升级 HP MicroServer Gen8 iLO 秘笈 的介绍,从HPE官网搜索并下载BIOS文件(官网建议下载Windows 版本的升级包,里面文件解压缩后最少),也可以从本站下载BIOS固件 iLO2.5 或者 HP Gen8 BIOS 20190404。
iLO2.5 解压缩完成后,其中的cp031064 gen8 bios 2015.11.02.exe就是我们需要升级的BIOS固件。
HP Gen8 BIOS 20190404 解压缩出来的cp039540.exe也是我们需要升级的BIOS固件,这个是目前最新的版本。
我们用7z等解压缩软件,解压缩出里面的文件,iLO 2.5中的CPQJ0612.F62 或者 HP Gen8 BIOS 20190404 中的CPQJ0613.684 就是我们的升级文件,两者都可以,一般建议用最新的 HP Gen8 BIOS 20190404 里面的文件。
iLO是Integrated Ligths-out的简称,是HP服务器上集成的远程管理端口,它是一组芯片内部集成vxWorks嵌入式操作系统,通过一个标准RJ45接口连接到工作环境的交换机。只要将服务器接入网络并且没有断开服务器的电源,不管HP服务器的处于何种状态(开机、关机、重启),都可以允许用户通过网络进行远程管理。简单来说,iLO是高级别的远程KVM系统,可以将服务器的显示信息显示在本地,并且使用本地的键盘鼠标控制、操作服务器,并可以将本地的光盘镜像、文件夹作为虚拟光驱映射并加载到服务器中。使用iLO,可以完成低层的BIOS设置、磁盘RAID配置、操作系统的安装等底层的工作,并且可以在完成系统安装后实现系统的远程控制与管理。
iLO 当前的版本分为硬件版本和软件版本
iLO 2.73版本新增了基于HTML5的远程控制台,比以前方便多了,建议升级这个版本。
可惜HP官网上并没有在明显的位置找到iLO的升级文件下载的地方,可参考 升级 HP MicroServer Gen8 iLO 秘笈 的介绍,自己搜索下载需要的版本。也可依赖网友们共享已经下载完成的更新文件。
我们知道Windows下有类似UltraISO的这样的软件可以用来编辑ISO文件,可引导ISO也没有问题。近来在Linux下玩的比较多,正好要改个ISO,于是就开始找Linux下有没有类似的软件。
Ubuntu软件中心里有一款叫ISOMaster的软件,可以创建和修改ISO文件。
在Ubuntu系统上进行如下配置:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install python-dev $ sudo apt-get install python-pip $ sudo pip install --upgrade pip $ sudo pip install --upgrade urllib3 $ sudo pip install numpy $ sudo pip install matplotlib |
之后执行如下测试代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import sys import numpy as np import matplotlib.pyplot as plt plt.ion() (fig, axis) = plt.subplots() bar_plot = axis.barh(0, 8,linewidth = 0) bar_plot.color= '#ffff00' for i in range(20): axis.set_xlim(xmax = max(i + 1, 10)) plt.draw() if sys.version_info < (3, 0): raw_input("Press Enter to continue...") else: input("Press Enter to continue...") |
上面的测试代码在Ubuntu 14.04.5版本上是可以正常执行的,对应的matplotlib的版本是matplotlib 1.3.1,但是放到Ubuntu 16.04.2系统上则是无法正常显示的,对应的matplotlib的版本是matplotlib 1.5.1。
造成这个问题的原因在于matplotlib.pyplot.draw(),这个函数行为的改变,早期这个函数是同步更新界面的,后来的版本却变成了空闲异步更新界面,只有当matplotlib.pyplot.pause(interval)被调用的时候才会刷新界面。
所以只需要上面的代码修改成如下即可在不同版本之间兼容:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import sys import numpy as np import matplotlib.pyplot as plt plt.ion() (fig, axis) = plt.subplots() bar_plot = axis.barh(0, 8,linewidth = 0) bar_plot.color= '#ffff00' for i in range(20): axis.set_xlim(xmax = max(i + 1, 10)) plt.draw() plt.pause(0.00001) if sys.version_info < (3, 0): raw_input("Press Enter to continue...") else: input("Press Enter to continue...") |
注意,我们在matplotlib.pyplot.draw()调用后面增加了matplotlib.pyplot.pause(interval)的调用。
貌似调用fig.canvas.flush_events()更合适?
查看matplotlib的版本使用如下代码:
|
1 2 |
import matplotlib as mpl print mpl.__version__ |
在Ubuntu 16.04上测试OpenCV 3.2,遇到一个在子线程中更新图像,而界面不刷新的问题。
|
1 |
$ sudo apt-get install libopencv-dev |
编译执行如下代码:
|
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 |
#include <pthread.h> #include <opencv/cv.h> #include <opencv/highgui.h> #include <stdio.h> #include <stdlib.h> void* imshowWorker(void*){ for(int i = 0;i < 100;i++){ char str[10+1]; snprintf(str, 10,"%d",i); cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 ); cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 )); cv::imshow("Number View", img ); if(i > 90){ i = 0; } } } int main(void){ cv::namedWindow("Number View"); pthread_t id; pthread_create(&id,NULL,imshowWorker,NULL); getchar(); return (0); } |
|
1 |
$ g++ opencv_imshow.cpp -I `pkg-config --libs opencv` -lpthread -o opencv_imshow |
可以看到,上面的代码执行之后,界面并没有出现,即使出现也没有刷新。
这个问题是由于界面更新必须在主线程中执行,需要手工通知主线程。
修改后的代码如下:
|
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 |
#include <pthread.h> #include <opencv/cv.h> #include <opencv/highgui.h> #include <stdio.h> #include <stdlib.h> void* imshowWorker(void*){ for(int i = 0;i < 100;i++){ char str[10+1]; snprintf(str, 10,"%d",i); cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 ); cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 )); cv::imshow("Number View", img ); cv::waitKey(30); if(i > 90){ i = 0; } } } int main(void){ cv::namedWindow("Number View"); pthread_t id; pthread_create(&id,NULL,imshowWorker,NULL); getchar(); return (0); } |
也就是每次更新图片后手工调用代码
|
1 |
cv::waitKey(30); |
这个等候时间,只要大于0即可,比如:
|
1 |
cv::waitKey(1); |
最近在更新Ubuntu 16.04系统的时候,发现总是在安装Adobe Flash更新的时候失败,提示如下信息:
|
1 2 3 4 5 6 7 8 9 |
正在处理用于 update-notifier-common (3.168.5) 的触发器 ... flashplugin-installer: processing... flashplugin-installer: downloading http://archive.canonical.com/pool/partner/a/adobe-flashplugin/adobe-flashplugin_20170912.1.orig.tar.gz 获取:1 http://archive.canonical.com/pool/partner/a/adobe-flashplugin/adobe-flashplugin_20170912.1.orig.tar.gz [30.4 MB] 37% [1 /var/lib/update-notifier/package-data-downloads/partial/adobe-flashplugi 已下载 30.4 MB,耗时 10分 11秒 (49.8 kB/s) W: 文件'/var/lib/update-notifier/package-data-downloads/partial/adobe-flashplugin_20170912.1.orig.tar.gz'无法被用户'_apt'访问,无法降低权限以进行下载。 - pkgAcquire::Run (13: 权限不够) E: 下载失败 |
如果系统语言是英文的,可能看到下面的信息:
|
1 |
W: Can't drop privileges for downloading as file '/var/lib/update-notifier/package-data-downloads/partial/adobe-flashplugin_20170912.1.orig.tar.gz' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied) |
解决方法如下:
|
1 2 3 4 5 6 7 |
$ sudo chown -R _apt:root /var/lib/update-notifier/package-data-downloads/partial/ $ sudo rm /var/lib/update-notifier/package-data-downloads/partial/*.FAILED $ sudo apt install --reinstall update-notifier-common $ sudo apt-get install --reinstall flashplugin-installer |
这样,就可以正常安装更新了。
我想使用一些在旧的GCC版本中不可用的GCC警告开关(例如-Wtype-limits)。
有没有一个简单的方法来检查GCC版本?
我不会说容易,但是可以使用GNU make的SHELL函数来执行gcc --version命令,然后使用ifeq条件表达式来检查版本号,并适当地设置CFLAGS变量。
以下是一个简单的MakeFile示例:
|
1 2 3 4 5 6 7 8 9 10 |
CC = gcc GCCVERSION = $(shell gcc --version | grep ^gcc | sed 's/^.* //g') CFLAGS = -g ifeq "$(GCCVERSION)" "4.4.3" CFLAGS += -Wtype-limits endif all: $(CC) $(CFLAGS) prog.c -o prog |
注意:不存在ifgt语法。但是可以使用expr命令进行比较。
例子如下:
|
1 2 3 4 5 6 7 8 9 10 |
CC = gcc GCCVERSIONGTEQ4 := $(shell expr `gcc -dumpversion | cut -f1 -d.` \>= 4) CFLAGS = -g ifeq "$(GCCVERSIONGTEQ4)" "1" CFLAGS += -Wtype-limits endif all: $(CC) $(CFLAGS) prog.c -o prog |
要将完整的3部分GCC版本(不仅第一位数字)转换成数字格式,适合比较(例如40701)使用
|
1 |
gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$/&00/' |
其中解决了任何版本部分中双数字版本号的可能性,以及gcc -dumpversion输出内容缺少3个部分的可能性(在一些较早的GCC版本中存在这种情况)。
所以要测试MakeFile中的版本,使用(注意$$里面的最后一个sed命令)
|
1 2 3 4 |
GCC_GTEQ_472 := $(shell expr `gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/'` \>= 40702) ifeq "$(GCC_GTEQ_472)" "1" ... endif |
我刚刚遇到这个问题,我需要测试GCC的前两位数字,想要一个比上面sed过滤字符串更复杂的操作。我使用bc进行比较,因为它支持浮点数(expr将非整数(non-integers)都视为字符串):
|
1 2 3 4 |
GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif |
如果在GCC 4.9之后发布了GCC 4.10,那么用sed处理是必要的:
|
1 2 3 4 |
GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | sed -e 's/\./*100+/g' | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif |
对于Ubuntu 14.04.5系统上的安装操作,请参考Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)
下面是我自己fork出来修改后的代码在Ubuntu 16.04.3系统上的安装操作
要求机器上必须有CUDA 8.0/9.0支持的显卡才可以。
|
1 2 3 |
$ sudo apt-get install git -y $ cd ~ $ git clone https://github.com/wangqiang1588/open_ptrack_org.git open_ptrack |
|
1 2 3 4 5 6 |
$ cd open_ptrack/scripts $ chmod +x *.sh $ ./ros_install.sh $ source /opt/ros/kinetic/setup.bash $ ./ros_configure.sh |
OpenPTrack|
1 2 3 |
$ sudo apt-get install libdrm-dev $ ./openptrack_install.sh |
OpenPTrack目录|
1 |
$ ln -s ~/workspace/ros/catkin/src/open_ptrack ~/open_ptrack |
Kinect V2驱动程序安装检查当前用户目录下的.bashrc文件,注释掉如下内容:
|
1 |
export KINECT_DRIVER=openni |
然后执行如下命令:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Nvidia Jetson TX1/TX2 不要安装这个 $ sudo apt-get install nvidia-375-dev # Nvidia Jetson TX1/TX2不支持OpenCL,因此编译的时候,不要安装ocl-icd-opencl-dev $ sudo apt-get install ocl-icd-opencl-dev $ sudo apt-get install m4 $ sudo apt-get install automake $ sudo apt-get install libjpeg-dev $ sudo ln -s -f /usr/lib/`uname -m`-linux-gnu/libturbojpeg.so.0 /usr/lib/`uname -m`-linux-gnu/libturbojpeg.so $ sudo apt-get install libglewmx-dev $ sudo apt-get install libudev-dev $ sudo ln -s -f /lib/`uname -m`-linux-gnu/libudev.so.1 /lib/`uname -m`-linux-gnu/libudev.so $ cd ~/workspace/ros/catkin/src $ source ~/.profile $ roscd open_ptrack/../scripts $ chmod +x kinect2_install.sh $ ./kinect2_install.sh |
6.重新编译代码
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
UBUNTU_VERSION=`lsb_release -c -s` ROS_DISTRO=hydro if [ $UBUNTU_VERSION = trusty ] || [ $UBUNTU_VERSION = saucy ] ; then ROS_DISTRO=indigo elif [ $UBUNTU_VERSION = xenial ] ; then ROS_DISTRO=kinetic fi GCC_VERSION=`gcc -dumpversion | cut -f1 -d.` source /opt/ros/$ROS_DISTRO/setup.bash cd ~/workspace/ros/catkin catkin_make --pkg calibration_msgs catkin_make --pkg opt_msgs #GCC 5 bug out of memory if [ $GCC_VERSION > 4 ] ; then catkin_make --force-cmake -j 1 else catkin_make --force-cmake fi |
执行如下命令:
|
1 |
$ roscore |
检查当前用户目录下的.bashrc文件,然后注释掉如下内容:
|
1 |
export KINECT_DRIVER=openni |
上面语句如不注释,会导致程序启动时候的崩溃。
新建一个Shell,执行如下命令
|
1 2 |
$ cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge $ sudo ./kinect2_bridge |
执行此步的时候如果提示找不到Kinect设备,请重启一下系统再试试。
可能需要重新插拔一下Kinect的USB数据线,然后执行如下命令
|
1 |
$ roslaunch kinect2_bridge kinect2_bridge.launch |
执行之后,等待十几秒,然后Ctrl+C中断执行。
执行完成后,执行
|
1 |
$ roslaunch tracking detection_and_tracking_kinect2.launch |
之后,会弹出三个界面出来。
参考Kinect V2在Ubuntu 14.04系统上的驱动配置与安装在一个全新安装的Ubuntu 14.04系统中配置完成相关的驱动及其依赖。
Kinect V2深度图与彩色图融合的方式,简单粗暴,由于深度图像是512*424大小,因此,直接把彩色图像缩放成对应的512*424,然后像素点一一对应。至于原始大小的彩色图像,那么就是一片像素对应同一个深度即可。
注意,这个方式只适合Kinect V2,可以理解成Kinect V2的设计就是这样的,两个设备出厂的时候就校准为这样的输出。
具体的转换代码参考registration.cpp,Registration.cpp,建议直接调用驱动层提供的功能来实现,这样的话,一系列的参数设置可以同步,否则上层每次修改了分辨率等参数的时候,要自己手工修改这些数据。
Python深度图与彩色图融合的例子如下: