月度归档:2019年02月

Intellij编写Kotlin的Hello world并打包成JAR

首先,创建Kotlin项目

然后,在src文件夹下新建main.kt,编写Hello world

fun main(args: Array<String>) {
    println("Hello, World!")
}

接着,菜单File->Project Structure

添加JAR工件

选择主类

最后所有的设置如下图,点击OK,确认和应用即可。

然后我们构建JAR,在弹出的小窗口中选择Build

最后,在输出文件夹就可以看到JAR了,可以打开命令行用java -jar xxxx.jar来运行一下。会输出Hello, World!

 

 

配合Clion在Ubuntu上安装并使用OpenMPI

如果你在虚拟机上安装Ubuntu,请确认系统的CPU拥有多个核心,比如下图的4核心

首先,我们在Ubuntu上安装OpenMPI

sudo apt-get update
sudo apt-get install openmpi-bin openmpi-doc libopenmpi-dev

安装完成后,我们到Clion新建一个项目。打开项目的CMakeLists.txt,在任意set下加入下面的参数。

set(CMAKE_C_COMPILER /usr/bin/mpicc)
set(CMAKE_CXX_COMPILER /usr/bin/mpic++)

然后,我们打开菜单Run->Edit Configurations

找到当前应用的配置文件(默认应该就是),比如我这里这个项目叫mpi_t1,左边应用就应该选择mpi_t1。

然后,找到Executable编辑框右侧的向下箭头,选择Select other,在路径里输入/usr/bin/mpiexec ,点击OK即可

然后在Program arguments里输入-n 4 ./<你的应用可执行文件的名字> ,比如我这里叫mpi_t1,应该输入-n 4 ./mpi_t1 ,这里4代表的是你电脑处理器的核心数,如果你的电脑没有4核心,也要修改。

然后修改Working directory,为你的项目目录+cmake-build-debug ,一个比较简单的方式是直接到项目左侧的项目文件栏右键cmake-build-debug 文件夹,然后选择Copy Path

最后修改的效果如下:

现在,你可以使用Build+Run来直接编译和运行你的OpenMPI程序了。

python在ROS中订阅地图消息,在opencv中可视化

在本例中,博主将介绍如何把OccupancyGrid的地图数据在opencv中可视化。

首先,我们阅读OccupancyGrid的文档,可以发现这个结构体主要分为两部分,其MapMetaData存储的是地图的元数据,比如宽度,高度,分辨率等信息。而int8[] data 是一个行主序的数组,数组的值为当前区域被占用的可能性,值域为[0,100],特别地,未知区域的值为-1。

下面是关键部分的示例代码,我们首先订阅一次/map 的消息,并且获取地图元信息,然后我们创建一个numpy数组,并且将可能性的值转换为0-255的颜色。不过在下面的代码中,我将忽略这一特性。所以在probability > 0 这直接写了color=0 ,实际上你可以使用color = (1 – probability) * 255 来代替这一行。最后,因为map_server生成的默认地图未知区域的颜色为205,所以空的numpy数组在一开始用了205来进行填充。

from nav_msgs.msg import OccupancyGrid
map_message = rospy.wait_for_message("/map", OccupancyGrid, 3)  # type: OccupancyGrid
map_width = map_message.info.width
map_height = map_message.info.height
resolution = map_message.info.resolution
origin = map_message.info.origin.position
map_data = np.reshape(map_message.data, (map_width, map_height))
map_rgb = np.zeros((map_width, map_height, 3), np.uint8)
map_rgb.fill(205)
for row in range(map_height):
    for col in range(map_width):
        probability = map_data[row, col]
        if probability == -1:
            continue
        if probability > 0:
            color = 0
        else:
            color = 255
        map_rgb[row, col] = (color, color, color)
map_rgb = cv2.flip(map_rgb, 0)

 

重装Win10并删除ESP分区后,修复Ubuntu16在UEFI的双系统引导

介绍

最近笔记本的win10一直无法升级到最新版本,查看原因后发现是ESP分区太小了,只有不到100M,而win10推荐的大小是至少500-700M的空间。为了扩大处于分区表开头位置的ESP分区,我删除了ESP以及在ESP之后的win10系统分区。现在硬盘上还存在于Ubuntu的两个分区,一个是挂载点/ ,一个是/home

由于ESP分区直接被删除并且在Win10的重新安装中被彻底重置,原先Ubuntu的EFI启动文件已经被删除。经过多方查找资料。修复的方法如下。

首先,我们用一个Ubuntu的live cd(刻录的U盘也是可以的)启动系统。如果你想先启动你之前的Ubuntu系统内核,请遵循下面的步骤,如果想直接用live cd修复,请直接到修复部分。

启动原Ubuntu内核

在GURB页面按c进去命令行模式,接着输入ls 命令。屏幕中会显示目前所有识别的硬盘以及分区。比如(hd0,gpt1), (ht0,gpt2) 之类的。接下来,使用命令ls (hd0,gpt1)/ 查看这些分区下面的文件夹,找到原先Ubuntu系统/ 挂载点所在的分区。用上面的命令尝试所有的分区(更改命令中的gpt1 为对应的序号),找到含有/boot 文件夹的分区。

找到之后(比如我们确定了是gpt3 ),我们输入set root=(hd0,gpt3)

然后,我们输入set pager=1 来确保分屏显示。

然后,输入cat /boot/grub/grub.cfg 来查看原grub的配置文件。找到第一个menuentry 的启动项。

记录上面以linux 开头这一行的命令,注意可能有折行,要一直抄到尾部,UUID不能错。

然后,稍微上面几行,记录以initrd 开头这一行的命令。

然后,我们依次输入上面记录的两个命令,注意不要出错。最好拍照片拍下来,除了UUID,其他路径部分都是可以用tab补全的。

最后,我们输入boot 命令,启动系统。

修复引导

如果你是使用live cd,请先输入下面的命令进入root用户

sudo -i

然后,我们添加boot-repair 的ppa源并安装,我们需要使用这款软件进行修复。

sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install boot-repair

然后,我们使用sudo boot-repair 命令运行这个工具,然后选择第一个选项。然后按照该工具的提醒进行修复即可。最后这个工具会生成一个报告,可能会花一点时间,耐心等待就好。

显示下面这样的提示证明修复成功,可以重新启动系统进入BIOS调整UEFI的启动顺序为ubuntu即可。

博主在使用boot-repair完成修复后,发现编辑/etc/default/grub 的自定义设置不生效了,并且boot-repair生成的启动菜单项目太多。如果你也遇到上面的问题,你可以在上面的所有操作完成后,进入到你的Ubuntu系统,运行下面的命令重装你的GRUB2

grub-install -v
update-grub

然后再重启系统即可。