ROS机器人开发实践学习笔记3

摘要:
一、创建并配置工作空间工作空间是存放工程开发相关文件的文件夹,现在较新版本的ROS默认使用catkin编译系统,该编译系统的空间比较特殊,所以需要特殊的方式创建。

摘要: 刚刚开始学习ROS,打算入机器人的坑了,参考教材是《ROS及其人开发实践》胡春旭编著 机械工业出版社 华章科技出品。本来以为可以按照书上的步骤一步步来,但是,too young to simple啊,程序员的苦逼日子开始了,特地记录如下。

今天居然发现,不是linux没有安装成功,只是没有办法找到boot/efi下的引导文件,充分利用Manjaro • 18.1.0-rc6的u盘启动选项detect efi功能就可以实现U盘引导硬盘上的系统的功能了,也不错,居然还有这样操作哈哈。

一、创建并配置工作空间(workspace)

工作空间是存放工程开发相关文件的文件夹,现在较新版本的ROS默认使用catkin编译系统,该编译系统的空间比较特殊,所以需要特殊的方式创建。

1、创建工作空间

mkdir -p ~/catkin_ws/src                   #在home目录下创建两级目录,先创建catkin目录,再创建src目录,必须使用-p选项

cd ~/catkin_ws/src                      #切换到src目录

catkin_init_workspace                     #初始化工作空间

2、编译工作空间,此时工作空间为空,经过编译会生成很多文件,严格来说是迁移来很多文件

cd ~/catkin_ws/

catkin_make                        #catkin自己的编译命令

3、初始化环境变量,使环境变量生效

source devel/setup.bash                   #其实就是运行编译生成的devel目录下的setup.bash文件

4、验证环境变量是否有效

echo $ROS_PACKAGE_PATH                 #打印当前工作空间的路径,结果如下:,包括刚刚创建的工作空间的目录就对了,否则,要好好找找原因了。

municationk@developk:~/catkin_ws$ echo $ROS_PACKAGE_PATH
/home/municationk/catkin_ws/src:/opt/ros/melodic/share

二、在工作空间创建功能包,ROS系统的实现主要靠功能包实现各个功能

功能包中包含了许多文件和配置信息及编译信息等,现在较新版本的ROS默认使用catkin编译系统,该编译系统对功能包要求比较特殊,所以需要特殊的方式创建。

1、创建功能包,应用catkin_create_pkg命令

cd ~/catkin_ws/src                      #切换到代码空间,也就是工作空间的src目录

catkin_create_pkg learning_com std_msgs rospy roscpp    #创建功能包,并指定有三个功能包依赖

2、再次编译工作空间,并设置环境变量

cd ~/catkin_ws/

catkin_make                        #编译

source devel/setup.bash                  #设置环境变量

三、在工作空间创建功能包,实现一个简单的发布、订阅程序:主要是添加两个cpp源码talker.cpp和listener.cpp,修改一个编译配置文件CMakeList.txt,修改一个功能包配置文件package.xml文件

1、talker.cpp在工作空间的代码空间的功能包的代码空间中,本文中为:~/catkin_ws/src/learning_com/src/目录中,内容

  1 /**
  2  * 该例程将发布chatter话题,消息类型String
  3  */
  4 
  5 #include <sstream>
  6 #include "ros/ros.h"
  7 #include "std_msgs/String.h"
  8 
  9 int main(int argc, char **argv)
 10{
 11     //ROS节点初始化
 12     ros::init(argc, argv, "talker");
 13 
 14     //创建节点句柄
 15ros::NodeHandle n;
 16 
 17     //创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
 18     ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);      
 19 
 20     //设置循环的频率
 21     ros::Rate loop_rate(10);
 22 
 23     int count = 0;
 24     while(ros::ok())
 25{
 26         //初始化std_msgs::String类型的消息
 27std_msgs::String msg;
 28std::stringstream ss;
 29         ss << "hello world " <<count;
 30         msg.data =ss.str();
 31 
 32         //发布消息
 33         ROS_INFO("%s", msg.data.c_str());
 34chatter_pub.publish(msg);
 35 
 36         //循环等待回调函数
 37ros::spinOnce();
 38 
 39         //按照循环频率延时
 40loop_rate.sleep();
 41         ++count;
 42}
 43 
 44     return 0;
 45 }

