ros话题与服务通讯(以四个实例呈现)

注意事项:

  1. 文件只能是c++或者python,一开始后缀为.c时会报错
  2. 可以利用tab键补齐命令
  3. 导入依赖一定要注意拼写情况,若遗漏则依据报错情况去package文件中修改一下即可
  4. setlocale(LC_ALL,"")命令可以解决输出乱码问题
  5. 参数设置中,此处的小乌龟要从终端生成,不能用之前的launch文件,否则会使参数服务器运行失效

终端简单命令提示:

  1. cd:切换路径
  2. vi:编辑文件
  3. ls:显示该路径下内容

  1. esc+u:撤回
  2. (:x):保存

helloworld

引言:借助helloworld了解基于vscode搭建程序框架

流程:
1.创建一个工作空间:

mkdir -p 自定义空间名称/src

cd 自定义空间名称

catkin_make

1.1补充

1.1.1 code . :将该文件在vscode中打开,也可以直接拖动文件进入vs code界面中

1.1.2control+shift+B进入json中进行配置

{

"version": "2.0.0",

"tasks": [

{

"label": "catkin_make:debug", //代表提示的描述性信息

"type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行

"command": "catkin_make",//这个是我们需要运行的命令

"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”

"group": {"kind":"build","isDefault":true},

"presentation": {

"reveal": "always"//可选always或者silence,代表是否输出信息

},

"problemMatcher": "$msCompile"

}

]

}

2.进入src创建ros包并添加依赖

cd src

catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs

2.1补充

2.1.1也可以在vscode工作空间中的src中利用create catkin package去配置包以及依赖

3.编辑源文件(.cpp文件)

#include "ros/ros.h"

int main(int argc, char *argv[])

{

    //解决中文乱码问题

    setlocale(LC_ALL,"");

    //执行节点初始化

    ros::init(argc,argv,"HelloVSCode");

    //输出日志

    ROS_INFO("Hello VSCode!!!哈哈哈哈哈哈哈哈哈哈");

    return 0;

}

4.编辑配置文件

释放136行add

释放149-151target

4.1补充:

4.1.1 此处释放后将前面那块语句用你的后续运行文件名称替换,其实也可以不一样,此处只是起到了一个映射的作用

5.编译并执行

在文件中启动终端,或者cd 该路径

catkin_make

roscore

source ./devel/setup.bash

rosrun 包名 C++节点

任务一:话题发布

1.导入依赖:roscpp rospy std_msgs geometry_msgs

2.配置json文件

3.c++代码:

#include "ros/ros.h"

#include "geometry_msgs/Twist.h"



int main(int argc, char *argv[])

{

    setlocale(LC_ALL,"");

    // 2.初始化 ROS 节点

    ros::init(argc,argv,"control");

    ros::NodeHandle nh;

    // 3.创建发布者对象 

    ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",1000);

    // 4.循环发布运动控制消息

    //4-1.组织消息

    geometry_msgs::Twist msg;

    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 = 2.0;



    //4-2.设置发送频率

    ros::Rate r(10);

    //4-3.循环发送

    while (ros::ok())

    {

        pub.publish(msg);

        ros::spinOnce();

    }

    return 0;

}

4.配置cmake

5.启动终端:roscore

6.启动节点:rosrun turtlesim turtlesim_node

7.运行:

cd task01

source ./devel/setup.bash

rosrun tplaunch 1

任务二:话题订阅

1.编辑launch文件

<!--启动乌龟GUI与键盘控制节点-->

<launch>

    <node pkg= "turtlesim" type="turtlesim_node" name="turtle1" output="screen" />

    <node pkg= "turtlesim" type="turtle_teleop_key" name="key" output="screen" />

</launch>

开启终端运行:

source ./devel/setup.bash

roslaunch tplaunch start_turtle.launch

2.配置包时增加:turtlesim

3.c++代码:

#include "ros/ros.h"

#include "turtlesim/Pose.h"



void doPose(const turtlesim::Pose::ConstPtr& p)

{

    ROS_INFO("乌龟位姿信息:x=%.2f,y=%.2f,theta=%.2f,lv=%.2f,av=%.2f",

        p->x,p->y,p->theta,p->linear_velocity,p->angular_velocity

    );

}



int main(int argc, char *argv[])

{

    setlocale(LC_ALL,"");

    // 2.初始化 ROS 节点

    ros::init(argc,argv,"sub_pose");

    // 3.创建 ROS 句柄

    ros::NodeHandle nh;

    // 4.创建订阅者对象

    ros::Subscriber sub = nh.subscribe<turtlesim::Pose>("/turtle1/pose",1000,doPose);

    // 5.回调函数处理订阅的数据

    // 6.spin

    ros::spin();

    return 0;

}

4.打开终端:

cd task01

source ./devel/setup.bash

rosrun tplaunch 2

任务三:服务调用

1.启动launch文件

2.c++代码:

#include "ros/ros.h"

#include "turtlesim/Spawn.h"



int main(int argc, char *argv[])

{

    setlocale(LC_ALL,"");

    // 2.初始化 ros 节点

    ros::init(argc,argv,"set_turtle");

    // 3.创建 ros 句柄

    ros::NodeHandle nh;

    // 4.创建 service 客户端

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

    // 5.等待服务启动

    // client.waitForExistence();

    ros::service::waitForService("/spawn");

    // 6.发送请求

    turtlesim::Spawn spawn;

    spawn.request.x = 1.0;

    spawn.request.y = 1.0;

    spawn.request.theta = 1.57;

    spawn.request.name = "turtle2";

    bool flag = client.call(spawn);

    // 7.处理响应结果

    if (flag)

    {

        ROS_INFO("新的乌龟生成,名字:%s",spawn.response.name.c_str());

    } 

    else 

    {

        ROS_INFO("乌龟生成失败!!!");

    }

    return 0;

}

3.打开终端

source ./devel/setup.bash

rosrun tplaunch 3

任务四:参数设置

1.c++代码:

#include "ros/ros.h"

int main(int argc, char *argv[])

{

    ros::init(argc,argv,"colour_change");

    ros::NodeHandle nh("turtlesim");

    //ros::NodeHandle nh;



    // ros::param::set("/turtlesim/background_r",0);

    // ros::param::set("/turtlesim/background_g",0);

    // ros::param::set("/turtlesim/background_b",0);



    nh.setParam("background_r",0);

    nh.setParam("background_g",0);

    nh.setParam("background_b",0);





    return 0;

}

2.打开终端:

roscore

rosrun turtlesim turtlesim_node 

cd task01

source ./devel/setup.bash

rosrun tplaunch 4

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值