ROS试用练习

学习笔记书籍来源于“ROS机器人高效编程”,学习过程源码配套上传在我的资源里。发现CSDN会自动修改代码里的部分英文翻译成中文,这是垃圾的功能。

  • ROS文件系统导览

  1. 搜索turtlesim包路径命令rospack找到turtlesim

  2. 搜索已经安装过的元功能包rosstack找到ros_comm

  3. 获取功能包或者功能包集下面的文件列表rosls turtlesim

  • 创建工作空间

  1. 查看当前ROS正在使用的空间echo $ ROS_PACKAGE_PATH

  2. 新建工作空间文件夹
    mkdir -p~ / dev / catkin_ws / src
    cd~ / dev / catkin_ws / src
    catkin_init_workspace

  3. 编译工作空间cd~ / dev / catkin_ws catkin_make此时
    使用ls命令可以看到新创建的文件夹,分别是build和devel文件夹

  4. 完成配置source devel / setup.bash

  • 创建ROS功能包和元功能包

使用如下命令在之前建立的工作空间中创建新的功能包
CD~的/ dev / catkin_ws / SRC
catkin_create_pkg chapter2_tutorials std_msgs roscpp
此命令的格式包括包的名称和依赖项,在这个示例中,依赖项包括std_msgs和roscpp,其中std_msgs包含了常见消息类型,表示基本数据类型和其他基本消息的消息构造,roscp提供了一个客户端库,让C ++程序员能够调用这些接口快速完成与ROS的主题,服务状语从句:相关参数工作
可以使用rospack,roscd,rosld命令来获取新的功能包信息,下面是一些可执行的操作
rospack简介:此命令用于通知用户ROS中新添加的内容,在安装任何新功能包之后使用它
rospack找到chapter2_tutorials:此命令用于查找路径
rospack取决于chapter2_tutprials:此命令用于查看依赖关系
rosls chapter2_tutprials:此命令用于查看内容
roscd chapter2_tutprials:此命令会更改实际路径

  • 编译ROS功能包

    cd~ / dev / catkin_ws /
    atkin_make
    必须在工作空间文件夹中运行catkin_make命令,如果在其他文件夹中这样做,命令无法执行

  • 使用ROS节点

在使用ROS之前,必须已经进行了ROS完整安装,那么你已经有了turtlesim功能包,如果没有,请使用以下命令安装:
sudo apt-get install ros-kinetic-ros-tutorials
在开始之前,打开终端并且使用如下命令启动roscore:roscore
为了获得节点信息,可以使用rosnode工具,查看命令接受哪些参数,可以输入以下命令:rosnode
如果你想获得关于这些参数更详细的解释,请使用如下命令:rosnode <param> -h
想要获取正在运行的节点信息,使用如下命令:rosnode list,也可以使用以下命令达到你想要的目的:rosnode info,rosnode ping,rosnode machine,rosnode kill,rosnode cleanup
现在要用rosrun命令启动一个新的节点,如下所示:
rosrun turtlesim turtlesim_node
运行此命令后,弹出一个新的窗口,里面有一个小海龟,然后再查看节点,就会看到出现了一个新的节点,叫做/ turtlesim,使用如下命令,可以看到很多能用于程序调试的信息
rosnode info /turtlesim

  • 使用节点与主题交互

要进行交互并获取主题的信息,可以使用rostopic工具,此工具接受以下参数
rostopic bw主题:显示主题所有用的带宽
rostopic echo TOPIC:将消息输出到屏幕
rostopic查找主题:按照类型查找主题
rostopic hz主题:显示主题的发布频率
rostopic信息主题:输出活动主题信息
rostopic
酒吧主题:列出活动主题rostopic酒吧主题:将数据发布到主题
rostopic类型主题:主题输出的类型
如果要查看有关这些参数的详细信息,请使用-h,如下所示:rostopic bw -h
通过使用plub参数,可以发布任何节点都可以订阅的主题。我们只需要用正确的名称将主题发布出去。现在要使用一个节点,并让节点做如下工作:
rosrun turtlesim turtle_teleop_key
通过该节点,可以使用箭头移动海龟

  • 使用服务

服务是能够使节点之间相互通信的另一种方法,服务允许节点发送请求和接收响应
可以使用rosservice工具与服务进行交互,此命令接受的参数如下所示
rosservice args / srvice:输出服务参数
rosservice call / service:根据命令行参数调用服务
rosservice find msg-type:根据服务类型查询服务
rosservice info / service:输出服务信息
rosservice list:列出活动的服务
rosservice类型/服务:输出服务类型
rosservice uri / service:输出POSRPC URI服务

  • 使用参数服务器