2、listener.cpp在工作空间的代码空间的功能包的代码空间中,本文中为:~/catkin_ws/src/learning_com/src/目录中,内容

  1 /**                                                                           
  2  * 该例程将订阅chatter话题,消息类型String
  3  */
  4 
  5 #include "ros/ros.h"
  6 #include "std_msgs/String.h"
  7 
  8 //接收到订阅的消息后,会进入消息回调函数
  9 void chatterCallback(const std_msgs::String::ConstPtr&msg)
 10{
 11     //将接收到的消息打印出来
 12     ROS_INFO("I heard: [%s]", msg->data.c_str());
 13}
 14 
 15 int main(int argc, char **argv)
 16{
 17     //初始化ROS节点
 18     ros::init(argc, argv, "listener");
 19 
 20     //创建节点句柄
 21ros::NodeHandle n;
 22 
 23     //创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
 24     ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
 25 
 26     //循环等待回调函数
 27ros::spin();
 28 
 29     return 0;
 30 }

3、CMakeList.txt在工作空间的代码空间的功能包的代码空间中,本文中为:~/catkin_ws/src/learning_com/目录中,内容

  1 cmake_minimum_required(VERSION 2.8.3)                                                                                                                                           
  2project(learning_com)
  3 
  4 ## Compile as C++11, supported inROS Kinetic and newer
  5 # add_compile_options(-std=c++11)
  6 
  7## Find catkin macros and libraries
  8 ## ifCOMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
  9 ## isused, also find other catkin packages
 10find_package(catkin REQUIRED COMPONENTS
 11roscpp
 12rospy
 13std_msgs
 14)
 15 
 16## Specify additional locations of header files
 17## Your package locations should be listed before other locations
 18include_directories(
 19include
 20${catkin_INCLUDE_DIRS}
 21)
 22 
 23 ## Declare a C++library
 24# add_library(${PROJECT_NAME}
 25 #   src/${PROJECT_NAME}/learning_communication.cpp
 26# )
 27 
 28 add_executable(talker src/talker.cpp)
 29target_link_libraries(talker ${catkin_LIBRARIES})
 30add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
 31 
 32 add_executable(listener src/listener.cpp)
 33target_link_libraries(listener ${catkin_LIBRARIES})
 34add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
 35 
 36 ## Mark other files forinstallation (e.g. launch and bag files, etc.)
 37# install(FILES
 38#   # myfile1
 39#   # myfile2
 40#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
 41# )
 42 
 43#############
 44## Testing ##
 45#############
 46 
 47## Add gtest based cpp test target and link libraries
 48 # catkin_add_gtest(${PROJECT_NAME}-test test/test_learning_communication.cpp)
 49 # if(TARGET ${PROJECT_NAME}-test)
 50 #   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
 51# endif()
 52 
 53## Add folders to be run by python nosetests
 54# catkin_add_nosetests(test)
~                                                   

实际的内容更多,只需要关注:1,2,10~14,18~21,28~34这些行就够了

4、package.xml在工作空间的代码空间的功能包的代码空间中,本文中为:~/catkin_ws/src/learning_com/目录中,内容

  1 <?xml version="1.0"?>2 <package format="2">3   <name>learning_com</name>4   <version>0.0.0</version>5   <description>The learning_communication package</description>6 
  7   <maintainer email="municationk@todo.todo">municationk</maintainer>8 
  9   <license>TODO</license>10 
 11   <buildtool_depend>catkin</buildtool_depend>12   <build_depend>roscpp</build_depend>13   <build_depend>rospy</build_depend>14   <build_depend>std_msgs</build_depend>15   <build_export_depend>roscpp</build_export_depend>16   <build_export_depend>rospy</build_export_depend>17   <build_export_depend>std_msgs</build_export_depend>18   <exec_depend>roscpp</exec_depend>19   <exec_depend>rospy</exec_depend>20   <exec_depend>std_msgs</exec_depend>21 
 22   <export>23     <!--Other tools can request additional information be placed here -->24 
 25   </export>26 </package>  

