摘要: 刚刚开始学习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/目录中,内容

   /**
2 * 该例程将发布chatter话题,消息类型String
3 */ #include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h" int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "talker"); // 创建节点句柄
ros::NodeHandle n; // 创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", ); // 设置循环的频率
ros::Rate loop_rate(); int count = ;
while (ros::ok())
{
// 初始化std_msgs::String类型的消息
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str(); // 发布消息
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg); // 循环等待回调函数
ros::spinOnce(); // 按照循环频率延时
loop_rate.sleep();
++count;
} return ;
}

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

   /**
2 * 该例程将订阅chatter话题,消息类型String
3 */ #include "ros/ros.h"
#include "std_msgs/String.h" // 接收到订阅的消息后,会进入消息回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
// 将接收到的消息打印出来
ROS_INFO("I heard: [%s]", msg->data.c_str());
} int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc, argv, "listener"); // 创建节点句柄
ros::NodeHandle n; // 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
ros::Subscriber sub = n.subscribe("chatter", , chatterCallback); // 循环等待回调函数
ros::spin(); return ;
}

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

   cmake_minimum_required(VERSION 2.8.)
project(learning_com) ## Compile as C++, supported in ROS Kinetic and newer
# add_compile_options(-std=c++) ## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
) ## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
include
${catkin_INCLUDE_DIRS}
) ## Declare a C++ library
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/learning_communication.cpp
# ) add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp) add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp) ## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# ) #############
## Testing ##
############# ## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_learning_communication.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif() ## Add folders to be run by python nosetests
# 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-.log
Checking log directory for disk 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. SUMMARY
======== PARAMETERS
* /rosdistro: melodic
* /rosversion: 1.14. NODES auto-starting new master
process[master]: started with pid []
ROS_MASTER_URI=http://developk:11311/ setting /run_id to 41d00338-b742-11e9-bb4a-d39af2b318a5
process[rosout-]: started with pid []
started core service [/rosout]

  第二个终端输入:rosrun  learning_com talker

municationk@developk:~/catkin_ws$ rosrun learning_com talker
[ INFO] [1564988563.784974961]: hello world
[ INFO] [1564988563.885031740]: hello world
[ INFO] [1564988563.985024808]: hello world
[ INFO] [1564988564.085013935]: hello world
[ INFO] [1564988564.185028269]: hello world
[ INFO] [1564988564.285029076]: hello world
[ INFO] [1564988564.385029776]: hello world
[ INFO] [1564988564.485037478]: hello world
[ INFO] [1564988564.585027521]: hello world
[ INFO] [1564988564.685035509]: hello world
[ INFO] [1564988564.785033638]: hello world
[ INFO] [1564988564.885032052]: hello world
[ INFO] [1564988564.985045949]: hello world
[ INFO] [1564988565.085036609]: hello world
[ INFO] [1564988565.185046211]: hello world
[ INFO] [1564988565.285035685]: hello world
[ INFO] [1564988565.385040617]: hello world
[ INFO] [1564988565.485035166]: hello world
[ INFO] [1564988565.585033846]: hello world
[ INFO] [1564988565.685045276]: hello world
[ INFO] [1564988565.785045671]: hello world
[ INFO] [1564988565.885033669]: hello world
[ INFO] [1564988565.985047584]: hello world
[ INFO] [1564988566.085030408]: hello world
[ INFO] [1564988566.185034201]: hello world
[ INFO] [1564988566.285026831]: hello world
[ INFO] [1564988566.385031470]: hello world
[ INFO] [1564988566.485012264]: hello world
[ INFO] [1564988566.585025410]: hello world

  第三个终端输入:rosrun  learning_com listener

