【Autolabor初级教程】ROS机器人入门 通信机制实操 个人学习笔记

【Autolabor初级教程】ROS机器人入门 通信机制实操 笔记

实操01_话题发布

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

结果演示:

01_案例01_乌龟画圆

实现分析:

  1. 乌龟运动控制实现有两个关键节点,turtlesim_node(乌龟运动显示),turtle_teleop_key(运动键盘控制),二者基于订阅发布模式实现通信
  2. 要想自己实现乌龟运动控制,要先获取两节点之间通信的话题和消息(计算图结合ros命令)
  3. 编写运动控制节点,通过指定的话题,按照一定的逻辑发布消息
实现

A.获取节点间通信消息和话题

获取通信话题:

  1. 通过计算图rqt_graph

    image-20240325190502990

  2. 通过rostopic list指令

    image-20240325190838182

获取话题消息:

  1. 根据话题获取所使用的消息类型rostopic inforostopic type

    image-20240325191403607

  2. 获取消息格式rosmsg showrosmsg info

    image-20240325191219146

Ps:这里可以使用rostopic pub进行通信,完成任务

image-20240325191642002

B.编写代码实现发布节点

#include "ros/ros.h"
#include "geometry_msgs/Twist.h"

int main(int argc, char *argv[])
{
    /* code */
    ros::init(argc,argv,"circle");
    ros::NodeHandle np;
    ros::Publisher pub = np.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1000);
    geometry_msgs::Twist msg;
    msg.linear.x = 1;
    msg.linear.y = 0;
    msg.linear.z = 0;
    msg.angular.x = 0;
    msg.angular.y = 0;
    msg.angular.z = 1;
    ros::Rate rate(10);
    while(ros::ok())
    {
        pub.publish(msg);

        ros::spinOnce();
        rate.sleep();
    }
    return 0;
}

运行结果

image-20240325201258955

实操02_话题订阅

需求描述: 已知turtlesim中的乌龟显示节点,会发布当前乌龟的位姿(窗体中乌龟的坐标以及朝向),要求控制乌龟运动,并时时打印当前乌龟的位姿。

结果演示:

案例02_乌龟位姿

实现

A.获取节点间通信消息和话题

image-20240325214556709

B.编写代码实现订阅节点

#include "ros/ros.h"
#include "turtlesim/Pose.h"

void msg_handle(const turtlesim::Pose::ConstPtr &msg)
{
    ROS_INFO("x:%.6f",msg->x);
    ROS_INFO("y:%.6f",msg->y);
    ROS_INFO("theta:%.6f",msg->theta);
    ROS_INFO("linear_velocity:%.6f",msg->linear_velocity);
    ROS_INFO("angular_velocity:%.6f",msg->angular_velocity);
}

int main(int argc, char *argv[])
{
    /* code */
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"echo");
    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe<turtlesim::Pose>("/turtle1/pose",1000,msg_handle);
    ros::spin();
    return 0;
}

运行结果

image-20240325214757043

实操03_服务调用

**需求描述:**编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。

结果演示:

02_案例2_生成小乌龟

实现

A.获取节点间服务与服务消息信息

image-20240326135013342

B.编写代码实现客户端请求

#include "ros/ros.h"
#include "turtlesim/Spawn.h"

int main(int argc, char *argv[])
{
    /* code */
    setlocale(LC_ALL,"");

    ros::init(argc,argv,"spawn");
    ros::NodeHandle np;

    ros::ServiceClient client = np.serviceClient<turtlesim::Spawn>("spawn");

    turtlesim::Spawn spawn;
    spawn.request.name = "haha";
    spawn.request.theta = 1.57;
    spawn.request.x = 7;
    spawn.request.y = 7;

    client.waitForExistence();

    bool flag = client.call(spawn);
    if(flag)
    {
        ROS_INFO("%s创建成功!",spawn.response.name.c_str());
    }else{
        ROS_INFO("创建失败!");
    }

    return 0;
}

运行结果

image-20240326142840139

实操04_参数设置

需求描述: 修改turtlesim乌龟显示节点窗体的背景色,已知背景色是通过参数服务器的方式以 rgb 方式设置的。

结果演示:

03_案例3_改变背景色

实现

A.参数名获取

image-20240326144358409

image-20240326144501399

Ps:需要设置相应参数后重新打开turtlesim_node才能刷新颜色

B.编写代码实现参数修改

#include "ros/ros.h"

int main(int argc, char *argv[])
{
    ros::init(argc,argv,"color");

    ros::NodeHandle nh;

    nh.setParam("/turtlesim/background_b",0);
    nh.setParam("/turtlesim/background_g",0);
    nh.setParam("/turtlesim/background_r",255);

    return 0;
}

运行结果

image-20240326170003502

Note:

刚开始运行的launch文件如下:

<launch>
    <node pkg="demo_color" type="color" name="color" output="screen"/>
    <node pkg="turtlesim" type="turtlesim_node" name="sim" output="screen"/>
</launch>

运行结果背景色始终为蓝色,经过查询后得知(GPT)

在ROS中,launch 文件中定义的节点通常是并行启动的,而不是顺序执行的。

但是没有找到合适的修改launch文件的方法,暂时的解决方案是在终端分别执行命令roscorerosrun demo_color colorrosrun turtlesim turtlesim_node

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咕噜咕噜咕噜噜噜噜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值