同上,内容比较多,有用就这些就够了。

5、编译功能包,并设置环境变量

cd ~/catkin_ws/

catkin_make                        #编译

source devel/setup.bash                  #设置环境变量

测试,打开三个终端,在第一终端输入:roscore,第二个终端输入:rosrun learning_com talker 第三个终端输入:rosrun learning_com listener

在第一终端输入:roscore,

municationk@developk:~/catkin_ws$ roscore 
... logging to /home/municationk/.ros/log/41d00338-b742-11e9-bb4a-d39af2b318a5/roslaunch-developk-11230.log
Checking log directory fordisk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://developk:45561/
ros_comm version 1.14.3

SUMMARY
========
PARAMETERS
 * /rosdistro: melodic
 * /rosversion: 1.14.3
NODES

auto-starting newmaster
process[master]: started with pid [11240]
ROS_MASTER_URI=http://developk:11311/
setting /run_id to 41d00338-b742-11e9-bb4a-d39af2b318a5
process[rosout-1]: started with pid [11251]
started core service [/rosout]

第二个终端输入:rosrun learning_com talker

municationk@developk:~/catkin_ws$ rosrun learning_com talker
[ INFO] [1564988563.784974961]: hello world 0[ INFO] [1564988563.885031740]: hello world 1[ INFO] [1564988563.985024808]: hello world 2[ INFO] [1564988564.085013935]: hello world 3[ INFO] [1564988564.185028269]: hello world 4[ INFO] [1564988564.285029076]: hello world 5[ INFO] [1564988564.385029776]: hello world 6[ INFO] [1564988564.485037478]: hello world 7[ INFO] [1564988564.585027521]: hello world 8[ INFO] [1564988564.685035509]: hello world 9[ INFO] [1564988564.785033638]: hello world 10[ INFO] [1564988564.885032052]: hello world 11[ INFO] [1564988564.985045949]: hello world 12[ INFO] [1564988565.085036609]: hello world 13[ INFO] [1564988565.185046211]: hello world 14[ INFO] [1564988565.285035685]: hello world 15[ INFO] [1564988565.385040617]: hello world 16[ INFO] [1564988565.485035166]: hello world 17[ INFO] [1564988565.585033846]: hello world 18[ INFO] [1564988565.685045276]: hello world 19[ INFO] [1564988565.785045671]: hello world 20[ INFO] [1564988565.885033669]: hello world 21[ INFO] [1564988565.985047584]: hello world 22[ INFO] [1564988566.085030408]: hello world 23[ INFO] [1564988566.185034201]: hello world 24[ INFO] [1564988566.285026831]: hello world 25[ INFO] [1564988566.385031470]: hello world 26[ INFO] [1564988566.485012264]: hello world 27[ INFO] [1564988566.585025410]: hello world 28

第三个终端输入:rosrun learning_com listener

