《Ubuntu20.04环境下的ROS学习笔记5》

一、订阅者Subscriber的编程实现

        在上一小节中我们是用了Pulisher发布者通过话题来控制海龟运动的程序。这一节我们将会处于Subscriber订阅者的视角去接收海龟运动的路径。

二、使用原来的功能包在里面再添加一个CPP

cd ~/catkin_ws/src/learning_topic/src

touch pose_subscriber.cpp

同样要使用ifconfig命令来查看自己的ip,不能的话就用sudo apt install net-tools安装相关工具

然后使用nodepad++连接,编辑相关代码。

/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************/

/**
 * 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
 */
 
#include <ros/ros.h>
#include "turtlesim/Pose.h"

// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}

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

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

    // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);

    // 循环等待回调函数
    ros::spin();

    return 0;
}

三、修改CMakeLists.txt编译规则。

这里将继续添加两句编译代码,上次我们编写的可以不用删掉。

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

四、编译并运行订阅者。

cd ~/catkin_ws

catkin_make

这里如果你按照我上节一样修改了~/目录下的.bashrc的话你是不需要使用

source ~/catkin_ws/devel/setup.bash

如果没有那么请运行一下以上代码。

接下来我们来运行一下我们的代码,这里我们打开5个终端。

第一个终端输入: roscore

第二个终端输入: rosrun turtlesim turtlesim_node

第三个终端输入: rosrun learning_topic pose_subscriber

第四个终端输入: rosrun turtlesim turtle_teleop_key

第五个终端输入: rqt_graph

那么当你使用键盘控制第四个终端的时候,你将会看到第三个终端里面的x , y值迅速发生变化。这就实现了海龟的位置订阅。

五、如何编写和运行python程序。

首先我们需要建一个文件夹专门存放python的程序。

cd ~/catkin_ws/src/learning

mkdir scripts

cd scripts

touch pose_subscriber.py

#!/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()


这里我们可以用ls -l来查看一下文件权限,您可以看到pose_subscriber.py前面是-rw-rw-r--

这里简单说明一下

第一个部分: -  代表着这是一个一般的文件,而不是文件夹

第二个部分:rw-  代表User着可读可写

第三个部分:rw-  代表Group可读可写

第四个部分:r--  代表Other仅仅可读

同时 r = 4 , w = 2 , x = 1。

我们需要执行这个python程序,所以我们需要给这个文件加权限。

chmod 775 pose_subscriber.py

再ls -l看看

那么和运行C++一样要打开5个终端,

第一个终端输入: roscore

第二个终端输入: rosrun turtlesim turtlesim_node

第三个终端输入: rosrun learning_topic pose_subscriber.py

这里如果有报错,那么请看后面 六、常见报错解决。

第四个终端输入: rosrun turtlesim turtle_teleop_key

第五个终端输入: rqt_graph

六、常见的报错解决

第一个问题就是这里会报错,说 /usr/bin/env: “python\r”: 没有那个文件或目录

这是由于您的代码是使用windows环境编辑的原因,您可以使用这五条命令

cd ~/catkin_ws/src/learning/scripts/

vim pose_subscriber.py

set :ff

set :ff=unix

:wq

参考 https://www.cnblogs.com/wind-under-the-wing/p/14122766.html

第二个问题说 ImportError: No module named yaml

这里是由于您的Ubuntu环境中有两个python。(如果您是按照我的博客来的话正常情况是不会有这个问题的。《Ubuntu20.04环境下的ROS学习笔记0》-CSDN博客

例如我的电脑里面有python2.7.18,我们把python2.7 给删掉即可。

1、卸载python2.7

sudo apt-get remove python2.7

2、卸载python2.7及其依赖

sudo apt-get remove --auto-remove python2.7

3、清除python2.7的一些配置文件

sudo apt-get purge python2.7

sudo apt-get purge --auto-remove python2.7

参考ubuntu完全卸载python2.7_ubuntu 卸载python2.7-CSDN博客

第三个问题说 /usr/bin/env: “python”: 没有那个文件或目录

whereis python3

sudo ln -s /usr/bin/python3 /usr/bin/python

参考 https://www.cnblogs.com/kaifatu/p/16924757.html

报错总结:

嘶~,经过上面一些列解决方案,看来最开始我们只用把

sudo ln -s /usr/bin/python3 /usr/bin/python\r

会不会直接好了呢。嘿嘿,之后试试。

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值