ROS机器人开发实践学习笔记3
摘要: 刚刚开始学习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的更多相关文章
- ROS机器人开发实践学习笔记1
刚刚开始学习ROS,打算入机器人的坑了,参考教材是<ROS及其人开发实践>胡春旭编著 机械工业出版社 华章科技出品.本来以为可以按照书上的步骤一步步来,但是,too young to si ...
- ROS机器人开发实践学习笔记2
刚刚开始学习ROS,打算入机器人的坑了,参考教材是<ROS及其人开发实践>胡春旭编著 机械工业出版社 华章科技出品.本来以为可以按照书上的步骤一步步来,但是,too young to si ...
- ros机器人开发概述
1. ROS项目开发流程? 参照古月大神写的ROS探索总结系列:http://blog.exbot.net/archives/619 具体项目设计可看看<程序员>杂志的最新一篇 ...
- ROS机器人开发实践1->SSH远程登录要点记录
1.有线网卡 设置 找到有线网络,点击设置,修改其中的IPv4的地址和子网掩码. 1 //地址 2 192.168.xxx.xxx 3 //子网掩码 4 255.255.255.0 点击应用 2.配置 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——4.底盘ROS驱动开发
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- Ubuntu虚拟机+ROS+Android开发环境配置笔记
Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...
- ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse
ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...
- Kinect开发学习笔记之(一)Kinect介绍和应用
Kinect开发学习笔记之(一)Kinect介绍和应用 zouxy09@qq.com http://blog.csdn.net/zouxy09 一.Kinect简单介绍 Kinectfor Xbox ...
- Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo完结篇
懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 ) 写下这些东西的同时 旁边放了两部电影 周星驰的<还魂夜> 甄子丹的<特殊身份& ...
随机推荐
- JDBC 学习复习8 C3P0数据源使用
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. c3p0与dbcp区别 dbcp ...
- java封装数据类型——Integer 缓存策略验证
上一篇学习 Integer 类型源码,知道了它使用缓存策略,默认对 [-128, 127] 范围的对象进行类加载时自动创建缓存. Integer 源码学习:https://www.cnblogs.co ...
- 整理一下Promise 的用法
Promise 的定义 Pormise是JS的异步编程的一种解决方案,在ES6将其写进了语言标准,提供了原生的Promise对象. Promise简单来理解就是一个容器,里面存放着某个未来才会结束的事 ...
- EF数据Linq方式查询
using (var ctx = new NorthwindEntities()) { //单表查询SQL查询方式 //SELECT * FROM Customers AS c WHERE c.Cit ...
- GNS3 介绍
什么是GNS3? GNS3是一款模拟CISCO网络设备的模拟器,和CPT(Cisco Packet Tracer)相比.GNS3运行的是真实设备的IOS,命令集更全,在如有部分有非常好的表现,交换部分 ...
- Linux学习笔记(十)shell基础:历史命令、命令补全、输出重定向、输出重定向
一.历史命令 history [选项] [历史命令保存文件] -c 清空历史命令 -w 吧缓存中的历史命令写入历史命令保存文件~/.bash_history中 系统会默认将上次注销登录(正确退出)之前 ...
- Oracle查看数据占用的空间和数据文件实际空间的信息
可以使用如下sql: select 'bgdrac' database,t11.username,t11.default_tablespace tablespace_name,segment_size ...
- Spark2 jar存档
spark.yarn.archive需要手动将spark应用依赖jar上传到hdfs,该属性可以避免每一次运行spark应用时都重复打zip包上传到hdfs. 官网http://spark.apach ...
- python学习之模块(pip),列表生成式,模块操作mysql,excel
python基础 生成式 列表生成式 格式 [表达式 for 表达式 in 迭代对象 (可加判断)] 原: res1 = [] for i in range(1,5): res1.append(i) ...
- [Visual Studio] 自定义项目模板(.vsix扩展)
VS自定义项目模板:[2]创建VSIX项目模板扩展 听语音 | 浏览:1237 | 更新:2015-01-02 09:21 | 标签:软件开发 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师 ...