如何将曲面拟合到一组数据点并获得曲面方程

2023-12-11

乌班图 ROS 思维 Python程序

我正在尝试获取适合点云数据中的一组点的表面方程。数据来自激光雷达扫描仪。我在 rviz 中选择整个扫描的一部分,并获得该选择的坐标选定表面的图片。所选曲面并不总是如此线性,因为材质中可能存在轻微的曲线。我擅长数学和编程,所以任何想法都会很棒。我主要用python编程。我有每个点的 (X,Y,Z),并且我还有数组(x_array、y_array、z_array 等)中的 x、y 和 z 分隔的每个坐标值。我将附上我的测试程序的代码,以防有人想看看我是如何做的。它主要只是从 ROS 主题接收坐标数据,从十六进制转换为浮点值,然后将浮点组织到各种数组中。

#!/usr/bin/env python3
import rospy
from std_msgs.msg import String
from sensor_msgs.msg import PointCloud2
import struct
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from scipy.linalg import lstsq

my_data = 0
array_size = 0
point_size = 0 

def callback(data):
    global my_data
    global array_size
    global point_size
    my_data = data.data
    point_size = data.width
    print("Point Size: ", point_size)
    coord_array_size = (point_size*3)

    i = 1
    current_low = 0
    current_high = 0
    previous_high = 0

    current_hex_string = 0
    hex_string = my_data.hex()

    xyz_points_array = [0]* coord_array_size
    xyz_point_array_counter = 0

    x_point_array = [0]* point_size
    y_point_array = [0]* point_size
    z_point_array = [0]* point_size
    point_array_counter = 0

    while(i <= point_size):
        if(i == 1):
            current_low = 0
            current_high = 32
            previous_high = 32
            i += 1

            current_hex_string = hex_string[current_low:current_high]
            x_coord = x_point_array[point_array_counter] = xyz_points_array[0] = struct.unpack('f', bytes.fromhex(current_hex_string[0:8]))
            y_coord = y_point_array[point_array_counter] = xyz_points_array[1] = struct.unpack('f', bytes.fromhex(current_hex_string[8:16]))
            z_coord = z_point_array[point_array_counter] = xyz_points_array[2] = struct.unpack('f', bytes.fromhex(current_hex_string[16:24]))

            xyz_point_array_counter += 3
            point_array_counter += 1

        elif(i > 1):
            current_low = previous_high
            current_high = (previous_high + 32)
            previous_high = current_high
            i += 1

            current_hex_string = hex_string[current_low:current_high]
            x_coord = x_point_array[point_array_counter] =    xyz_points_array[xyz_point_array_counter] = struct.unpack('f', bytes.fromhex(current_hex_string[0:8]))
            y_coord = y_point_array[point_array_counter] = xyz_points_array[xyz_point_array_counter + 1] = struct.unpack('f', bytes.fromhex(current_hex_string[8:16]))
            z_coord = z_point_array[point_array_counter] = xyz_points_array[xyz_point_array_counter + 2] = struct.unpack('f', bytes.fromhex(current_hex_string[16:24]))

            xyz_point_array_counter += 3
            point_array_counter += 1

    #print("\nCoordinate Array: ", xyz_points_array)
    #print("\nX Coordinate Array: ", x_point_array)
    #print("\nY Coordinate Array: ", y_point_array)
    #print("\nZ Coordinate Array: ", z_point_array)

    #plotting
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.scatter(x_point_array, y_point_array, z_point_array, s = 1, c='blue')
    plt.xlabel('X Axis')
    plt.ylabel('Y Axis')
    #plt.zlabel('Z Axis')
    plt.show()


def listener_new():
    rospy.init_node('listener_new', anonymous=True)
    rospy.Subscriber("rviz_selected_points", PointCloud2, callback)
    rospy.spin()

if __name__ == '__main__':
    listener_new()

例如,您可以使用这段非常有趣的代码找到适合您的 3D 点的二次曲面。我修改了代码以仅考虑二阶情况。

The C数组由方程系数组成。

import numpy as np
import scipy.linalg
import matplotlib.pyplot as plt

