ROS 应用开发入门 客户端Client的编程

ROS是机器人操作系统的简称,本文介绍ROS应用开发,客户端Client的编程。程序的功能是用代码创建一个仿真小乌龟。先是c++代码,然后是python 代码,你也可选择只看一种你熟悉的。

功能包建立

在 ROS 开发应用准备:创建工作空间 一文中建立了ROS工作空间,现在就建立一个功能包:

cd ~/catkin_ws/src

catkin_create_pkg  learning_service std_msgs roscpp rospy geometry_msgs turtlesim

第1行是回到工作空间的src 目录,功能包建立必须在这个目录下运行。

第2行是建立功能包的命令,第一个参数是功能包的名字,这里是learning_service , 接下来是功能包的依赖库,这里是std_msgs roscpp rospy geometry_msgs turtlesim 共5个依赖库。

上面命令执行后,可以在src 目录下看到有一个目录,名字是learning_service,其下有下面内容:

CMakeLists.txt  include  package.xml  scripts  src

其中scripts 是后来手工建立的,用于存放 python代码。

c++ 源代码

在src 目录下,也是~/catkin_ws/src/learning_service/src 目录, 建立一个文件 turtle_spawn.cpp,

cd ~//catkin_ws/src/learning_service/src

nano turtle_spawn.cpp

内容为:

/**
 * 该例程将请求/spawn服务,服务数据类型turtlesim::Spawn
 */

#include <ros/ros.h>
#include <turtlesim/Spawn.h>

int main(int argc, char** argv)
{
    // 初始化ROS节点
	ros::init(argc, argv, "turtle_spawn");

    // 创建节点句柄
	ros::NodeHandle node;

    // 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");

    // 初始化turtlesim::Spawn的请求数据
	turtlesim::Spawn srv;
	srv.request.x = 2.0;
	srv.request.y = 2.0;
	srv.request.name = "turtle2";

    // 请求服务调用
	ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]", 
			 srv.request.x, srv.request.y, srv.request.name.c_str());

	add_turtle.call(srv);

	// 显示服务调用结果
	ROS_INFO("Spwan turtle successfully [name:%s]", srv.response.name.c_str());

	return 0;
};


这个代码有清晰的注释,这是一个实现客户端的基本流程:

初始化ROS节点

创建节点句柄

创建一个服务客户端,连接名为/spawn的service

初始化turtlesim::Spawn的请求数据

请求服务调用

显示服务调用结果

配置cmake文件

在 ~/catkin_ws/src/learning_service/ 目录下,有个CMakeLists.txt 文件,我们需要修改这个文件

cd ~/catkin_ws/src/learning_service

nano CMakeLists.txt 

在这个文件中添加下面2行,

add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})

添加的位置是Build的最后部分,参考下面位置,就是 ## install ## 前面:

# target_link_libraries(${PROJECT_NAME}_node
#   ${catkin_LIBRARIES}
# )

add_executable(turtle_spawn src/turtle_spawn.cpp)
target_link_libraries(turtle_spawn ${catkin_LIBRARIES})

#############
## Install ##
#############

 保存,退出

这样编译配置就完成了。

编译和运行测试

编译必须回到 ~/catkin_ws 目录下

cd ~/catkin_ws

catkin_make

编译后应该source 一次:

source devel/setup.bash

如果编译有错,就要排除错误,然后就运行测试。

打开一个终端,启动ros,执行

roscore

再打开一个终端,运行小乌龟

rosrun turtlesim turtlesim_node

上面是启动测试环境,如果有问题,可以 参看: ROS 下的仿真小乌龟,只是不启动键盘控制。

最后在我们的终端执行:

rosrun learning_service turtle_spawn

执行上面命令后,我们看到多了一个小乌龟,现在2个了。

c++的开发就到此完成了。

python 代码 

为了不和c++混在一起,在~/catkin_ws/src/learning_service/目录下新建一个scripts目录,然后到这个目录下,新建一个turtle_spawn.py 文件

cd ~/catkin_ws/src/learning_service/scripts

nano turtle_spawn.py

文件内容是:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 该例程将请求/spawn服务,服务数据类型turtlesim::Spawn

import sys
import rospy
from turtlesim.srv import Spawn

def turtle_spawn():
	# ROS节点初始化
    rospy.init_node('turtle_spawn')

	# 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
    rospy.wait_for_service('/spawn')
    try:
        add_turtle = rospy.ServiceProxy('/spawn', Spawn)

		# 请求服务调用,输入请求数据
        response = add_turtle(3.0,3.0, 0.0, "turtle3")
        return response.name
    except rospy.ServiceException, e:
        print "Service call failed: %s"%e

if __name__ == "__main__":
	#服务调用并显示调用结果
    print "Spwan turtle successfully [name:%s]" %(turtle_spawn())

代码里有清晰说明,流程是:

ROS节点初始化

发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service

请求服务调用,输入请求数据

python 运行测试

python 可以直接执行,不需要编译,

更改turtle_spawn.py 有执行属性 

chmod +x *.py

这个可以用 ls -l 查核:

同时应该source 一次: 

source ~/catkin_ws/devel/setup.bash

首先需要启动测试环境,一个终端启动roscore, 再一个终端启动小乌龟rosrun turtlesim turtlesim_node,如果有问题,可以 参看: ROS 下的仿真小乌龟,只是不启动键盘控制。 

然后执行如下命令:

rosrun learning_service turtle_spawn.py

执行的结果是多了小乌龟。

源代码也可以在 https://github.com/huchunxu/ros_21_tutorials 下载

介绍到此。
 

猜你喜欢

转载自blog.csdn.net/leon_zeng0/article/details/114994379
今日推荐