municationk@developk:~/catkin_ws$ rosrun learning_com listener
[ INFO] [1564988569.085433644]: I heard: [hello world ]
[ INFO] [1564988569.185483579]: I heard: [hello world ]
[ INFO] [1564988569.285412983]: I heard: [hello world ]
[ INFO] [1564988569.385413951]: I heard: [hello world ]
[ INFO] [1564988569.485403072]: I heard: [hello world ]
[ INFO] [1564988569.585392842]: I heard: [hello world ]
[ INFO] [1564988569.685406999]: I heard: [hello world ]
[ INFO] [1564988569.785430346]: I heard: [hello world ]
[ INFO] [1564988569.885437192]: I heard: [hello world ]
[ INFO] [1564988569.985383334]: I heard: [hello world ]
[ INFO] [1564988570.085448900]: I heard: [hello world ]
[ INFO] [1564988570.185430490]: I heard: [hello world ]
[ INFO] [1564988570.285360554]: I heard: [hello world ]
[ INFO] [1564988570.385351604]: I heard: [hello world ]
[ INFO] [1564988570.485397283]: I heard: [hello world ]
[ INFO] [1564988570.585397681]: I heard: [hello world ]
[ INFO] [1564988570.685402230]: I heard: [hello world ]
[ INFO] [1564988570.785393468]: I heard: [hello world ]
[ INFO] [1564988570.885363100]: I heard: [hello world ]
[ INFO] [1564988570.985392078]: I heard: [hello world ]
[ INFO] [1564988571.085475920]: I heard: [hello world ]
[ INFO] [1564988571.185429095]: I heard: [hello world ]
[ INFO] [1564988571.285393208]: I heard: [hello world ]
[ INFO] [1564988571.385433165]: I heard: [hello world ]
[ INFO] [1564988571.485432988]: I heard: [hello world ]
[ INFO] [1564988571.585488144]: I heard: [hello world ]
[ INFO] [1564988571.685395075]: I heard: [hello world ]
[ INFO] [1564988571.785379391]: I heard: [hello world ]
[ INFO] [1564988571.885424095]: I heard: [hello world ]
[ INFO] [1564988571.985416266]: I heard: [hello world ]

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

[ INFO] [1564988684.485031189]: hello world
[ INFO] [1564988684.585041383]: hello world
[ INFO] [1564988684.685035838]: hello world
[ INFO] [1564988684.785028755]: hello world
[ INFO] [1564988684.885037794]: hello world
[ INFO] [1564988684.985037237]: hello world
[ INFO] [1564988685.085037514]: hello world
[ INFO] [1564988685.185037370]: hello world
[ INFO] [1564988685.285035278]: hello world
[ INFO] [1564988685.385038330]: hello world
[ INFO] [1564988685.485038069]: hello world
[ INFO] [1564988685.585033289]: hello world
[ INFO] [1564988685.685036926]: hello world
[ INFO] [1564988685.785037248]: hello world
[ INFO] [1564988685.885031570]: hello world
[ INFO] [1564988685.985032773]: hello world
[ INFO] [1564988686.085030804]: hello world
[ INFO] [1564988686.185031407]: hello world
[ INFO] [1564988686.285031990]: hello world
[ INFO] [1564988686.385032176]: hello world
[ INFO] [1564988686.485039157]: hello world
[ INFO] [1564988686.585043363]: hello world
[ INFO] [1564988686.685048856]: hello world
[ INFO] [1564988686.785040098]: hello world
[ INFO] [1564988686.885051605]: hello world
^C[ INFO] [1564988686.985104558]: hello world
municationk@developk:~/catkin_ws$

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

[ INFO] [1564988683.685365358]: I heard: [hello world ]
[ INFO] [1564988683.785432435]: I heard: [hello world ]
[ INFO] [1564988683.885411699]: I heard: [hello world ]
[ INFO] [1564988683.985359765]: I heard: [hello world ]
[ INFO] [1564988684.085305814]: I heard: [hello world ]
[ INFO] [1564988684.185308442]: I heard: [hello world ]
[ INFO] [1564988684.285348116]: I heard: [hello world ]
[ INFO] [1564988684.385234823]: I heard: [hello world ]
[ INFO] [1564988684.485375722]: I heard: [hello world ]
[ INFO] [1564988684.585385628]: I heard: [hello world ]
[ INFO] [1564988684.685397073]: I heard: [hello world ]
[ INFO] [1564988684.785395362]: I heard: [hello world ]
[ INFO] [1564988684.885395528]: I heard: [hello world ]
[ INFO] [1564988684.985422434]: I heard: [hello world ]
[ INFO] [1564988685.085454179]: I heard: [hello world ]
[ INFO] [1564988685.185441077]: I heard: [hello world ]
[ INFO] [1564988685.285378556]: I heard: [hello world ]
[ INFO] [1564988685.385396991]: I heard: [hello world ]
[ INFO] [1564988685.485434675]: I heard: [hello world ]
[ INFO] [1564988685.585420842]: I heard: [hello world ]
[ INFO] [1564988685.685352301]: I heard: [hello world ]
[ INFO] [1564988685.785442642]: I heard: [hello world ]
[ INFO] [1564988685.885395217]: I heard: [hello world ]
[ INFO] [1564988685.985383329]: I heard: [hello world ]
[ INFO] [1564988686.085378470]: I heard: [hello world ]
[ INFO] [1564988686.185359547]: I heard: [hello world ]
[ INFO] [1564988686.285419784]: I heard: [hello world ]
[ INFO] [1564988686.385437478]: I heard: [hello world ]
[ INFO] [1564988686.485451254]: I heard: [hello world ]
[ INFO] [1564988686.585436616]: I heard: [hello world ]
[ INFO] [1564988686.685407657]: I heard: [hello world ]
[ INFO] [1564988686.785376388]: I heard: [hello world ]
[ INFO] [1564988686.885540877]: I heard: [hello world ]

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

  