municationk@developk:~/catkin_ws$ rosrun learning_com listener
[ INFO] [1564988569.085433644]: I heard: [hello world 53]
[ INFO] [1564988569.185483579]: I heard: [hello world 54]
[ INFO] [1564988569.285412983]: I heard: [hello world 55]
[ INFO] [1564988569.385413951]: I heard: [hello world 56]
[ INFO] [1564988569.485403072]: I heard: [hello world 57]
[ INFO] [1564988569.585392842]: I heard: [hello world 58]
[ INFO] [1564988569.685406999]: I heard: [hello world 59]
[ INFO] [1564988569.785430346]: I heard: [hello world 60]
[ INFO] [1564988569.885437192]: I heard: [hello world 61]
[ INFO] [1564988569.985383334]: I heard: [hello world 62]
[ INFO] [1564988570.085448900]: I heard: [hello world 63]
[ INFO] [1564988570.185430490]: I heard: [hello world 64]
[ INFO] [1564988570.285360554]: I heard: [hello world 65]
[ INFO] [1564988570.385351604]: I heard: [hello world 66]
[ INFO] [1564988570.485397283]: I heard: [hello world 67]
[ INFO] [1564988570.585397681]: I heard: [hello world 68]
[ INFO] [1564988570.685402230]: I heard: [hello world 69]
[ INFO] [1564988570.785393468]: I heard: [hello world 70]
[ INFO] [1564988570.885363100]: I heard: [hello world 71]
[ INFO] [1564988570.985392078]: I heard: [hello world 72]
[ INFO] [1564988571.085475920]: I heard: [hello world 73]
[ INFO] [1564988571.185429095]: I heard: [hello world 74]
[ INFO] [1564988571.285393208]: I heard: [hello world 75]
[ INFO] [1564988571.385433165]: I heard: [hello world 76]
[ INFO] [1564988571.485432988]: I heard: [hello world 77]
[ INFO] [1564988571.585488144]: I heard: [hello world 78]
[ INFO] [1564988571.685395075]: I heard: [hello world 79]
[ INFO] [1564988571.785379391]: I heard: [hello world 80]
[ INFO] [1564988571.885424095]: I heard: [hello world 81]
[ INFO] [1564988571.985416266]: I heard: [hello world 82]

当在第二个终端中使用ctrl+c将程序中talker的publisher退出:

[ INFO] [1564988684.485031189]: hello world 1207[ INFO] [1564988684.585041383]: hello world 1208[ INFO] [1564988684.685035838]: hello world 1209[ INFO] [1564988684.785028755]: hello world 1210[ INFO] [1564988684.885037794]: hello world 1211[ INFO] [1564988684.985037237]: hello world 1212[ INFO] [1564988685.085037514]: hello world 1213[ INFO] [1564988685.185037370]: hello world 1214[ INFO] [1564988685.285035278]: hello world 1215[ INFO] [1564988685.385038330]: hello world 1216[ INFO] [1564988685.485038069]: hello world 1217[ INFO] [1564988685.585033289]: hello world 1218[ INFO] [1564988685.685036926]: hello world 1219[ INFO] [1564988685.785037248]: hello world 1220[ INFO] [1564988685.885031570]: hello world 1221[ INFO] [1564988685.985032773]: hello world 1222[ INFO] [1564988686.085030804]: hello world 1223[ INFO] [1564988686.185031407]: hello world 1224[ INFO] [1564988686.285031990]: hello world 1225[ INFO] [1564988686.385032176]: hello world 1226[ INFO] [1564988686.485039157]: hello world 1227[ INFO] [1564988686.585043363]: hello world 1228[ INFO] [1564988686.685048856]: hello world 1229[ INFO] [1564988686.785040098]: hello world 1230[ INFO] [1564988686.885051605]: hello world 1231
^C[ INFO] [1564988686.985104558]: hello world 1232municationk@developk:~/catkin_ws$ 

第三个终端中的lisenter的subscriber也无法接受数据:

