当前位置 博文首页 > txr152111的博客:22th ROS通信机制实操01——话题(topic)(C++/

    txr152111的博客:22th ROS通信机制实操01——话题(topic)(C++/

    作者:[db:作者] 时间:2021-09-01 22:07

    一、引言

    本节主要是通过ROS内置的turtlesim案例,结合已经介绍ROS命令获取节点、话题、话题消息、服务、服务消息与参数的信息,最终再以编码的方式实现乌龟运动的控制、乌龟位姿的订阅、乌龟生成与乌龟窗体背景颜色的修改。

    二、话题发布

    2.1?分析问题

    需求描述:编码实现乌龟运动控制,让小乌龟做圆周运动。

    实现分析:

    1. 乌龟运动控制实现,关键节点有两个,一个是乌龟运动显示节点 turtlesim_node,另一个是控制节点,二者是订阅发布模式实现通信的,乌龟运动显示节点直接调用即可,运动控制节点之前是使用的 turtle_teleop_key通过键盘 控制,现在需要自定义控制节点。
    2. 控制节点自实现时,首先需要了解控制节点与显示节点通信使用的话题与消息,可以使用ros命令结合计算图来获取。
    3. 了解了话题与消息之后,通过 C++ 或 Python 编写运动控制节点,通过指定的话题,按照一定的逻辑发布消息即可。

    实现流程:

    1. 通过计算图结合ros命令获取话题与消息信息。
    2. 编码实现运动控制节点。
    3. 启动 roscore、turtlesim_node 以及自定义的控制节点,查看运行结果。

    最终效果:

    2.2 话题及消息格式的获取

    先打开小海龟仿真器:

    roscore
    rosrun turtlesim turtlesim_node 
    rosrun turtlesim turtle_teleop_key 
    

    然后同rqt_graph来获得话题:

    获取消息有两种:

    rostopic type /turtle1/cmd_vel

    rostopic info /turtle1/cmd_vel

    获取消息类型:

    rosmsg show geometry_msgs/Twist

    rosmsg info geometry_msgs/Twist

    ?

    ?在小乌龟案例中,只有x方向的移动和z方向的转动

    2.3 代码实现(C++)

    新建功能包,包名为plumbing_test、依赖为rospy? roscpp? std_msgs?? geometry_msgs?

    在src下新建一个文件,为test01_pub_twist.cpp

    #include<ros/ros.h>
    #include<geometry_msgs/Twist.h>
    /*
        需求:发布速度消息
                话题: /turtle1/cmd_vel
                消息:geometry_msgs/Twist
        操作:
            1.包含头文件
            2.节点初始化
            3.创建句柄
            4.创建发布对象
            5.发布逻辑
            6.spinOnce()
    */
    
    int main(int argc, char *argv[])
    {
        ros::init(argc,argv,"HaiGui");
        ros::NodeHandle nh;
        ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);
    
        ros::Rate   rate(10);  //设置发布频率
    
        geometry_msgs::Twist twist;
    
        twist.linear.x = 1.0;
        twist.linear.y = 0.0;
        twist.linear.z = 0.0;
    
        twist.angular.x = 0.0;
        twist.angular.y = 0.0;
        twist.angular.z = 1.0;   
    
        while (ros::ok())
        {
           pub.publish(twist);
           rate.sleep();
           ros::spinOnce();
        }
        return 0;
    }
    

    ?编译:Ctrl +? Shift + B

    测试:

    ?2.4 代码实现(Python)

    新建文件夹scripts,新建py文件。

    #!/usr/bin/env python
    # -*- coding:UTF-8 -*-    
    import rospy
    from geometry_msgs.msg import Twist
    """
         发布方:发布速度消息
                话题:  /turtle1/cmd_vel
                消息:geometry_msgs/Twist
    
      
        实现流程:
            1.导包
            2.初始化 ROS 节点
            3.创建发布者对象
            4.循环发布运动控制消息
    """
    
    
    if __name__ =="__main__":
        # 2.初始化 ROS 节点
        rospy.init_node("control_circle_p")
        # 3.创建发布者对象
        pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=10)
        # 4.循环发布运动控制消息
        rate = rospy.Rate(10)
        msg = Twist()
        msg.linear.x = 1.0
        msg.linear.y = 0.0
        msg.linear.z = 0.0
        msg.angular.x = 0.0
        msg.angular.y = 0.0
        msg.angular.z = 0.5
    
        while not rospy.is_shutdown():
            pub.publish(msg)
            rate.sleep()
    

    添加可执行权限:

    配置CMakeLists.txt文件:

    ?编译

    测试:

    cs