一、订阅者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
会不会直接好了呢。嘿嘿,之后试试。