基于ROS的消息发布与订阅
1. 创建资源
开始实验之前,您需要先创建实验相关资源。
- 在实验室页面,单击创建资源。
- (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。
说明:资源创建过程需要3~5分钟(视资源不同开通时间有所差异,ACK等资源开通时间较长)。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。
实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。
资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息
2. 进入Docker镜像
打开火狐浏览器。
通过RAM用户名密码登录页面,输入子用户密码登录账号。
登陆后选择左侧产品与服务中的云服务器ECS。
在所有云服务器中通过左下角地域找到正确的服务器并点击远程连接。
选择通过VNC远程连接。
选择重置VNC密码并设置新的密码后登录。
设置好进入各选项后进入Ubuntu桌面。
右键打开终端,输入sudo docker run -it --rm -p 6080:80 aliyun_demo命令运行镜像aliyun_demo。
运行成功后打开浏览器,在地址一栏输入127.0.0.1:6080进入镜像系统。
3. 代码部分【python实现消息的发布与订阅】
python版本的节点发布与订阅由pub1.py和sub1.py实现。
在pub1.py中首先新建一个名为pub1的节点。
if __name__ == '__main__': rospy.init_node("pub1") test1() rospy.spin() pass
在函数test1中创建/test1主题,发布的是Twist类型的消息。随后新建一个Twist消息并设置好内容后发布。
def test1(): while True: pub = rospy.Publisher("/test1", Twist, queue_size=10) twist = Twist() twist.linear.x = 1.0 twist.angular.z = 1.0 pub.publish(twist)
在sub1.py中首先新建一个名为sub1的节点并订阅/test1主题。
if __name__ == '__main__': rospy.init_node("sub1") rospy.Subscriber("/test1", Twist, test1) rospy.spin() pass
随后在回调函数test1中打印消息。
def test1(msg): print(msg) pass
4. 代码部分【C++实现消息的发布与订阅】
C++版本的节点发布与订阅由pub2.cpp和sub2.cpp实现。
在pub2.cpp中首先新建一个名为pub2的节点。创建/test2主题,发布的是Twist类型的消息。随后新建一个Twist消息并设置好内容后发布。
#include "ros/ros.h" #include "geometry_msgs/Twist.h" int main(int argc, char** argv) { ros::init(argc, argv, "pub2"); ros::NodeHandle node; geometry_msgs::Twist msg; ros::Publisher pub = node.advertise<geometry_msgs::Twist>("/test2", 10); while (ros::ok()) { ros::spinOnce(); msg.linear.x = 1.0; msg.angular.z = 1.0; pub.publish(msg); } return 0; };
在sub2.cpp中首先新建一个名为sub2的节点并订阅/test2主题。在回调函数test2中打印消息。
int main(int argc, char **argv) { ros::init(argc, argv, "sub2"); ros::NodeHandle node; ros::Subscriber sub = node.subscribe("/test2", 1, test2); while (ros::ok()) { ros::spinOnce(); } return 0; } void test2(const geometry_msgs::Twist::ConstPtr& msg) { ROS_INFO("speed:%.2f,steer:%.2f",msg->linear.x,msg->angular.z); }
5. 实验操作
新建终端,输出roscore启动Master。
打开终端,输入如下命令开启pub1。
cd aliyun_demo source devel/setup.bash rosrun raceworld pub1.py
打开终端,输入如下命令开启sub1。终端中可以看到输出。
cd aliyun_demo source devel/setup.bash rosrun raceworld sub1.py
打开终端,输入如下命令开启pub2。
cd aliyun_demo source devel/setup.bash rosrun raceworld pub2
打开终端,输入如下命令开启sub2。终端中可以看到输出。
cd aliyun_demo source devel/setup.bash rosrun raceworld sub2
打开终端,输入rostopic list命令查看当前所有rostopic。可以找到我们代码中新建的/test1和/test2主题。
分别输入rostopic info /test1和rostopic info /test2可以查看每个主题的发布者与订阅者。
实验链接:https://developer.aliyun.com/adc/scenario/271ab334484845b8acb6ddc35a007d81