解决 Open3D 同时链接其他库时的 Undefined Reference 错误

当你的 Open3D 项目同时使用了 OpenCV 或 Protobuf 等其他库时,在链接库时可能会出现 Undefined Reference 的错误。这是因为 Open3D 默认使用的 C++ ABI 版本与其他库不一致导致的。 为了解决这个问题,可以在重新编译安装 Open3D 时打开 -DGLIBCXX_USE_CXX11_ABI=ON 选项,即使用 C++11 ABI 版本。以下是具体的步骤: 解决方法找到 Open3D 源码cd open3d 找不到请在 Github 上重新下载。 重新编译安装 Open3D进入 Open3D 的源代码目录的 build 子目录进行编译安装。 cd build 在 build 子目录中执行 CMake 命令生成 Makefile。在命令行中添加 -DGLIBCXX_USE_CXX11_ABI=ON 选项。 cmake .. -DBUILD_SHARED_LIBS=ON -DGLIBCXX_USE_CXX11_ABI=ON -DCMAKE_BUILD_TYPE=Release 最后,执行 make 命令编译并安装 Open3D。 make -j6 sudo make install 使用 Open3D重新编译安装后的 Open3D 就能够正常链接其他库了。

2023年06月09日 · 1 分钟 · Cassius0924

Unity 脚本使用 NuGet 安装解决方案包

本文旨在教大家如何在 Unity 中使用 NuGet 安装解决方案包。 Visual Studio 集成了 NuGet 管理器,可以方便的安装和卸载解决方案包。但在使用 Viusal Studio 开发 Unity C# 脚本时,不能直接在内置的 NuGet 管理器安装解决方案包。因为 Unity 工程打开或运行时会刷新工程文件,导致我们在 Visual Studio 内置 NuGet 管理器安装的解决方案包失效。所以 Unity 使用 NuGet 安装解决方案包需要特殊步骤。 步骤下载解决方案包在NuGet官网下载你需要解决方案包,例如Google.Protobuf。 直接下载会下载最新预览版,稳定版需要点击右上角的 Full stats,查看所有版本。 找到稳定版 3.22.4,点击即可下载。 解压包下载后会得到拓展名为.nupkg的文件,先将文件拓展名改为.zip,接着解压即可。 导入dll文件解压后可以得到 dll 文件,位于 google.protobuf.3.22.4/lib/**/Google.Protobuf.dll ,将dll文件复制到 Unity 工程文件夹的 Assets/Plugins 文件夹下,若没有这个文件夹自己手动新建一个。 配置Unity项目接着需要将 Unity 项目的 Api Compatibility Level 更改为与 dll 文件对应的版本。打开 Unity 的 Project Settings,找到 Player > Other Settings > Api Compatibility Level。 ...

2023年06月01日 · 1 分钟 · Cassius0924

垃圾代码书写准则

