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 下载
介绍到此。