碰撞检测 | 基于ROS Rviz插件的多边形碰撞检测仿真平台

server/2024/10/18 9:24:18/

目录

  • 0 专栏介绍
  • 1 基于多边形的碰撞检测
  • 2 碰撞检测仿真平台搭建
    • 2.1 多边形实例
    • 2.2 外部服务接口
    • 2.3 Rviz插件化
  • 3 案例演示
    • 3.1 功能介绍
    • 3.2 绘制多边形

0 专栏介绍

🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线生成、碰撞检测、安全走廊、优化建模(QP、SQP、NMPC、iLQR等)、轨迹优化(梯度法、曲线法等),每个算法都包含代码实现加深理解

🚀详情:运动规划实战进阶:轨迹优化篇


1 基于多边形的碰撞检测

基于多边形的碰撞检测是游戏开发、物理模拟以及许多其他领域中的一个重要研究方向。在计算机图形学中,多边形是构建三维模型和场景的基本单位,多边形碰撞引擎有利于渲染优化、营造光照阴影和沙尘等效果。

自动驾驶机器人领域,多边形碰撞检测在保证规划控制安全性方面发挥了极大的作用。以自动驾驶系统为例,自车使用传感器(如激光雷达、摄像头、雷达等)来检测道路上的障碍物,识别和建模道路、车道线、交通标志等,在这个过程中,通常基于多边形构建障碍物的几何模型,并判断是否与车辆发生碰撞。

在这里插入图片描述

本文的目标就是搭建一个多边形构造仿真平台,为后续基于多边形的碰撞检测、TTC等算法提供验证环境

在这里插入图片描述

2 碰撞检测仿真平台搭建

2.1 多边形实例

本平台目前设计的多边形实例有:

  • 任意多边形
    在这里插入图片描述在这里插入图片描述
  • 矩形(支持任意角度)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
计划继续更新的实例包括:

  • N N N圆覆盖模型
  • 动态矩形
  • 动态圆形

2.2 外部服务接口

本文设计的仿真平台可以向外部程序提供多边形的具体信息,因此需要定义一个外部接口,这里采用自定义服务和消息的方式实现:

  1. 首先设计多边形请求服务

    ---
    PolygonStamped[] selection
    
  2. 接着设计多边形数据消息,包含头部帧和点数据

    # PolygonStamped.msg
    std_msgs/Header headerPolygon polygon
    
    # Polygon.msg
    geometry_msgs/Point32[] points
    

通过上述接口串连其多边形数据,再设置服务器响应外部请求即可

