ROS 应用开发入门 发布者Publisher的编程

ROS是机器人操作系统的简称,本文介绍我的第一个ROS应用开发,发布者Publisher的编程。程序很简单,代码就几行,但是让仿真小乌龟运动起来。先是c++代码,然后是python 代码,你也可选择只看一种你熟悉的。

功能包建立

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

cd ~/catkin_ws/src

catkin_create_pkg  learning_topic std_msgs roscpp rospy geometry_msgs turtlesim

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

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

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

CMakeLists.txt  include  package.xml  scripts  src

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

c++ 源代码

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

cd ~/catkin_ws/src/learning_topic/src

nano velocity_publisher.cpp

内容为:

/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 */
 
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

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

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

	// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
	ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

	// 设置循环的频率
	ros::Rate loop_rate(10);

	int count = 0;
	while (ros::ok())
	{
	    // 初始化geometry_msgs::Twist类型的消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z = 0.2;

	    // 发布消息
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z);

	    // 按照循环频率延时
	    loop_rate.sleep();
	}

	return 0;
}

这个代码有清晰的注释,这是一个实现发布者的基本流程:

初始化ROS节点

创建节点句柄

创建一个发布者,包含话题名,消息类型

设置循环频率

循环

配置cmake文件

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

cd  ~/catkin_ws/src/learning_topic/

nano CMakeLists.txt 

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

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

添加的位置是参考下面位置,就是 ## install ## 前面:

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

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


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

 保存,退出

这样编译配置就完成了。

编译和运行测试

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

cd ~/catkin_ws

catkin_make

编译后应该source 一次:

source devel/setup.bash

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

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

roscore

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

rosrun turtlesim turtlesim_node

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

最后在我们的终端执行:

rosrun learning_topic velocity_publisher

我打开文件管理器,下面位置有个velocity_publisher

执行上面命令后,我们看到小乌龟在转圆圈。

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

python 代码 

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

cd ~/catkin_ws/src/learning_topic/scripts

nano velocity_publisher.py

文件内容是:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist

import rospy
from geometry_msgs.msg import Twist

def velocity_publisher():
	# ROS节点初始化
    rospy.init_node('velocity_publisher', anonymous=True)

	# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
    turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)

	#设置循环的频率
    rate = rospy.Rate(10) 

    while not rospy.is_shutdown():
		# 初始化geometry_msgs::Twist类型的消息
        vel_msg = Twist()
        vel_msg.linear.x = 0.5
        vel_msg.angular.z = 0.2

		# 发布消息
        turtle_vel_pub.publish(vel_msg)
    	rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z)

		# 按照循环频率延时
        rate.sleep()

if __name__ == '__main__':
    try:
        velocity_publisher()
    except rospy.ROSInterruptException:
        pass

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

ROS节点初始化

创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10

设置循环的频率

循环

python 运行测试

更改velocity_publisher.py 有执行属性 

chmod +x *.py

这个可以用 ls -l 查核:

leon@ubuntu:~/catkin_ws/src/learning_topic/scripts$ ls -l
total 8
-rwxrwxrwx 1 leon leon  824 May  8  2020 pose_subscriber.py
-rwxrwxrwx 1 leon leon 1275 May  8  2020 velocity_publisher.py
leon@ubuntu:~/catkin_ws/src/learning_topic/scripts$ 

python 不用编译,

但是要打开一个终端,启动roscore ,再打开一个终端 启动小乌龟rosrun turtlesim turtlesim_node 

还有记得source  ~/catkin_ws/devel/setup.bash

最后直接执行就可以,

rosrun learning_topic  velocity_publisher.py
执行的结果是小乌龟转圆圈,和c++ 执行一样,可以参看上面c++的示图。

显示信息流关系

再打开一个新的终端,并输入命令:

rqt_graph

可以看到如下信息关系图:

信息前部分是话题/turtle/cmd_vel 就是发布者Publisher和仿真乌龟间的信息流。

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

介绍到此。

猜你喜欢

转载自blog.csdn.net/leon_zeng0/article/details/114862966