参数服务器用于存储所有节点均可访问的数据,ROS中用来管理参数服务器的工具称为rosparam,接受的参数如下所示:
rosparam set参数值:设置参数值
rosparam get参数:获取参数值
rosparam load file:从文件加载参数
rosparam dump file:将参数转储到一个文件中
rosparam delete参数:删除参数
rosparam list:列出参数名

  • 创建节点

这一小节,我们要学习如何创建两个节点:。一个发布数据,另一个接收这些数据这是两个节点之间最基本的通信方式,就是也。操作数据并使用这些数据来做这些工作
使用以下命令返回chapter2_tutorials / src /文件夹
roscd~ / dev / catkin_ws / src / chapter2_tutorials / src /
创建两个文件分别命名为example1_a.cpp和example2_b.cpp,将以下代码复制example1_a.cpp中。

#include“ros /ros.h“
#include”std_msgs /String.h“
#include <sstream>
int main(int argc,char ** argv)
{
    ros :: init(argc,argv,”example1_a“);
    ros :: NodeHandle n;
    ros :: Publisher pub = n.advertise <std_msgs :: String>(“message”,1000);
    ros :: Rate loop_rate(10);
    while(ros :: ok())
    {
    std_msgs :: String msg;
    std :: stringstream ss;
    ss <<“I am the example1_a node”;
    msg.data = ss。
    // ROS_INFO(“%s”,msg.data.c_str());
    pub.publish(MSG);
    ROS :: spinOnce();
    loop_rate.sleep();
    }
    return 0;
}


现在创建另一个节点,将下面的代码复制到example1_b.cpp文件中