ROS机器人开发实践学习笔记3的更多相关文章

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

    刚刚开始学习ROS,打算入机器人的坑了,参考教材是<ROS及其人开发实践>胡春旭编著 机械工业出版社 华章科技出品.本来以为可以按照书上的步骤一步步来,但是,too young to si ...

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

    刚刚开始学习ROS,打算入机器人的坑了,参考教材是<ROS及其人开发实践>胡春旭编著 机械工业出版社 华章科技出品.本来以为可以按照书上的步骤一步步来,但是,too young to si ...

  3. ros机器人开发概述

    1.       ROS项目开发流程? 参照古月大神写的ROS探索总结系列:http://blog.exbot.net/archives/619 具体项目设计可看看<程序员>杂志的最新一篇 ...

  4. ROS机器人开发实践1->SSH远程登录要点记录

    1.有线网卡 设置 找到有线网络,点击设置,修改其中的IPv4的地址和子网掩码. 1 //地址 2 192.168.xxx.xxx 3 //子网掩码 4 255.255.255.0 点击应用 2.配置 ...

  5. SLAM+语音机器人DIY系列:(四)差分底盘设计——4.底盘ROS驱动开发

    摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...

  6. Ubuntu虚拟机+ROS+Android开发环境配置笔记

    Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...

  7. ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

    ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...

  8. Kinect开发学习笔记之(一)Kinect介绍和应用

    Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...

  9. Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇

    懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...

随机推荐

  1. Asp.Net Core 2.0 之旅---@Html.Action

    原文:Asp.Net Core 2.0 之旅---@Html.Action 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...

  2. Visual Studio 2017修改编码UTF-8

    转载自:https://blog.csdn.net/qq_36848370/article/details/82597157 VS 2017隐藏了高级保存功能,导致没办法直接去设置代码编码 UTF-8 ...

  3. WebApi 全局异常与局部异常

    全局异常过滤器 public class ApiExceptionFilter:ExceptionFilterAttribute { private IHostingEnvironment _env; ...

  4. SQL alchemy

    SQL alchemy介绍 SQL alchemy是orm思想的一个具体实现的产品 orm:对象关系映射思想 Object Relational Mapping 就是将数据库里的资源与面向对象中的类和 ...

  5. mysql常用的存储引擎,MyISAM和InnoDB的对比

    Mysql有多种存储引擎,最常用的有MyISAM和InnoDB这两种,每一种类型的存储引擎都有自已的特点,可以结合项目中数据的使用场景来进行了哪种存储引擎合适. 1:查看mysql数据库支持的存储引擎 ...

  6. pytorch之nn.Conv1d详解

    转自:https://blog.csdn.net/sunny_xsc1994/article/details/82969867,感谢分享 pytorch之nn.Conv1d详解

  7. 【Hibernate】 二级缓存及查询缓存

    一.Hibernate的二级缓存 1.1 类缓存区特点 缓存的是对象的散装的数据. 图一 Hibernate的二级缓存的散装数据 1.2 集合缓存区的特点: 缓存的是对象的id.需要依赖类缓冲区的配置 ...

  8. Java之IO学习

    知其然也要知其所以然,最近对IO流莫名的感觉时候充充电了,所以上网拜读了大神的文章.在学习过程中我找到了一篇很系统很详细的文章贴出来. 声明一下这是转载的文章  原文:https://www.cnbl ...

  9. mac使用sourcetree跳过注册

    转自https://blog.csdn.net/qq_32890891/article/details/89216954 打开sourcetree 关闭sourcetree 命令终端输入default ...

  10. MySQL进阶8 分页查询(limit) - 【SQL查询语法执行顺序及大致结构】- 子查询的3个经典案例

    #进阶8 分页查询 /* 应用场景: 当要显示的数据,一页显示不全,需要分页提交sql请求 语法: select 查询列表 #7 from 表1 #执行顺序:#1 [join type join 表2 ...