ROS教程——1.2 编程实践ROS节点

目 录

1.2.1 ROS的开发环境设置

1.2.2 ROS的包(软件包)结构

1.2.3 编写第一个节点

1.2.4 执行和调试节点

1.2.1 ROS 的开发环境配置

(1)工作空间简介

在工作空间“catkin_ws”中可以构建一个或多个由catkin构建的软件包;

包含4个不同空间:

(2)工作空间布局

(3)创建catkin工作空间

catkin 是构建ROS节点的官方工具;

原来的ROS构建工具是rosbuild;

旧的包仍在使用;

创建工作空间的命令:

mkdir -p ~/catkin_ws/src

cd ~/catkin_ws/src

catkin_init_workspace

初始情况下,工作空间只包含顶层目录的CMakeLists.txt,即 "~/catkin_ws/src" 路径下的CMakeLists.txt文件

参考链接:

http://wiki.ros.org/catkin/Tutorials/create_a_workspace

构建命令是"catkin_make",类似cmake和make命令的组合。

使用catkin_make命令构建工作空间及包含的所有包

cd ~/catkin_ws

catkin_make

1.2.2 ROS包

“ROS包”可以看作是工作空间下的目录,包含package.xml文件;

“ROS包”是构建和发布程序(节点)的最原始单位;

“ROS包”包含一个或多个节点的源文件和配置文件;

(1)ROS包的公用文件和目录

(2)The Package Manifest

XML 文件定义ROS包的属性,例如:

ROS报名

版本号

作者信息

依赖关系(依赖于其它包)

Example for a package manifest:

1.2.3编写第一个节点

(1)创建ROS包

进入工作空间的源文件目录

cd ~/catkin_ws/src

catkin_create_pkg

创建新的ROS包并指定依赖:

catkin_create_pkg

[depend1] [depend2] [depend3]

例如,创建ROS包(first_pkg):

catkin_create_pkg first_pkg std_msgs rospy roscpp

roscpp是ROS客户端中的C ++实现

库文件参考下列链接:

http://docs.ros.org/api/roscpp/html/

ROS主头文件是“ros / ros.h”

参考链接:

http://wiki.ros.org/catkin/Tutorials/CreatingPackage

(2)ROS初始化

在使用ROS系统之前必须先调用ros::init()进行初始化

通常在主函数main()中调用:

ros::init(argc, argv, "Node name");

节点名称(Node name)在运行的系统中必须是唯一的;

(3)ros::NodeHandle

与ROS系统通信的主要接入点。

为主题,服务,参数等提供公共接口

创建进程的节点的句柄(在调用ros::init()之后),声明如下:

构造的第一个NodeHandle将完全初始化当前节点

最后一个被销毁的NodeHandle将关闭节点

ros::NodeHandle node;

(4)ros::Rate

设定循环的运行频率,在括号中指定以Hz为单位的频率:

ros::Rate loop_rate(10);

ros::Rate::sleep()

循环周期内的剩余时间进行休眠

从上次睡眠,重置或构造函数被调用计算

(5)ros::ok()

调用ros:: ok()来检查节点是否应该继续运行;

出现下列情况,ros::ok()将返回false:

接收到一个SIGINT(Ctrl-C)

被同名的另一个节点踢出了网络

在应用的其它部分调用了ros::shutdown()

所有的ros::NodeHandles都被销毁

(6) ROS调试消息

使用ROS_INFO输出消息:

ROS_INFO( "My INFO message." );

消息输出格式:级别+时间戳+内容

[INFO] [1356440230.837067170]: My INFO message.

类似printf,该函数可以带参数:

ROS_INFO("My INFO message with argument: %f", val);

ROS具有五个经典的日志记录级别:

DEBUG, INFO, WARN, ERROR, and FATAL

这些名称是用于输出遵循此语法的消息的宏的一部分:

ROS_[_]

另外,C ++STL流支持*_STREAM函数:

ROS_INFO_STREAM("My INFO stream message with argument: "

根据上文,编写C++节点程序,该节点实现以10Hz的频率向命令行窗口输出消息,如下所示:

/*

* hello.cpp

*

* Created on: Jun 25, 2018

* Author: HuicanLin

*/

#include"ros/ros.h"

intmain(intargc,char**argv)

{

ros::init(argc,argv,"hello");

ros::NodeHandle nh;

ros::Rate loop_rate(10);

intcount = 0;

while(ros::ok())// Keep spinning loop until userpresses Ctrl+C

{

ROS_INFO_STREAM("helloworld"

ros::spinOnce();// Allow ROS to process incomingmessages

loop_rate.sleep();// Sleep for the rest of thecycle

count++;

}

return0;

}

1.2.4执行和调试节点

(1)构建节点

在构建节点之前,需要修改在创建包的时候生成的CMakeLists.txt文件;

为创建节点的可执行文件,需要修改CMakeLists.txt,如下所示;

cmake_minimum_required(VERSION 2.8.3)

project(first_pkg)

##Find catkin macros and libraries

find_package(catkin REQUIRED COMPONENTS roscpprospystd_msgs)

##Declare ROS messages and services

# add_message_files(FILES Message1.msg Message2.msg)

# add_service_files(FILES Service1.srv Service2.srv)

##Generate added messages and services

# generate_messages(DEPENDENCIES std_msgs)

##Declare catkin package

catkin_package()

##Specify additional locations of header files

include_directories($)

##Declare a cppexecutable

add_executable(hello src/hello.cpp)

##Specify libraries to link a library or executable target against

target_link_libraries(hello $)

(2) 在命令行窗口运行节点

打开两个命令行窗口,分别执行:

cd ~/catkin_ws/

catkin_make

roscore

rosrun lecture01 hello

不出意外的话,将输出如下的结果:

相应的程序可以从github进行clone,再进行编译、调试和执行:

cd ~/catkin_ws/src/

git clone https://github.com/LinHuican/ros_tutorial

cd ..

catkin_make

课后作业

创建新的ROS包,包名为”timer_package”;

在该包中创建节点,节点名为”timer_node”;

该节点每秒向控制台输出当前时间。

Qt Creator开发ROS,参考链接:

ubuntu安装Qt:

https://www.cnblogs.com/huicanlin/p/5279089.html

配置开发ROS:

https://www.cnblogs.com/huicanlin/p/5623067.html

欢迎关注交流,搜”Robot404”或扫描如下二维码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180703G09NCO00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券