这是一个你的项目应该遵循的垃圾代码书写准则的列表,把称为适当的垃圾代码。 来自GitHub开源项目State-of-the-art。 准则💩 以一种代码已经被混淆的方式命名变量如果我们键入的东西越少,那么就有越多的时间去思考代码逻辑等问题。 Good 👍🏻 let a = 42; Bad 👎🏻 let age = 42; 💩 多用拼音命名变量和函数写拼音多方便,我们要推崇。 Good 👍🏻 function hqtpgd(tp) { //获取图片高度 return tp.height; //图片 } Bad 👎🏻 function getImageHeight(image) { return image.height; } 💩 变量/函数混合命名风格为不同庆祝一下。 Good 👍🏻 let wWidth = 640; let w_height = 480; Bad 👎🏻 let windowWidth = 640; let windowHeight = 480; 💩 不要写注释反正没人会读你的代码。 Good 👍🏻 const cdr = 700; Bad 👎🏻 更多时候,评论应该包含一些“为什么”,而不是一些“是什么”。如果“什么”在代码中不清楚,那么代码可能太混乱了。 // 700ms的数量是根据UX A/B测试结果进行经验计算的。 // @查看: <详细解释700的一个链接> const callbackDebounceRate = 700; 💩 使用母语写注释如果您违反了“无注释”原则,那么至少尝试用一种不同于您用来编写代码的语言来编写注释。如果你的母语是英语,你可能会违反这个原则。 Good 👍🏻 // Закриваємо модальне віконечко при виникненні помилки. toggleModal(false); Bad 👎🏻 // 隐藏错误弹窗 toggleModal(false); 💩 尽可能混合不同的格式为不同庆祝一下。 Good 👍🏻 ...

2023年04月21日 · 4 分钟 · Cassius0924

Linux 命令行网络连接指南

本文旨在为 Linux 用户介绍提供关于使用命令行连接网络的方法。 本文将详细介绍利用 nmcli 工具连接 Wi-Fi 和以太网的教程,包括查看连接状态、控制 Wi-Fi、控制以太网等等。 安装 nmclinmcli 是 NetworkManager 的命令行工具,它可以用于管理和配置网络连接。如果你的 Linux 系统上没有安装 nmcli,请使用以下命令进行安装: sudo apt-get install network-manager 查看连接状态在连接网络之前,我们需要先查看网络状态。使用以下命令可以查看当前网络状态: nmcli general status 以上命令可以简写为: nmcli g # g 表示 general,默认为 status STATE:这是 NetworkManager 的当前状态。它可以是 “connected”、“connecting”、“disconnected”、“disconnecting” 或 “asleep” 等。 Connectd Connecting Disconnected Disconnecting Asleep 已连接 连接中 未连接 断连中 休眠 CONNECTIVITY:这是系统的网络连接状态。它可以是 “full”、“limited” 、“Portal” 或 “none”。 Full Limited Portal None 已联网,可上网 已联网,但不可上网 已联网,但需要认证 未联网 WIFI-HW:这是 WiFi 硬件的状态。它可以是 “enabled” 或 “disabled”。 ...

2023年04月14日 · 2 分钟 · Cassius0924

MacOS 修改 App Store 和地图软件语言指南

在 macOS 系统设置中,我们可以轻松地设置软件的语言,但有些应用程序如 App Store 和 Maps 却无法直接在设置中修改语言。这可能会让我们在使用这些应用程序时感到困惑,尤其是当我们需要使用不同语言的应用程序时。 本文提供了一种简单的方法,让您能够修改 App Store 和 Maps 的语言设置,以便在需要时更轻松地使用这些应用程序。 修改方法修改苹果地图的语言为简体中文: sudo defaults write com.apple.Maps AppleLanguages '("zh-CN")' 修改 App Store 的语言为美式英语: sudo defaults write com.apple.AppStore AppleLanguages '("en-US")' 其他软件其他软件均可在系统设置里直接设置。 其他语言同理,其他语言只需修改命令最后的**「语言区域码」**即可。 语言名称 代码 中文(简体) zh-CN 中文(繁体) zh-TW 英语(美国) en-US 英语(英国) en-GB 日语 ja 法语 fr 德语 de 西班牙语 es 韩语 ko 俄语 ru 葡萄牙语(巴西) pt-BR 阿拉伯语 ar 意大利语 it 土耳其语 tr 印地语 hi 印尼语 id 荷兰语 nl 波兰语 pl 瑞典语 sv 丹麦语 da 芬兰语 fi 挪威语 no 希腊语 el

2023年04月14日 · 1 分钟 · Cassius0924

MacOS 配置 MASM + DOSBox 汇编环境

该文章旨在帮助在 MacOS 系统下想要学习汇编语言的开发者配置 MASM + DOSBox 环境。 配置步骤 克隆该项目到本地: git clone https://github.com/cassius0924/MASMForMac.git 将项目文件夹移动某个位置: 例如我将这个文件夹放到了 ~/Documents/中 mv MASMForMac ~/Documents/. 安装 DOSBox: 用 Finder 打开 MASMForMac/mac 目录,打开 dmg 安装包。再打开 Application 文件夹,将 DOSBox 应用程序拖入 Application 文件夹中。 在 DOSBox 中挂载目录: mount c ~/Documents/MASMForMac 此目录将会把~/Documents/MASMForMac挂载到 C 盘。路径根据自己情况修改。 每次打开 DOSBox 应用程序都需要挂载目录。可以配置自动挂载,详见下文**「配置文件」**。 在 DOSBox 中进入 C 盘: c: 编译 hello.asm 文件: 已经预先写好了一个hello.asm汇编测试示例,用于测试汇编环境。 masm hello.asm 连按三下回车,此命令会生成obj文件。 生成hello.exe可执行文件: link hello.obj 同样连按三下回车。 运行 hello.exe 文件: hello.exe 正常情况,会输出字符串:Hello world! ...

2023年04月12日 · 1 分钟 · Cassius0924

基于 Open3D C++ 版实现点云数据的配准、相加和显示

本文介绍如何使用 Open3D C++ 库来进行点云的配准、相加和可视化显示。Open3D 是一个开源的多维数据处理工具箱,支持点云、图像和三维几何等多种类型的数据处理和可视化。 点云读取使用 ReadPointCloud() 函数可以轻松读取 pcd 和 ply 点云文件: // 读取 pcd 和 ply 点云文件 auto source = std::make_shared<open3d::geometry::PointCloud>(); auto target = std::make_shared<open3d::geometry::PointCloud>(); open3d::io::ReadPointCloud("pcd-data/1.pcd", *source); open3d::io::ReadPointCloud("pcd-data/2.pcd", *target); // ply 文件同理 // open3d::io::ReadPointCloud("pcd-data/1.ply", *source); // open3d::io::ReadPointCloud("pcd-data/2.ply", *target); 点云上色为两份点云上上不同的颜色: source->PaintUniformColor({1, 0.706, 0}); // source 为黄色 target->PaintUniformColor({0, 0.651, 0.929});// target 为蓝色 点云配准使用 Open3D 提供的 RegistrationICP() 函数进行点云配准。代码如下: // 为两个点云分别进行outlier removal //auto processed_source = source->RadiusOutlierRemoval(16, 0.5); //auto processed_target = target->RadiusOutlierRemoval(16, 0.5); double threshold = 1.0; // 移动范围的阀值 Eigen::Matrix4d trans_init = Eigen::Matrix4d::Identity(); // 运行ICP配准 open3d::pipelines::registration::RegistrationResult reg_p2p; // 这一步会返回点云的变换矩阵 reg_p2p = open3d::pipelines::registration::RegistrationICP( *source, *target, threshold, trans_init, open3d::pipelines::registration::TransformationEstimationPointToPoint()); // 将点云依照输出的变换矩阵进行变换 source->Transform(reg_p2p.transformation_); 点云相加这一步很简单,使用重载运算符 += 将两份点云数据相加: ...

2023年04月10日 · 1 分钟 · Cassius0924

构建 Open3D 官方 Azure Kinect 示例时找不到 AzureKinect*** 的解决方法

此文章旨在帮助解决 C++ 版 Open3D 编译时找不到 AzureKinect 相关函数的问题。 问题描述在尝试构建官方Azure Kinect示例时(AzureKinectViewer.cpp、AzureKinectMKVReader.cpp和AzureKinectRecord.cpp)报错: [1/1] Linking CXX executable AzureKinectViewer FAILED: AzureKinectViewer : && /usr/bin/c++ CMakeFiles/AzureKinectViewer.dir/AzureKinectViewer.cpp.o -o AzureKinectViewer -L/usr/local/lib -L/usr/local/cuda/lib64 -Wl,-rpath,/usr/local/lib:/usr/local/cuda/lib64 /usr/lib/aarch64-linux-gnu/libk4a.so.1.4.1 /usr/local/lib/libOpen3D.so && : CMakeFiles/AzureKinectViewer.dir/AzureKinectViewer.cpp.o: In function `main': AzureKinectViewer.cpp:(.text+0x4fc): undefined reference to `open3d::io::AzureKinectSensor::ListDevices()' AzureKinectViewer.cpp:(.text+0x50c): undefined reference to `open3d::io::AzureKinectSensorConfig::AzureKinectSensorConfig()' AzureKinectViewer.cpp:(.text+0x75c): undefined reference to `open3d::io::AzureKinectSensor::AzureKinectSensor(open3d::io::AzureKinectSensorConfig const&)' AzureKinectViewer.cpp:(.text+0x76c): undefined reference to `open3d::io::AzureKinectSensor::Connect(unsigned long)' AzureKinectViewer.cpp:(.text+0x84c): undefined reference to `open3d::io::AzureKinectSensor::CaptureFrame(bool) const' AzureKinectViewer.cpp:(.text+0x93c): undefined reference to `open3d::io::AzureKinectSensor::~AzureKinectSensor()' AzureKinectViewer.cpp:(.text+0xb2c): undefined reference to `open3d::io::AzureKinectSensor::~AzureKinectSensor()' CMakeFiles/AzureKinectViewer.dir/AzureKinectViewer.cpp.o: In function `open3d::io::AzureKinectSensorConfig::~AzureKinectSensorConfig()': AzureKinectViewer.cpp:(.text._ZN6open3d2io23AzureKinectSensorConfigD2Ev[_ZN6open3d2io23AzureKinectSensorConfigD5Ev]+0xc): undefined reference to `vtable for open3d::io::AzureKinectSensorConfig' AzureKinectViewer.cpp:(.text._ZN6open3d2io23AzureKinectSensorConfigD2Ev[_ZN6open3d2io23AzureKinectSensorConfigD5Ev]+0x10): undefined reference to `vtable for open3d::io::AzureKinectSensorConfig' collect2: error: ld returned 1 exit status ninja: build stopped: subcommand failed. 这是因为安装Open3D时未开启Azure Kinect的支持选项。 ...

2023年04月08日 · 1 分钟 · Cassius0924

在 Chrome 中解锁 New Bing(Bing AI)

本文旨在帮助大家在 Chrome 中使用 New Bing(Bing AI)。 前几周,New Bing 的申请已经全面开放,无需等待,直接即可通过申请。但微软限制了 New Bing 只能在自家的 Edge 浏览器使用,对于我这种万年 Chrome 玩家就很苦恼,不习惯 Edge。 前提 你得能科学上网; 你已经通过 New Bing 的申请。 步骤没什么步骤,安装个 Chrome 插件即可。 安装 Bing Unchained 插件安装插件 Unchained 。 然后刷新一下Bing.com即可。

2023年04月08日 · 1 分钟 · Cassius0924

浅析 SSH 免密登录原理

SSH(Secure Shell)是一种网络协议,可以在不安全的网络中提供一种安全的加密通信方式。SSH 免密登录是指用户在登录远程主机时,无需输入密码即可完成登录,免去每次登录时输入密码的烦恼。这种方式既提高了用户的操作便捷性,又避免了使用简单密码的风险,极大地提高了登录的安全性。本文旨在以简单易懂的方式解释SSH免密登录的原理。 SSH免密登录原理非对称加密在了解SSH免密登录原理之前,我们需要先了解“非对称加密”。SSH 免密登录原理是基于非对称加密技术。 非对称加密就是指加密数据和解密数据用的是不同密钥,密钥分为加密密钥和解密密钥,将这样的两个密钥称为密钥对。 用户用加密密钥加密的数据只能用解密密钥才能解密,而且两个密钥相对独立,知道了其中的一个密钥,并不能计算出另一个密钥。因此我们可以公开其中的一个密钥,保密另一个密钥。公开的密钥称为公钥,不公开的密钥称为密钥。在 SSH 协议中加密密钥为公钥,解密密钥为私钥,这也被称为“公钥加密技术”。 因此,私钥应该妥善保管,防止泄露。如果私钥安全,那么 SSH 免密登录将是一种非常安全的登录方式。 除了提高操作便捷性和登录安全性之外,SSH 免密登录还可以减少用户输入密码的次数。这对于需要频繁登录远程主机的用户来说尤为重要。此外,SSH 免密登录还可以实现自动化脚本的编写和远程服务器的管理,从而提高工作效率。 总之,了解 SSH 免密登录的原理可以帮助用户更好地使用该功能,保证登录的安全性和便捷性。同时,用户在使用 SSH 免密登录时,也应该注意保护自己的私钥,避免私钥泄露,以确保登录的安全性。 不难猜到,与非对称加密相反的对称加密指的就是加密与解密用的是同一个密钥。此种加密方法安全性低。 免密登录流程 SSH免密登录原理基于公钥加密技术,具体步骤如下: 用户在本地生成id_rsa.pub公钥和id_rsa私钥; 命令:ssh-keygen 并且私钥只用于解密数据,公钥只用于加密数据。私钥只保存在本地,公钥复制一份到远程服务器上; 命令:ssh-copy-id 当用户通过SSH协议连接远程服务器时,会发送包含username的数据用于请求连接,服务器在接下来的操作中会使用与username相对应的公钥; 命令:ssh username@remote_host 服务器会生成一个随机数,称之为 Challenge,并将 Challenge 使用公钥加密后发送给用户; 用户使用私钥对 Challenge 进行解密; 再将解密后的数据再用 MD5 加密一遍发送回服务器; 服务器会对比原始 Chanllenge 的 MD5 值和用户发送过来的 MD5值,若一致则允许用户登录,否则拒绝登录。 使用方法 首先在本地生成一对公私钥,可以使用以下命令: ssh-keygen -t rsa 这个命令会在用户目录~下生成一个 .ssh 文件夹,里面包含私钥和公钥。 将公钥上传到远程服务器,可以使用以下命令: ssh-copy-id username@remote_host 其中,username为远程服务器的用户名,remote_host为远程服务器的IP地址或域名。 登录远程服务器时,可以使用以下命令: ssh username@remote_host 写在最后除了提高操作便捷性和登录安全性之外,SSH 免密登录还可以减少用户输入密码的次数。这对于需要频繁登录远程主机的用户来说尤为重要。此外,SSH 免密登录还可以实现自动化脚本(例如GitHub Actions)的编写和远程服务器的管理,从而提高工作效率。 ...

2023年03月28日 · 1 分钟 · Cassius0924