# some 3-dim points
mean = np.array([0.0,0.0,0.0])
cov = np.array([[1.0,-0.5,0.8], [-0.5,1.1,0.0], [0.8,0.0,1.0]])
data = np.random.multivariate_normal(mean, cov, 50)

# regular grid covering the domain of the data
X,Y = np.meshgrid(np.arange(-3.0, 3.0, 0.5), np.arange(-3.0, 3.0, 0.5))
XX = X.flatten()
YY = Y.flatten()


# best-fit quadratic curve
A = np.c_[np.ones(data.shape[0]), data[:,:2], np.prod(data[:,:2], axis=1), data[:,:2]**2]
C,_,_,_ = scipy.linalg.lstsq(A, data[:,2])

# evaluate it on a grid
Z = np.dot(np.c_[np.ones(XX.shape), XX, YY, XX*YY, XX**2, YY**2], C).reshape(X.shape)

# plot points and fitted surface
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.2)
ax.scatter(data[:,0], data[:,1], data[:,2], c='r', s=50)
plt.xlabel('X')
plt.ylabel('Y')
ax.set_zlabel('Z')
ax.axis('auto')
ax.axis('tight')
plt.show()

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将曲面拟合到一组数据点并获得曲面方程 的相关文章

  • 如何使用 conda 在一行中安装多个包?

    我需要使用 conda 安装以下多个软件包 我不确定 conda forge 是什么 有些使用 conda forge 有些不使用它 是否可以将它们安装成一行而不需要一一安装 谢谢 conda install c conda forge d
  • pandas Wide_to_long 后缀参数

    我对在 pandas 中使用 Wide to long 时的参数有疑问 有一个参数叫suffix我不明白 在文档中它说 后缀 str 默认 d 捕获所需后缀的正则表达式 d 捕获数字后缀 没有数字的后缀可以用否定字符类 D 指定 您还可以进
  • 如何使用 Python 裁剪图像中的矩形

    谁能给我关于如何裁剪两个矩形框并保存它的建议 我已经尝试过这段代码 但效果不佳 import cv2 import numpy as np Run the code with the image name keep pressing spa
  • Python GTK + webkit - 在 gtk.main() 之后插入 JavaScript

    我在终端中尝试了这个 一切正常 但是如果我在脚本内运行这个 我无法在 gtk main 之后插入 JavaScript import gtk import webkit w gtk Window b webkit WebView w add
  • 以矢量化方式在另一个 DataFrame 中查找包含值子集的行

    如何匹配此 DataFrame 中的值source car id lat lon 0 100 10 0 15 0 1 100 12 0 10 0 2 100 09 0 08 0 3 110 23 0 12 0 4 110 18 0 32 0
  • Pandas 连接问题:列重叠但未指定后缀

    我有以下数据框 print df a mukey DI PI 0 100000 35 14 1 1000005 44 14 2 1000006 44 14 3 1000007 43 13 4 1000008 43 13 print df b
  • 组和平均 NumPy 矩阵

    假设我有一个任意的 numpy 矩阵 如下所示 arr 6 0 12 0 1 0 7 0 9 0 1 0 8 0 7 0 1 0 4 0 3 0 2 0 6 0 1 0 2 0 2 0 5 0 2 0 9 0 4 0 3 0 2 0 1 0
  • Python 的 mysqldb 晦涩文档

    Python 模块 mysqldb 中有许多转义函数 我不理解它们的文档 而且我努力查找它们也没有发现任何结果 gt gt gt print mysql escape doc escape obj dict escape any speci
  • 返回上个月的日期时间对象

    如果 timedelta 在它的构造函数中有一个月份参数就好了 那么最简单的方法是什么 EDIT 正如下面指出的那样 我并没有认真考虑这一点 我真正想要的是上个月的任何一天 因为最终我只会获取年份和月份 因此 给定一个日期时间对象 返回的最
  • 如何将类添加到 LinkML 中的 SchemaDefinition?

    中的图表https linkml io linkml model docs SchemaDefinition https linkml io linkml model docs SchemaDefinition and https link
  • 如何正确导入主代码和模块中同时使用的模块?

    假设我有一个主脚本 main py 它导入另一个 python 文件import coolfunctions另一个 import chores 现在 假设 Coolfunctions 也使用家务活中的东西 因此我声明import chore
  • 根据第三个变量更改散点图中的标记样式

    我正在处理多列字典 我想绘制两列 然后根据第三列和第四列更改标记的颜色和样式 我很难改变 pylab 散点图中的标记样式 我的方法适用于颜色 不幸的是不适用于标记样式 x 1 2 3 4 5 6 y 1 3 4 5 6 7 m k l l
  • 为什么 __instancecheck__ 没有被调用?

    我有以下 python3 代码 class BaseTypeClass type def new cls name bases namespace kwd result type new cls name bases namespace p
  • 在seaborn中对箱线图x轴进行排序

    我的数据框round data看起来像这样 error username task path 0 0 02 n49vq14uhvy93i5uw33tf7s1ei07vngozrzlsr6q6cnh8w 39 png 1 0 10 n49vq
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 线性同余生成器 - 如何选择种子和统计检验

    我需要做一个线性同余生成器 它将成功通过所选的统计测试 我的问题是 如何正确选择发电机的数字以及 我应该选择哪些统计检验 我想 均匀性的卡方频率测试 每代收集10 000个号码的方法 将 0 1 细分为10个相等的细分 柯尔莫哥洛夫 斯米尔
  • 更换壳牌管道[重复]

    这个问题在这里已经有答案了 在 subprocess 模块的 Python 2 7 文档中 我找到了以下片段 p1 Popen dmesg stdout PIPE p2 Popen grep hda stdin p1 stdout stdo
  • python dicttoxml 多次使用相同的键

    我正在尝试做如下所示的 xml
  • 在 HDF5 (PyTables) 中存储 numpy 稀疏矩阵

    我在使用 PyTables 存储 numpy csr matrix 时遇到问题 我收到此错误 TypeError objects of type csr matrix are not supported in this context so
  • Streamlabs API 405 响应代码

    我正在尝试使用Streamlabs API https dev streamlabs com Streamlabs API 使用 Oauth2 来创建应用程序 因此 首先我将使用我的应用程序的用户发送到一个授权链接 其中包含我的应用程序的客

