ROS程序设计系列 - 5.实例helloworld

2024-09-05 08:52

本文主要是介绍ROS程序设计系列 - 5.实例helloworld,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ROS程序设计系列 - 5.实例helloworld

  • 1. 源由
  • 2. 步骤
    • Step 1:安装ROS系统
    • Step 2:创建框架工程
    • Step 3:检查工程结构
    • Step 4:创建CPP文件
    • Step 5:修改配置文件
    • Step 6:编译工程
  • 3. 测试
    • Step 1: 启动ROS Core
    • Step 2: 启动Hello程序
  • 4. 总结
  • 5. 参考资料
  • 6. 补充

1. 源由

在做《Ardupilot开源飞控之FollowMe验证平台搭建》时,涉及到MAVLinkVINS-Monoego-Planner的消息转换问题。

为此,我们结合前面关于ROS的编程的基础知识,完成uav_mavlink框架工程。

  • 【1】ROS程序设计系列 - 1.ROS介绍
  • 【2】ROS程序设计系列 - 2.ROS Package
  • 【3】ROS程序设计系列 - 3.ROS Tools
  • 【4】ROS程序设计系列 - 4.ROS Programming

2. 步骤

Step 1:安装ROS系统

略,详见:Linux 35.5 + JetPack v5.1.3@ros-noetic安装

Step 2:创建框架工程

$ cd ~
$ mkdir -p catkin_ws/src
$ cd catkin_ws/src
$ catkin_create_pkg  hello std_msgs  roscpp  rospy
Created file hello/package.xml
Created file hello/CMakeLists.txt
Created folder hello/include/hello
Created folder hello/src
Successfully created files in /home/daniel/catkin_ws/src/hello. Please adjust the values in package.xml.

Step 3:检查工程结构

此时没有任何代码文件,仅仅一个hello工程。

$ tree catkin_ws/
catkin_ws/
└── src└── hello├── CMakeLists.txt├── include│   └── hello├── package.xml└── src5 directories, 2 files

Step 4:创建CPP文件

创建hello.cpp,并打印"hello,ROS!"

$ cd ~/catkin_ws/src/hello/src
$ vi hello.cpp
$ cat hello.cpp
#include<ros/ros.h>int main(int argc,char **argv){   ros::init(argc,argv,"hello_ros");   ros::NodeHandle nh;   ROS_INFO_STREAM("hello,ROS!");}

Step 5:修改配置文件

鉴于创建应用程序,需要设置可执行代码和编译链接。

vi CMakeLists.txt修改下面两行代码:

  1. add_executable(${PROJECT_NAME} src/hello.cpp)
  2. target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES})

Step 6:编译工程

$ cd ~/catkin_ws
$ $ catkin_make
Base path: /home/daniel/catkin_ws
Source space: /home/daniel/catkin_ws/src
Build space: /home/daniel/catkin_ws/build
Devel space: /home/daniel/catkin_ws/devel
Install space: /home/daniel/catkin_ws/install
####
#### Running command: "cmake /home/daniel/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/daniel/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/daniel/catkin_ws/install -G Unix Makefiles" in "/home/daniel/catkin_ws/build"
####
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using CATKIN_DEVEL_PREFIX: /home/daniel/catkin_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/noetic
-- This workspace overlays: /opt/ros/noetic
-- Found PythonInterp: /usr/bin/python3 (found suitable version "3.8.10", minimum required is "3")
-- Using PYTHON_EXECUTABLE: /usr/bin/python3
-- Using Debian Python package layout
-- Found PY_em: /usr/lib/python3/dist-packages/em.py
-- Using empy: /usr/lib/python3/dist-packages/em.py
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/daniel/catkin_ws/build/test_results
-- Forcing gtest/gmock from source, though one was otherwise available.
-- Found gtest sources under '/usr/src/googletest': gtests will be built
-- Found gmock sources under '/usr/src/googletest': gmock will be built
-- Found PythonInterp: /usr/bin/python3 (found version "3.8.10")
-- Found Threads: TRUE
-- Using Python nosetests: /usr/bin/nosetests3
-- catkin 0.8.10
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~  traversing 1 packages in topological order:
-- ~~  - hello
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'hello'
-- ==> add_subdirectory(hello)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/daniel/catkin_ws/build
####
#### Running command: "make -j6 -l6" in "/home/daniel/catkin_ws/build"
####
Scanning dependencies of target hello
[ 50%] Building CXX object hello/CMakeFiles/hello.dir/src/hello.cpp.o
[100%] Linking CXX executable /home/daniel/catkin_ws/devel/lib/hello/hello
[100%] Built target hello

3. 测试

Step 1: 启动ROS Core

启动一个ssh终端,执行以下命令:

$ cd ~/catkin_ws
$ source devel/setup.bash
$ roscore
... logging to /home/daniel/.ros/log/ac6ae1f0-6a8d-11ef-a182-200b7460c5b7/roslaunch-daniel-nvidia-15800.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.started roslaunch server http://daniel-nvidia:38431/
ros_comm version 1.16.0SUMMARY
========PARAMETERS* /rosdistro: noetic* /rosversion: 1.16.0NODESauto-starting new master
process[master]: started with pid [15808]
ROS_MASTER_URI=http://daniel-nvidia:11311/setting /run_id to ac6ae1f0-6a8d-11ef-a182-200b7460c5b7
process[rosout-1]: started with pid [15818]
started core service [/rosout]

Step 2: 启动Hello程序

启动一个ssh终端,执行以下命令:

$ cd ~/catkin_ws
$ source devel/setup.bash
$ rosrun hello hello
[ INFO] [1725434226.570962424]: hello,ROS!

4. 总结

上述方式就是类似《Linux应用程序之Helloworld入门》的第一步。

希望上述简单例程能够为后续uav_mavlink代码建立一个基础框架。

$ tree catkin_ws/
catkin_ws/
└── src└── hello├── CMakeLists.txt├── include│   └── hello├── package.xml└── src└── hello.cpp

注:示例代码下载链接。

5. 参考资料

【1】ROS程序设计系列 - 1.ROS介绍
【2】ROS程序设计系列 - 2.ROS Package
【3】ROS程序设计系列 - 3.ROS Tools
【4】ROS程序设计系列 - 4.ROS Programming

6. 补充

如果对ROS编程想进一步深入,可以考虑看下笔者正在进行的一个简单mavlink桥接的代码(从CPP转换到ROS工程,并进行适当的灵活配置和代码重构)。

  • uav_mavlink

在这里插入图片描述

这篇关于ROS程序设计系列 - 5.实例helloworld的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(