当前位置: 首页 > news >正文

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

目录

  • 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.lryc.cn/news/429907.html

相关文章:

  • nginx实验
  • 新技术能够区分真实照片和 AI 伪造图片,但为何平台没有使用?|TodayAI
  • 测量 Redis 服务器的固有延迟
  • 【JVM】JVM内存模型与操作系统内存模型(一)
  • 构建基于LLM的应用程序——为您的应用程序选择合适的LLM
  • raksmart站群服务器多IP配置要求
  • 【Web IDE】WebContainer容器在浏览器中启动运行nodejs并使用vite启动项目
  • Linux 多线程
  • C语言编写三子棋游戏:从概念到思路到实现
  • React.js如何使用Bootstrap
  • 深入解析:Redis与Nacos分布式锁在业务中的具体应用
  • MySQL索引的性能优化
  • 协方差详解及在日常生活中的应用实例——天气温度与冰淇淋销量的关系
  • Spring Boot3.3.X整合Mybatis-Plus
  • 快速了解软件测试——测试用例的方法
  • 多线程、多进程,还是异步?-- Python 并发 API 如何选择
  • 汽车服务管理系统 _od8kr
  • 带你玩转小程序推广,实现短链接一键跳转
  • OpenDDS的Rtps_Udp传输协议可靠性QoS收发基本流程
  • 体育数据API纳米奥运会数据API:高阶数据包接口文档API示例⑦
  • 【中项第三版】系统集成项目管理工程师 | 第 15 章 组织保障
  • 数据结构——顺序栈和链式栈
  • PHP轻创推客集淘客地推任务平台于一体的综合营销平台系统源码
  • three.js实现 加载3dtiles ,瓦片 ,倾斜摄影,功能
  • Qt QTextEdit调用append数据重复的问题
  • 数学基础(二)
  • Java设计模式原则及中介者模式研究
  • logstash入门学习
  • 【代码】Swan-Transformer 代码详解(待完成)
  • iframe.contentDocument 和document.documentElement的区别