随机推荐

  • Android WebViewClient 属性中的“isForMainFrame”请求是什么意思?

    What is isForMainFrame意思是 android 21 请求是否针对主框架 例如 对于 iframe 将为 false 不清楚 因为对于下面的日志 它返回false用于主框架请求 是不是一样isMainFrame在 and
  • 两个 Java 日期之间的天数差异?

    我想获得两个 Java Date 对象之间的差异 我使用过 Joda Time 库 但问题是我得到的天数差异比实际的天数差异更大 这是我的代码片段 DateFormat formatter new SimpleDateFormat mm d
  • 如何从列表框列表项中获取值

    在我的火狐插件中我有一个
  • 将 AM/PM 时间转换为 24 小时格式?

    我需要将 12 小时格式时间 上午 下午 转换为 24 小时格式时间 例如01 00 PM 至 13 00 使用 C 我该如何转换它 如果您需要将字符串转换为日期时间 您可以尝试 DateTime dt DateTime Parse 01
  • 如何从 Swift 打开邮件应用程序

    我正在开发一个简单的快速应用程序 用户输入电子邮件地址并按下打开邮件应用程序的按钮 并在地址栏中输入输入的地址 我知道如何在 Objective C 中执行此操作 但在 Swift 中无法使其工作 您可以使用简单的 mailto iOS 中
  • 嵌入 Maven 3

    除了 m2eclipse 源之外 是否有关于该主题的任何类型的文档 谢谢 杰巴鲁克 据我所知 文档Maven 嵌入器仍有待创建 是的 Maven 3 0 xJason 创建的页面确实提到了旧文档的链接 但 Jason 后来在MNG 3658
  • 为什么我可以在“res.send”之后执行代码?

    我想知道以下代码行为背后的机制是什么 res send 200 data test data console log still here 我的理解是res send不return该功能 但确实关闭连接 结束请求 这可以解释为什么我仍然可以
  • 无权执行 sts:AssumeRoleWithWebIdentity AWS s3 Cognito 身份验证失败

    我有一个简单的 iOS 应用程序 可以上传到 s3 我正在尝试各种 unauth 尽管理想情况下我想做 Facebook 2 个 IAM 角色 使用向导创建 IAM 身份验证策略 对于 unauth 角色 Version 2012 10 1
  • jQuery 根据选择选项保持显示隐藏状态

    我根据下拉列表中选择的选项下拉选择并显示隐藏其他字段 在 div 内 此代码工作正常并根据选择显示隐藏 但当我加载页面时 所有字段都是可见的 其他事情是 例如 如果我想在选择选项 2 的情况下显示字段并将该选项保存到数据库 并且在重新加载页
  • Powershell .替换正则表达式

    用于替换的正则表达式让我大吃一惊 我正在尝试寻找 值 COM8 gt 在文本文件中并将 COM8 替换为另一个 com 端口 即 COM9 COM13 等 Get Content C Path File config Replace COM
  • 获取列中最常见的 10 个名称

    我一直在努力想出一个能够提取列中出现频率最高的 10 个名称并将它们存储到数组中以供进一步使用的程序 将列的值收集到数组中以加快处理速度 转移到字典的键 频率作为每个键的项目 工作表的 Large 可以轻松找到第 10 大频率 删除任何频率
  • 创建单元测试用例时 PHPUnit 错误

    我有控制器类 UserController 在控制器文件夹中 扩展BaseController 存在于应用程序文件夹中 当我右键单击并选择选项时 Create PHPUnitTests 它给了我以下错误 phpunit Fatal erro
  • 如何检查 @patched-out python 方法是否被调用而不改变其行为?

    我一直在使用Pythonmock我的测试用例的模块 我经常用以下内容装饰我的测试用例 patch my method 装饰师 然后在测试用例的主体中 我设置了 return value属性或 side effect修补方法上的属性来模拟其行
  • 为什么 document.GetElementById 返回 null [重复]

    这个问题在这里已经有答案了 我一直在使用document GetElementById 成功了 但从一段时间开始我就无法让它再次工作了 看下面的代码 div div
  • 从 JavaScript 中的图像读取像素数据会返回半透明像素的意外结果

    我正在 JavaScript 中从 png 文件读取 RGBA 数据 为此 我在画布上绘制图像并使用 getImageData 数据与我的预期不同 测试图像 https raw githubusercontent com FlorianLu
  • “无法获取文档,因为客户端处于离线状态”Firestore 模拟器出现 Firebase 错误

    编辑 我知道这是模拟器的问题 因为没有模拟器它也能正常工作 我正在关注一个Next js 课程我正在使用 Firebase 模拟器 它建议这样做 但没有教程 因为它非常简单 并且我正在尝试为用户从 firestore 读取一些数据 但它总是
  • iOS 中的 Opengl ES 1.x 发光效果

    我目前正在开发一款 iOS 游戏 现在我想要的是一个用opengl绘制任意发光和半透明椭圆的函数 这有点棘手 因为我使用的是 cocos2d 1 1 它不支持 opengl es 2 0 所以没有着色器 这是我所做的 首先是绘制挤出线的函数
  • 意外的无符号整数行为

    我在以下代码中遇到了这种意外的输出 其中我正在验证当所有位都设置为 1 时 short 和 int 类型的无符号形式的最大值 以十进制形式表示 include
  • TypeError: __array__() 采用 1 个位置参数,但给出了 2 个(图像分类 Keras)

    如何解决这个问题 我尝试过设置dtype None in the image img to array method import tensorflow as tf from tensorflow import keras from ten
  • 如何将曲面拟合到一组数据点并获得曲面方程

    乌班图 ROS 思维 Python程序 我正在尝试获取适合点云数据中的一组点的表面方程 数据来自激光雷达扫描仪 我在 rviz 中选择整个扫描的一部分 并获得该选择的坐标选定表面的图片 所选曲面并不总是如此线性 因为材质中可能存在轻微的曲线