友情提示:380元/半年,儿童学编程,就上码丁实验室。
目 录
- 1.2.1 ROS的开发环境设置
- 1.2.2 ROS的包(软件包)结构
- 1.2.3 编写第一个节点
- 1.2.4 执行和调试节点
1.2.1 ROS 的开发环境配置
(1)工作空间简介
- 在工作空间“catkin_ws”中可以构建一个或多个由catkin构建的软件包;
- 包含4个不同空间:
描 述 | 空 间 |
Contains the source code of catkin packages. Each folder within the source space contains one or more catkin packages. |
Source space |
is where CMake is invoked to build the catkin packages in the source space. CMake and catkin keep their cache information and other intermediate files here. |
Build Space |
is where built targets are placed prior to being installed |
Development (Devel) Space |
Once targets are built, they can be installed into the install space by invoking the install target. |
Install Space |
(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 包的公用文件和目录
说 明 | 目 录 |
C++ include headers |
include/ |
Source files |
src/ |
Folder containing Message (msg) types |
msg/ |
Folder containing Service (srv) types |
srv/ |
Folder containing launch files |
launch/ |
The package manifest |
package.xml |
CMake build file |
CMakeLists.txt |
(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 <package_name> [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_<LEVEL>[_<OTHER>]
- 另外,C ++STL流支持* _STREAM函数:
- ROS_INFO_STREAM(“My INFO stream message with argument: ” << val);
根据上文,编写C++节点程序,该节点实现以10Hz的频率向命令行窗口输出消息,如下所示:
/*
* hello.cpp
*
* Created on: Jun 25, 2018
* Author: HuicanLin
*/
#include“ros/ros.h”
int main(intargc,char**argv)
{
ros::init(argc,argv,“hello”);
ros::NodeHandle nh;
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())// Keep spinning loop until userpresses Ctrl+C
{
ROS_INFO_STREAM(“helloworld” << count);
ros::spinOnce();// Allow ROS to process incomingmessages
loop_rate.sleep();// Sleep for the rest of thecycle
count++;
}
return 0;
}
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(${catkin_INCLUDE_DIRS})
##Declare a cppexecutable
add_executable(hello src/hello.cpp)
##Specify libraries to link a library or executable target against
target_link_libraries(hello ${catkin_LIBRARIES})
(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