ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ROS入门21讲(2)

2022-09-11 10:00:08  阅读:248  来源: 互联网

标签:catkin 21 pose rospy msg velocity vel ROS 入门


 四、创建工作空间与功能包

 1、工作空间

工作空间(workspace):是一个存放工程开发相关文件的文件夹(相当于在IDE中创建的工程文件)。

包含:

  src:代码空间(Source Space),放置功能包的源码

  build:编译空间(Build Space),编译过程中生成的一些中间文件,一般用不到

  devel:开发空间(Development Space),放置开发中生成的可执行文件以及一些库

  install:安装空间(Install Space),放置最终生成(开发后)的可执行文件

 1.1创建工作空间

(1)创建工作空间:

  $ mkdir -p ~/catkin_ws/src  

  $ cd ~/catkin_ws/src

  $ catkin_init_workspace

注意:mkdir -p是递归创建目录;初始化之后会显示一个CMakeLists.txt的文件。

(2)编译工作空间

  $ cd ~/catkin_ws/

  $ catkin_make

注意:此时会产生build、devel以及我们自己创建的src文件,还缺少install的文件

  $ catkin_make install

(3)设置环境变量

  $ source devel/setup.bash

注意:设置环境变量的原因是为了让系统找到我们的工作空间,并且找到对应的功能包。

(4)检查环境变量

  $echo $ROS_PACKAGE_PATH

图示:

 1.2创建功能包

命令: $ catkin_create_pkg <package_name> [depend1] [depend2] [depend3]

(1)创建功能包

  $ cd ~/catkin_ws/src

  $ catkin_create_pkg test_pkg std_msgs rospy roscpp

说明:创建一个测试包,std_msgs是一个标准库,rospy是py依赖包,roscpp是C++依赖包。

(2)编译功能包

  $ cd ~/catkin_ws

  $ catkin_make

注意:同一个工作空间下,不允许存在同名功能包;不同工作空间下,允许存在同名功能包。

test_pkg测试包包含下面四个文件:

  include:头文件

  src:源码存放处

  CMakeLists.txt:描述功能包里面的编译规则,CMake是个编译器

  package.xml:用xml语言描述的功能包的相关信息。

五、发布者Publisher的编程实现

1、话题模型

2、创建功能包

命令:

  $ cd ~/catkin_ws/src

  $ catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim

3、创建发布者代码

如何实现一个发布者?

① 初始化ROS节点;

② 向ROS Master 注册节点信息,包括发布的话题名和话题中的消息类型;

③创建消息数据;

④按照一定频率循环发布消息

C++代码如下:

 1 /**
 2  * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 3  */
 4  
 5 #include <ros/ros.h>
 6 #include <geometry_msgs/Twist.h>
 7 
 8 int main(int argc, char **argv)
 9 {
10     // ROS节点初始化
11     ros::init(argc, argv, "velocity_publisher");
12 
13     // 创建节点句柄
14     ros::NodeHandle n;
15 
16     // 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
17     ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
18 
19     // 设置循环的频率
20     ros::Rate loop_rate(10);
21 
22     int count = 0;
23     while (ros::ok())
24     {
25         // 初始化geometry_msgs::Twist类型的消息
26         geometry_msgs::Twist vel_msg;
27         vel_msg.linear.x = 0.5;
28         vel_msg.angular.z = 0.2;
29 
30         // 发布消息
31         turtle_vel_pub.publish(vel_msg);
32         ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
33                 vel_msg.linear.x, vel_msg.angular.z);
34 
35         // 按照循环频率延时
36         loop_rate.sleep();
37     }
38 
39     return 0;
40 }
View Code

python代码如下:

#!/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
View Code

注意:在python文件中一定要注意它的权限,在属性里面找权限

 4、配置发布者代码编译规则

如何配置CMakeLists.txt中的编译规则?

  ①设置需要编译的代码和生成的可执行文件;

  ②设置链接库;

在 CMakeLists.txt的文件添加以下代码:

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

注意:add_executable是为了描述把哪一个程序编译成可执行文件的;add_executable(A B.cpp)是把B.cpp编译成A这个可执行文件的

target_link_libraries是将可执行文件与ROS的一些库做链接的

注意:

①配置环境变量步骤:

  回到主文件夹,Ctrl+H将隐藏的.bashrc文件打开,在最后一行将工作空间的环境变量设置进去(注意路径) 

source /home/gy/catkin_ws/devel/setup.bash

这样输入完就不用每次在终端里输入source命令了,但需要重新启动终端才生效

②编译后的路径在devel/liblearning_topic

 5、编译并运行发布者

命令:

  $ cd ~/catkin_ws

  $ catkin_make

  $ source devle/setup.bash

  $ roscore

  $ rosrun turtlesim turtlesim_node

  $ rosrun learning_topic velocity_publisher

 六、订阅者Subscriber 的编程实现

1、话题模型

如何实现一个订阅者?

① 初始化ROS节点

② 订阅需要的话题

③ 循环等待话题消息,接收到消息后进入回调函数

④ 在回调函数中完成消息处理

2、创建订阅者代码

C++代码如下:

 1 /**
 2  * 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
 3  */
 4  
 5 #include <ros/ros.h>
 6 #include "turtlesim/Pose.h"
 7 
 8 // 接收到订阅的消息后,会进入消息回调函数
 9 void poseCallback(const turtlesim::Pose::ConstPtr& msg)
10 {
11     // 将接收到的消息打印出来
12     ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
13 }
14 
15 int main(int argc, char **argv)
16 {
17     // 初始化ROS节点
18     ros::init(argc, argv, "pose_subscriber");
19 
20     // 创建节点句柄
21     ros::NodeHandle n;
22 
23     // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
24     ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
25 
26     // 循环等待回调函数
27     ros::spin();
28 
29     return 0;
30 }
View Code

python代码如下:

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

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

# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose

import rospy
from turtlesim.msg import Pose

def poseCallback(msg):
    rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)

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

    # 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    rospy.Subscriber("/turtle1/pose", Pose, poseCallback)

    # 循环等待回调函数
    rospy.spin()

if __name__ == '__main__':
    pose_subscriber()
View Code

3、配置订阅者代码编译规则

如何配置CMakeLists.txt中的编译规则?

  ①设置需要编译的代码和生成的可执行文件;

  ②设置链接库;

在 CMakeLists.txt的文件添加以下代码:

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

4、编译并运行订阅者

命令:

  $ cd ~/catkin_ws

  $ catkin_make

  $ source devle/setup.bash

  $ roscore

  $ rosrun turtlesim turtlesim_node

  $ rosrun learning_topic velocity_publisher

标签:catkin,21,pose,rospy,msg,velocity,vel,ROS,入门
来源: https://www.cnblogs.com/Gaowaly/p/16671175.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有