ROS-Tutorials:rviz之Markers: Sending Basic Shapes (C++,附vscode调试说明)

2024-03-15 22:32

本文主要是介绍ROS-Tutorials:rviz之Markers: Sending Basic Shapes (C++,附vscode调试说明),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

官方的教程在这里:rviz/Tutorials/Markers: Basic Shapes - ROS Wikihttps://wiki.ros.org/rviz/Tutorials/Markers%3A%20Basic%20Shapes

我自己在ubuntu20.04上运行时碰到了一些问题,所以记录一下,

mkdir -p prj001/src
cd prj002/src
catkin_create_pkg using_markers roscpp visualization_msgs

这时候会生成下面这样的目录结构:

~/prj001/src/using_markers/src
~/prj001/src/using_markers/include
~/prj001/src/using_markers/CMakeLists.txt

然后建立一个叫basic_shapes.cpp的文件,放在这里,

~/prj001/src/using_markers/src/basic_shapes.cpp

文件内容如下,

#include <ros/ros.h>
#include <visualization_msgs/Marker.h>int main( int argc, char** argv )
{ros::init(argc, argv, "basic_shapes");ros::NodeHandle n;ros::Rate r(1);ros::Publisher marker_pub = n.advertise<visualization_msgs::Marker>("visualization_marker", 1);// Set our initial shape type to be a cubeuint32_t shape = visualization_msgs::Marker::CUBE;while (ros::ok()){visualization_msgs::Marker marker;// Set the frame ID and timestamp.  See the TF tutorials for information on these.marker.header.frame_id = "my_frame"; //<------------注意这里有改动marker.header.stamp = ros::Time::now();// Set the namespace and id for this marker.  This serves to create a unique ID// Any marker sent with the same namespace and id will overwrite the old onemarker.ns = "basic_shapes";marker.id = 0;// Set the marker type.  Initially this is CUBE, and cycles between that and SPHERE, ARROW, and CYLINDERmarker.type = shape;// Set the marker action.  Options are ADD, DELETE, and new in ROS Indigo: 3 (DELETEALL)marker.action = visualization_msgs::Marker::ADD;// Set the pose of the marker.  This is a full 6DOF pose relative to the frame/time specified in the headermarker.pose.position.x = 0;marker.pose.position.y = 0;marker.pose.position.z = 0;marker.pose.orientation.x = 0.0;marker.pose.orientation.y = 0.0;marker.pose.orientation.z = 0.0;marker.pose.orientation.w = 1.0;// Set the scale of the marker -- 1x1x1 here means 1m on a sidemarker.scale.x = 1.0;marker.scale.y = 1.0;marker.scale.z = 1.0;// Set the color -- be sure to set alpha to something non-zero!marker.color.r = 0.0f;marker.color.g = 1.0f;marker.color.b = 0.0f;marker.color.a = 1.0;marker.lifetime = ros::Duration();// Publish the markerwhile (marker_pub.getNumSubscribers() < 1){if (!ros::ok()){return 0;}ROS_WARN_ONCE("Please create a subscriber to the marker");sleep(1);}marker_pub.publish(marker);// Cycle between different shapesswitch (shape){case visualization_msgs::Marker::CUBE:shape = visualization_msgs::Marker::SPHERE;break;case visualization_msgs::Marker::SPHERE:shape = visualization_msgs::Marker::ARROW;break;case visualization_msgs::Marker::ARROW:shape = visualization_msgs::Marker::CYLINDER;break;case visualization_msgs::Marker::CYLINDER:shape = visualization_msgs::Marker::CUBE;break;}r.sleep();}
}

要特别注意"/my_frame"被我改成了"my_frame",主要原因是新的tf不再支持原来的命名方式。如果不改的话rviz会报错:

Invalid argument "/my_frame" passed to canTransform argument source_frame in tf2 frame_ids cannot start with a '/' like

同时basic_shapes也会提示:

please create a subscriber to the marker 

然后,CMakeLists.txt之中要添加下面这两句

add_executable(basic_shapes src/basic_shapes.cpp)
target_link_libraries(basic_shapes ${catkin_LIBRARIES})

这样,准备好之后就可以按官方的操作编译了,

$ cd ~/prj001/
$ catkin_make

rosmake rviz

完成后分别打开三个terminal,在每个terminal中要记得source devel/setup.bash

roscore
rosrun using_markers basic_shapes
rosrun rviz rviz

最后就可以看到输出的图像了。

VSCode调试说明

参考: 

Ubuntu20.04+vscode快速调试ROS通用程序_tanmx219的博客-CSDN博客(PlaceHolder.....)这里假设你已经安装好了ROS noetic和git。(1) 安装vscode和extensionsubuntu上如何安装vscode可以参考官网,Running Visual Studio Code on Linux需要安装的vscode扩展如下,C/C++ (c++ intellisense and configuration help) -> MandatoryClangd (Alternative intellisense provhttps://blog.csdn.net/tanmx219/article/details/122799015

快捷键ctrl+shift+p,找到C/C++ :Edit configurations (JSON),添加c_cppproperties.json文件,这个文件应该是指定一些路径和语言标准,如下,

c_cpp_properties.json

{"configurations": [{"browse": {"databaseFilename": "${workspaceFolder}/.vscode/browse.vc.db","limitSymbolsToIncludedHeaders": false},"includePath": ["/opt/ros/noetic/include/**","/home/matthew/projects/prj001/src/using_markers/include/**","/usr/include/**"],"name": "ROS","intelliSenseMode": "gcc-x64","compilerPath": "/usr/bin/gcc","cStandard": "c11","cppStandard": "c++14","configurationProvider": "ms-vscode.cmake-tools"}],"version": 4
}

快捷键ctrl+shift+p,找到Tasks:Configure Task,添加tasks.json文件,这个文件指定一些catkin_make的编译参数。

注意这里的定义"-DCMAKE_BUILD_TYPE=Debug", 

tasks.json

{"tasks": [{"type": "shell","label": "prerun","command": "source ./devel/setup.sh && export ROS_MASTER_URI=http://localhost:11311/",            },{"type": "shell","label": "catkin_make","command": "catkin_make","args": ["--directory","~/projects/prj001/","-DCMAKE_BUILD_TYPE=Debug"],"options": {"cwd": "${fileDirname}"},"problemMatcher": ["$msCompile"],"group": "build","detail": "调试器生成的任务。"},{"label": "Build","dependsOn": ["catkin_make","prerun"]}],"version": "2.0.0"
}

launch.json

{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "basic_shapes","type": "cppdbg","request": "launch","program": "${workspaceFolder}/devel/lib/using_markers/basic_shapes","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "catkin_make","miDebuggerPath": "/usr/bin/gdb"}]
}

附加说明

如果需要在launch之前运行tasks.json里的任务,就可以加上preLaunchTask这一条,比如这里tasks.json里有一个名字叫"catkin_make",可以通过

"preLaunchTask": "catkin_make"

这样的语句使程序在启动前都编译一次源码。

这样,启动vscode,选择basic_shapes,就可以调试源码了。

 

这篇关于ROS-Tutorials:rviz之Markers: Sending Basic Shapes (C++,附vscode调试说明)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813460

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、