[ INFO] [1564988683.685365358]: I heard: [hello world 1199]
[ INFO] [1564988683.785432435]: I heard: [hello world 1200]
[ INFO] [1564988683.885411699]: I heard: [hello world 1201]
[ INFO] [1564988683.985359765]: I heard: [hello world 1202]
[ INFO] [1564988684.085305814]: I heard: [hello world 1203]
[ INFO] [1564988684.185308442]: I heard: [hello world 1204]
[ INFO] [1564988684.285348116]: I heard: [hello world 1205]
[ INFO] [1564988684.385234823]: I heard: [hello world 1206]
[ INFO] [1564988684.485375722]: I heard: [hello world 1207]
[ INFO] [1564988684.585385628]: I heard: [hello world 1208]
[ INFO] [1564988684.685397073]: I heard: [hello world 1209]
[ INFO] [1564988684.785395362]: I heard: [hello world 1210]
[ INFO] [1564988684.885395528]: I heard: [hello world 1211]
[ INFO] [1564988684.985422434]: I heard: [hello world 1212]
[ INFO] [1564988685.085454179]: I heard: [hello world 1213]
[ INFO] [1564988685.185441077]: I heard: [hello world 1214]
[ INFO] [1564988685.285378556]: I heard: [hello world 1215]
[ INFO] [1564988685.385396991]: I heard: [hello world 1216]
[ INFO] [1564988685.485434675]: I heard: [hello world 1217]
[ INFO] [1564988685.585420842]: I heard: [hello world 1218]
[ INFO] [1564988685.685352301]: I heard: [hello world 1219]
[ INFO] [1564988685.785442642]: I heard: [hello world 1220]
[ INFO] [1564988685.885395217]: I heard: [hello world 1221]
[ INFO] [1564988685.985383329]: I heard: [hello world 1222]
[ INFO] [1564988686.085378470]: I heard: [hello world 1223]
[ INFO] [1564988686.185359547]: I heard: [hello world 1224]
[ INFO] [1564988686.285419784]: I heard: [hello world 1225]
[ INFO] [1564988686.385437478]: I heard: [hello world 1226]
[ INFO] [1564988686.485451254]: I heard: [hello world 1227]
[ INFO] [1564988686.585436616]: I heard: [hello world 1228]
[ INFO] [1564988686.685407657]: I heard: [hello world 1229]
[ INFO] [1564988686.785376388]: I heard: [hello world 1230]
[ INFO] [1564988686.885540877]: I heard: [hello world 1231]

正好符合了通信中的,有发送才有接收,发送中断了,接受不到数据了,自然就停下了。ROS中的话题通信主要依赖roccore,因此,无论是先运行终端2或终端3都无所谓,但是,一定要先运行终端1的命令。

免责声明:文章转载自《ROS机器人开发实践学习笔记3》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Sql Server使用技巧LLVM初体验——LLVM,Clang和libc++的编译和安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Cmake实战指南

0 综述 我觉的Cmake比较核心的一些东西就是 怎么去组织一个项目的编译框架 最终输出目标有哪些(可执行程序,动态库,静态库等等) 怎么为指定的输出目标指定编译参数(需要哪些源文件,需要哪些编译参数) 怎么为指定的输出目标指定链接参数(需要哪些外部库,需要哪些链接参数) 如果存在多个独立输出目标是否有执行先后顺序(比如项目有自动配置工具,用来自动生...

SpringBoot如何使用Slf4j日志与logback-spring.xml配置详解

一、SpringBoot如何使用Slf4j日志   springboot是默认使用slf4j进行日志管理的,所以集成也比较方便。 1、添加依赖 (1)spring-boot-starter-web依赖,用于自动导入日志框架的依赖 <dependency> <groupId>org.springframework.boot&l...

.netcore在linux下使用P/invoke方式调用linux动态库

http://www.mamicode.com/info-detail-2358309.html   .netcore下已经实现了通过p/invoke方式调用linux的动态链接库(*.so)文件 1 [DllImport(@"libdl.so.2")] 2 public static extern IntPtr dlo...

[转载]为什么有些语言可以被反编译?而有的不能?

来源:https://blog.csdn.net/z8414/article/details/73332009 要理解这个问题,先要看「正」编译的过程是怎样的。你有一个想法,这是一种人类自然语言可以表达出来的东西。你利用编程技能,把它「翻译」成你熟悉的一种编程语言: 这个过程叫做编程。然后你使用编译器(compiler)将它翻译成机器所能理解的语言:...

windows 编译c++库的安装CURL、64位Boost

1.CURL 本文使用vs2010 下载: git clone https://github.com/curl/curl.git https://github.com/curl/curl vs的工具下的命令行:(一定) 32位:vcvarsall.bat x86 64位:vcvarsall.bat x64 下一步:执行curl目录下的buildconf.b...

【转载】Linux系统下源代码包方式安装PHP开发环境

########节选自《细说PHP》################ 2.2 Linux系统下源代码包方式安装环境 在Linux平台下安装PHP有几种方法:使用配置和编译过程,或是使用各种预编译的包。在Linux上安装软件,用户最好的选择是下载源代码包,并编译一个适合自己的版本。LAMP组合中每个成员都是开源的软件,都可以从各自的官方网站上免费下载安装程序...