【Addicted TO ROS】Publisher的编程实现

本实践资源来自《【古月居】古月 · ROS入门21讲》:https://www.bilibili.com/video/BV1zt411G7Vn?p=10

创建功能包

 cd catkin_ws/src/
 catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
 touch velocity_publisher.cpp

【Addicted TO ROS】Publisher的编程实现_第1张图片

实现一个发布者步骤

  • 初始化:初始化ROS节点;
  • 注册 : 向ROSMaster注册节点信息,包括发布的话题名和话题中的消息类型;
  • 创建消息数据
  • 发布消息 : 按一定的频率循环发布消息
  • velocity_publisher.cpp文件内容
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************/

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

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;
}

配置编译规则

  • 设置需要 编译的代码和生成的可执行文件
  • 设置链接库

src/CMakeLists.txt下添加编译规则

//将代码编译为可执行文件
add_executable(velocity_publisher src/velocity_publisher)
//对代码做可执行文件的链接
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

编译

cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore

【Addicted TO ROS】Publisher的编程实现_第2张图片

  • 重新打开一个终端,运行还贵仿真器
rosrun turtlesim turtlesim_node 
  • 再次打开一个终端,运行我们的节点
rosrun learning_topic velocity_publisher 
  • 效果如下

 海龟以线速度0.5m/s,角速度0.2rad/s做循环圆周运动;
【Addicted TO ROS】Publisher的编程实现_第3张图片

每次打开终端都需要source一下devel/setup.bash文件,可以选择讲该环境变量写入.bash文件;

  • 方式一:使用命令添加
echo "source catkin_ws/devel/setup.bash" >> ~/.bashrc

在这里插入图片描述

  • 方式二:打开/.bashrc文件,加入环境变量source catkin_ws/devel/setup.bash

使用python

在learning_topic新建scripts文件夹,然后创建一个velocity_publisher.py文件;
velocity_publisher.py文件代码:

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

########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
########################################################################

# 该例程将发布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


velocity_publisher.py文件添加可执行权限;
【Addicted TO ROS】Publisher的编程实现_第4张图片
运行方式与.cpp文件类似,只是.py文件不需要编译

你可能感兴趣的:(ROS,notes)