#include“ros / ros.h”
#include“std_msgs / String.h”
void messageCallback(const std_msgs :: String :: ConstPtr&msg)
{
    ROS_INFO(“I heard:[%s]”,msg→data.c_str());
}
int main(int argc,char ** argv
{
    ros :: init(argc,argv,“example1_b”);
    ros :: NodeHandle n;
    ros :: Subscriber sub = n.subscribe(“message”,1000,messageCallback) ;
    ros :: spin();
    return 0;
}
  • 编译节点

当使用chapter2_tutorials包时,需要自行编辑CMakeLists.txt文件。可以使用你最喜欢的编辑器或者直接使用rose工具。这里将会在vim编辑器下打开这个文件:
rosed chapetr2_tutotials CmakeLists.txt
将以下命令行复制到文件的末尾出:
include_directories(
inclede
$ {catkin_INCLUDE_DIRS}

add_executable(example1_a src / example1_a.cpp)
add_executable(example1_a src / example1_b.cpp)
add_dependencies(example1_a chapter2_tutorials_generate_messages_cpp)
add_dependencies(example1_b chapter2_tutorials_generate_messages_cpp)
target_link_libraries(example1_a $ {catkin_LIBRARIES})
target_link_libraries(example1_b $ {catkin_LIBRARIES})
现在使用catkin_make工具来编译包和全部的节点
cd~ / dev / catkin_ws /
catkin_make --pkg chapter2_tutorials
如果在你的电脑上还没有启动ROS,需要首先调用:roscore
可以使用rosnode list命令检查ROS是否运行:rosnode list
然后在不同的命令行窗口下分别运行两个节点:
rosrun chapter2_tutorials example1_a
rosrun chapter2_tutorials example1_b

注意事项:

关于环境变量,如果对linux不熟悉的话,最好不要写入bash文件里,以创建自己的工作空间为例,我在运行rosrun chapter2_tutorials example1_a提示我错误:错误:包'chapter2_tutorials'未找到,我知道是环境变量问题,因为刚接触linux系统,在网上查找了相关资料以后,果断输入如下命令:
1。进入自己创建的工作目录cd~ / dev / catkin_ws
2.配置环境变量source devel / setup.bash
每打开一个新的终端,运行之前ROS例程节点,你都需要输入如上两个命令。当然以上命令可以做到的bash脚本里,但是我并不熟悉,只能用笨办法了。

  • 创建味精和SRV文件

味精和SRV是用于说明传输数据的类型和数据值的文件,ROS会根据这些文件内容自动创建所需要的代码,以便味精和SRV文件能够被节点使用。
首先,在chapter2_tutorials包下创建味精文件,并在其中创建一个新的文件chapter2_msg1.msg,在文件中添加以下行:
int32 A
int32 B
int32 C
cd~ / dev / catkin_ws / src / chapter2_tutorials        进入路径
mkdir -p msg        创建文件夹
cd msg
touch chaptter2_msg1.msg       创建文件
现在编辑package.xml,从<build_depend> message_generation </ build_depend>和<run_depend> message_runtime </ run_depend>行删除<!-- -- >
然后编辑CmakeList,按下面所示加入message_generation:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation

找到如下行,取消注释,并加入新消息名称:
##在'msg'文件夹中生成消息
add_message_files(
FILES
chapter2_msg1.msg

##生成添加的消息和服务,其中包含任何依赖项.generate_messages

DEPENDENCIES
std_msgs

现在,用下面的命令进行编译:
cd~ / dev / catkin_ws /
catkin_make
为了检查编译是否成功,使用下面的rosmsg命令:
rosmsg show chapter2_tutorials / chapter2_msg1
现在创建一个srv文件,在chapter2_tutorials文件夹下创建一个名为srv的文件夹,并新建文件chapter2_srv1.srv,在文件中添加以下行:
int32A
int32 B
int32 C
---
int32 sum
cd 〜/ dev / catkin_ws / src / chapter2_tutorials进入路径
mkdir -p srv创建文件夹
cd srv
touch chaptter2_str1.srv创建文件
为了编译新的msg和srv文件,必须取消pcakage.xml和CMakeList中如下行的注释。这些包含消息和服务配置信息,并告诉ROS如何编译以及比哪一什么。
首先,按下面的方式从chapter2_tutorials包中打开package.xml中文件夹
rosed chapetr2_tutorials package.xml中
找到下面的行,并取消注释:
<build_depend> message_generation </ build_depend>
<exec_depend> message_runtime </ exec_depend>
使用以下命令打开CnakeList:
rosed chapter2_tutorials CmakeList.txt
找到下面的行,取消注释,并改为正确的数据:
catkin_package(
CATKIN_DEPENDS message_runtime

为了生成消息,需要在find_package部分添加message_generation行:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation

在add_message_files部分如下所示添加消息和服务文件的名字:
##在'msg'文件夹中生成消息
add_message_files(
FILES
chapter2_msg1.msg

##在'srv'文件夹中生成服务
add_service_files(
FILES
chapter2_srv1.srv

取消generate_messages部分的注释,使得消息和服务可以顺利生成:
##使用
此处列出的任何依赖项生成添加的消息和服务
generate_messages(
DEPENDENCIES
std_msgs

现在,用下面的命令进行编译:
cd~ / dev / catkin_ws /
catkin_make
为了检查编译是否成功,使用下面的rosmsg命令:
rossrv show chapter2_tutorials / chapter2_srv1

  • 使用新建的SRV和MSG文件

新建两个节点并以example2_a.cpp和example2_b.cpp,注意这两个文件存放于工作区src文件夹中,代码如下所示:
example2_a.cpp
 

#include "ros/ros.h"
#include "chapter2_tutorials/chapter2_srv1.h"
bool add(chapter2_tutorials::chapter2_srv1::Request&req,chapter2_tutorials::chapter2_srv1::Response &res)
{
	res.sum = req.A + req.B + req.C;
	ROS_INFO("request: A=%d, B=%d C=%d", (int)req.A, (int)req.B, (int)req.C);
	ROS_INFO("sending back response: [%d]", (int)res.sum);
	return true;
}
int main(int argc, char **argv)
{
	ros::init(argc, argv, "add_3_ints_server");
	ros::NodeHandle n;
	ros::ServiceServer service = n.advertiseService("add_3_ints", add);
	ROS_INFO("Ready to add 3 ints.");
	ros::spin();
	return 0;
}


example2_b.cpp

#include "ros/ros.h"
#include "chapter2_tutorials/chapter2_srv1.h"
#include <cstdlib>
int main(int argc, char **argv)
{
	ros::init(argc, argv, "add_3_ints_client");
	if (argc != 4)
	{
		 ROS_INFO("usage: add_3_ints_client A B C ");
		return 1;
	}
	ros::NodeHandle n;
	ros::ServiceClient client = n.serviceClient<chapter2_tutorials::chapter2_srv1>("add_3_ints");
	chapter2_tutorials::chapter2_srv1 srv;
	srv.request.A = atoll(argv[1]);
	srv.request.B = atoll(argv[2]);
	srv.request.C = atoll(argv[3]);
	if (client.call(srv))
	{
		 ROS_INFO("Sum: %ld", (long int)srv.response.sum);
	}
	else
	{
		ROS_ERROR("Failed to call service add_two_ints");
		return 1;
	}
	return 0;
}


为了编译新的节点,在CMakeList.txt文件中添加以下行
add_executable(example2_a SRC / example2_a.cpp)
add_executable(example2_b SRC / example2_b.cpp)
add_dependencies(example2_a chapter2_tutorials_generate_messages_cpp)
add_dependencies(example2_b chapter2_tutorials_generate_messages_cpp)
target_link_libraries(example2_a $ {catkin_LIBRARIES })
target_link_libraries(example2_b $ {catkin_LIBRARIES})

现在可以输入以下命令编译和测试
cd~ / dev / catkin_ws /
catkin_make
rosrun chapter2_tutorials example2_a
rosrun chapter2_tutorials example2_b 4 5 6

  • 启动文件

luanch文件是ROS中一个非常重要的功能,可以启动多个节点。在之前的小节中,我们已经学习创建了节点,并且在不同的命令行窗口中执行。通过luanch文件可以在命令行窗口中方便给地启动多个ROS节点,只需要启动后缀名为luanch的配置文件。
为了练习这个例子,在功能包中创建一个新的文件夹:
cd~ / dev / catkin_ws
source devel / setup.bash
roscd chapter2_tutorials
mkdir launch
cd launch
触摸chapter2.launch
打开文件,输入以下内容
<?xml version =“1.0”?>
<launch>
<node name =“example1_a”pkg =“chapter2_tutorials”type =“example1_a”/>
<node name =“ example1_b“pkg =”chapter2_tutorials“type =”example1_b“/>
</ launch>
使用以下命令启动
roslaunch chapter2_tutorials chapter2.launch
使用以下命令查看消息
rqt_console

  • 动态参数

为了使用动态重配置,需要写一个配置文件并保存在cfg文件夹中,创建一个文件夹和新文件,如下所示.
cd ~ / dev / catkin_ws
source devel / setup.bash
roscd chapter2_tutorials
mkdir cfg
touch chapter2.cfg
在chapter2.cfg中添加如下代码:

#!/usr/bin/env python
PACKAGE = "chapter2_tutorials"
from dynamic_reconfigure.parameter_generator_catkin import *
gen = ParameterGenerator()
gen.add("int_param",    int_t,    0, "An Integer parameter", 1,  0, 100)
gen.add("double_param", double_t, 0, "A double parameter",    .1, 0,   1)
gen.add("str_param",    str_t,    0, "A string parameter",  "Chapter2_dynamic_reconfigure")
gen.add("bool_param",   bool_t,   0, "A Boolean parameter",  True)
size_enum = gen.enum([ gen.const("Low",      int_t, 0, "Low is 0"),
						gen.const("Medium",     int_t, 1, "Medium is 1"),
						gen.const("High",      int_t, 2, "Hight is 2")],
						 "Select from the list")
gen.add("size", int_t, 0, "Select from the list", 1, 0, 3, edit_method=size_enum)
exit(gen.generate(PACKAGE, PACKAGE, "chapter2_"))


注意,.cfg文件使用Python写的。因为文件将由ROS执行,所以需要更改文件权限,使用命令如下:
roscd chapter2_tutorials
chmod a + x cfg / chapter2.cfg
然后打开CMakeList.txt,加入如下代码
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
dynamic_reconfigure

generate_dynamic_reconfigure_options(
cfg / chapter2.cfg

add_dependencies(example4 chapter2_tutorials_gencfg)
现在我们要写具有动态重配置支持的新的节点,在src文件夹中创建一个新的文件,如下所示:
roscd chapter2_tutorials ouch
src / example4.cpp
在文件中加入如下所示代码:

#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>
#include <chapter2_tutorials/chapter2_Config.h>
void callback(chapter2_tutorials::chapter2_Config &config, uint32_t level) 
{
	ROS_INFO("Reconfigure Request: %d %f %s %s %d", 
				config.int_param, config.double_param,  
				config.str_param.c_str(), 
				config.bool_param?"True":"False", 
				config.size);
}
int main(int argc, char **argv) 
{
	ros::init(argc, argv, "example4");
	dynamic_reconfigure::Server<chapter2_tutorials::chapter2_Config> server;
	dynamic_reconfigure::Server<chapter2_tutorials::chapter2_Config>::CallbackType f;
	f = boost::bind(&callback, _1, _2);
	server.setCallback(f);
	ROS_INFO("Spinning node");
	ros::spin();
	return 0;
}


然后在CMakeList.txt中添加如下代码:
add_executable(example4 src / example4.cpp)target_link_libraries
(example4 $ {catkin_LIBRARIES})
编译:
cd~ / dev / catkin_ws /
catkin_make
输入以下命令测试运行:
cd~ / dev / catkin_ws
source devel / setup.bash
roscore
rosrun
rosrun chapter2_tutorials example4
rosrun rqt_reconfigure rqt_reconfigure
在执行最后一个命令以后,你会看到一个新窗口,通过它可以动态配置节点参数。通过动态重配置,可以更高效地开发和测试节点。

猜你喜欢

转载自blog.csdn.net/u010422438/article/details/81233280
ROS