bool PolygonSimulation::_callback(GetSelection::Request& /*req*/, GetSelection::Response& res)
{res.selection.reserve(polygons_.size());for (const auto& polygon : polygons_){// Skip selections with fewer than 3 pointsif (polygon->size() < 3)continue;PolygonStamped polygon_stamped;polygon_stamped.header.frame_id = context_->getFixedFrame().toStdString();for (const Ogre::Vector3& pt : polygon->points()){geometry_msgs::Point32 msg;msg.x = pt.x;msg.y = pt.y;msg.z = pt.z;polygon_stamped.polygon.points.push_back(msg);}res.selection.push_back(polygon_stamped);}return true;
}

2.3 Rviz插件化

Rviz插件开发的详细教程详见:

  • ROS从入门到精通2-4:Rviz插件制作案例(以多点导航插件为例)
  • ROS2从入门到精通2-4:Rviz2插件制作案例(以工具栏和多点导航插件为例)

本文列举主要的步骤:

  1. 首先是CMakeLists.txt文件,因为Rviz实际上是采用QT开发的,所以和一般的ROS工程相比,要增加一些QT库的链接配置

    set(CMAKE_AUTOMOC ON)
    SET(CMAKE_PREFIX_PATH "/usr/lib/x86_64-linux-gnu/cmake")
    find_package(Qt5 COMPONENTS Core Gui Widgets UiTools REQUIRED)
    QT5_WRAP_CPP(QT_HEADERS ${MOC_HEADERS})
    set(QT_LIBRARIES Qt5::Widgets)....target_link_libraries(${PROJECT_NAME}${QT_LIBRARIES}${catkin_LIBRARIES}
    )
    
  2. package.xml中配置插件导出

    <?xml version="1.0"?>
    <package format="2"><name>polygon_selection</name><version>0.0.0</version><description>Rviz polygon simulation tool</description><maintainer email="913982779@qq.com">Winter</maintainer><license>TODO</license><buildtool_depend>catkin</buildtool_depend><depend>roscpp</depend><depend>pluginlib</depend><depend>geometry_msgs</depend><depend>actionlib_msgs</depend><depend>rviz</depend><depend>std_msgs</depend><depend>message_generation</depend><depend>message_runtime</depend><export><rviz plugin="${prefix}/polygon_simulation_plugin.xml"/></export>
    </package>
    
  3. 配置插件说明文件

    <library path="lib/libpolygon_simulation"><class name="polygon_simulation/PolygonSimulation" type="polygon_simulation::PolygonSimulation" base_class_type="rviz::Tool"><description>Rviz tool for collecting a polygon selection boundary</description></class>
    </library>
    

3 案例演示

3.1 功能介绍

通过Rviz2->Add New Tool添加Polygon Simulation插件

s
添加完毕后在Tool Properties面板可以看到Polygon Simulation插件的模板,其中Visualization是可视化属性,包括点的颜色大小、线的颜色、是否显示标记等;Polygon mode可以下拉选择采用哪种多边形实例

在这里插入图片描述

3.2 绘制多边形

以矩形为例,按住鼠标左键可以拉出一个矩形,在合适的位置松开,此时可以通过右侧面板的数值属性进行微调

在这里插入图片描述
比如我们调整一个45度的正方形出来

在这里插入图片描述
觉得满意后,点击鼠标右键确认绘图,产生标号

完整工程代码请联系下方博主名片获取


🔥 更多精彩专栏

  • ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

http://www.ppmy.cn/server/103948.html

相关文章

力控机器人torque-controlled robots

力控机器人&#xff08;Torque-Controlled Robots&#xff09;&#xff0c;也称为力矩控制机器人&#xff0c;是一种能够感知并实时控制施加在物体上力量的机器人系统。这类机器人通过集成力传感技术&#xff08;Force Sensing Technology&#xff09;和控制算法&#xff08;Co…

Unity XR Interaction Toolkit 踩坑记录

1&#xff1a;按下 grap/select 键 物品直接飞到手上 2 按下 grap/select 键 物品一点点的想自己移动

深度学习入门(E):逻辑回归与分类到底是啥关系?

逻辑回归与一般分类任务的区别 逻辑回归 本质上是回归&#xff1a;它实际上是一个回归模型&#xff0c;用于预测一个概率值&#xff08;即事件发生的概率&#xff09;。输出范围&#xff1a;逻辑回归的输出通过sigmoid函数限制在0和1之间&#xff0c;这表示了一个概率。应用场…

SpringBoot 设置传入参数非必要

查看 RequestParam 源码 package org.springframework.web.bind.annotation;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.an…

C语言-指针

1.什么是指针 指针是内存中一个最小单元的编号&#xff0c;也就是地址。&#xff08;内存的最小单位为1byte&#xff09;平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量。指针的大小在32位平台是4个字节&#xff0c;在64位平台是8个字…

C++拾趣——使用VSCode跨平台调试CMake编译的C/C++项目

大纲 远程连接编译调试安装插件/组件VSCode插件调试组件 配置CMakePresets.json配置CMake Tools调试 参考资料 VSCode的远程开发功能为开发者带来了诸多好处&#xff0c;极大地提升了开发效率和灵活性。首先&#xff0c;它允许开发者在本地编辑环境中直接连接到远程服务器或容器…

俄罗斯Yandex广告怎么做?Yandex ads广告搭建与效果优化设置指南

您可以在Yandex推广中使用移动应用广告来覆盖数百万搜索和Yandex广告网络受众&#xff0c;从而提高应用的盈利能力。为了获得最佳效果&#xff0c;请在设置广告系列时遵循我们的建议。 入门 在 Yandex Direct 中创建广告活动。转到营销活动向导 → 应用安装和应用内转化&…

数据结构-线性表-单链表

一、了解单链表 1. 单链表的定义 单链表是一种线性数据结构&#xff0c;由一系列节点构成&#xff0c;每个节点包含两个部分&#xff1a;数据域和指向下一个节点的指针。在单链表中&#xff0c;头指针指向第一个节点&#xff0c;最后一个节点的指针指向 NULL&#xff0c;表示链…