我的Linux与ROS的不眠不休:从入门到入土(三)——hellow,ROS

2023-05-16

一、ROS回顾

没啥好回顾的。

ros操作简单又功能强大(百度这么说的),但学起来也没那么容易。

二、Hellow,ROS

上一篇说过,ROS程序员需要写的程序,其实就是创造节点。那么,怎么样写,写在哪里?需要先了解一些概念。

1、工作空间

ros的工作空间基本可以看作是工程项目了。工作空间下,装载着这个项目需要的依赖包,头文件,执行文件,代码等等文件。可以通过一个树状分级了解一下。

        想要通过ROS建立一个机器人,首先建立一个机器人项目文件,也就是工作空间。工作空间下,又3个文件,分别是build,装着依赖包,库文件等杂七杂八的底层依赖的地方,devel,装着环境配置文件的地方,src,装功能包的地方。除了src,其余两个很少打交道。

        当一个机器人项目被创建,就要开始构思机器人的功能了,ROS提供了功能包这一个概念,意思是,完成这一个功能的代码,都放在这个文件下就好了。

当一个功能包被创建,在其下方也存在一个src文件夹,代码就放在这个src文件夹下。

2、在ROS中,输出hellow_word

        首先,创建一个机器人项目,也就是工作空间 //在~下

mkdir -p wsp_hellow_ros/src

        在工作空间下,与src文件夹同级的目录,使用命令//在wsp_hellow_ros下

catkin_make

        这时候,cmake工具会自动创建需要的环境与依赖,生成build和devel文件。同时src下也有一个.txt文件,是用来负责编译环境配置,库连接等等工作的。

        创建一个功能包 //在src下

catkin_create_pkg hellow_ros cpp

        参数1为功能包名,参数二为功能包所需依赖。 创建完后,src下应有一个文件夹hellow_ros,同时该文件夹下存在2个文件夹,2个txt文件。

        来到功能包下的src,创建一个节点Node,实际上就是开始写程序了。创建一个cpp文件,建议文件名与希望生成的节点名相同。

        程序如下:

#include<ros/ros.h>
#include<iostream>

using namespace std;

int main(int argc,char*argv[] )
{
  ros::init(argc,argv,"printf_hellow"); //创建一个节点,名为printf_hellow
  
  while(ros::ok())
  {
     ROS_INFO("hellow,ROS!");
     sleep(1);//等待1s
  
  }	


}

        c++程序是需要编译才能运行的,通过cmake工具编译,要将编译的文件目标导入功能包下src里的CMake....txt下,不是工程下的src哦。

        编辑CMake.txt文件添加这两句。

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

        这两句实际上在文件里是有原型的,他们的意思也简单易懂。

        add_executable就是为目标文件生成 .exe的执行文件,第一个参数是,生成执行文件的名字。第二个参数是,想要编译的文件的路径。

        target_link_libraries则为生成的  .exe文件提供库的支持。二者必不可少。

        最终回到工作空间目录。catkin_make一下。

        

打开终端,运行roscore

打开另一个终端,rosrun功能包下的执行文件,就能看见输出的hellow_ros

 

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

我的Linux与ROS的不眠不休:从入门到入土(三)——hellow,ROS 的相关文章

  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 在 Linux 上以编程方式设置 DNS 名称服务器

    我希望能够通过我的 C C 程序为 Linux 上的 DNS 名称服务器添加 IP 地址 我在一个带有只读 etc resolv conf 的嵌入式平台上 这意味着我不能简单地将 nameserver xxx xxx xxx xxx 行添加
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • .net-core:ILDASM / ILASM 的等效项

    net core 是否有相当于 ILDASM ILASM 的功能 具体来说 我正在寻找在 Linux 上运行的东西 因此为什么是 net core ildasm 和 ilasm 工具都是使用此存储库中的 CoreCLR 构建的 https
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • Mac OS X 上的 /proc/self/cmdline / GetCommandLine 等效项是什么?

    如何在不使用 argc argv 的情况下访问 Mac OS X 上的命令行 在 Linux 上 我会简单地阅读 proc self cmdline or use GetCommandLine在 Windows 上 但我找不到 Mac OS
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • Linux/POSIX:为什么 fork() 不分叉*所有*线程

    众所周知 POSIX下创建新进程的默认方式是使用fork 在 Linux 下 这在内部映射到clone 我想知道的是 众所周知 当一个人打电话时fork 子进程是用单个线程创建的 调用的线程fork cf https linux die n
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序

随机推荐