注意事项+vscode的一些环境配置(有一些自己的踩坑经历):1.打开有道,百度翻译等,会对ubuntu中的vscode 终端 产生影响,主要体现在复制粘贴和总是莫名其妙的出现 ctrl+c,从而使终端结束运行。
1.每次打开新的终端时,都要去工作空间的根目录source(语句为:source devel/setup.bash)一下,(特别是在这之间:catkin_make 之后,运行节点之前),否则运行节点报错或者直接就找不到节点。
2.发布方和订阅方的节点可以放在 一个功能包下,也可以放在不同的功能包下。
3.发布者,订阅者代码编写,如果函数忘记了,可以去ros wiki的教程 上面去找,也可以(框架留心里,函数到处找)。
3.在调用函数的时候,除了代码vs code 本身提示外,形参怎么写,ctrl+鼠标左键也可以调出。
4.在vscode中,其实可以快捷键编译。
在vscode界面中,然后按快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build
可以点击配置设置为默认,修改.vscode/tasks.json 文件
然后把里面的代码替换为如下代码:
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"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"
}
]
}
5.编写*.cpp文件时,代码无法补齐,这和vscode环境配置有关系。
只需要在这个地方,改成C++17就可以了,如图:
----------------------------------------------2022.3.1补 vscode的配置信息---------------------------------------
进行ROS开发:在scode中需要添加的插件为:ROS,CMake,C++,python,chinese(汉译)
(以上都是微软的(好像就除了CMake不是),一般是下载量最多的,而且说是说下这五种,但是下了之后,scode会多下很多其它的软件,但是无所谓,多就多了)
-------------------------------------------------------------------------------------------------------------------------
一 . 概念
前面已经讲了如何创建安装包和工作空间。这里只会把流程贴出来,不会细讲。
发布者代码框架为:
1.包含头文件
2.初始化节点
3.创建句柄
4.创建句柄对象,即创建发布者
5.创建发布逻辑
6.ros::spinonce
订阅者代码框架为:
1.包含头文件
2.初始化节点
3.创建句柄
4.创建句柄对象,即创建订阅者
5.编写回调函数
6.ros::spin();
二. 创建工作空间和软件包
开始编写程序之前,我已经假设你已经创建好了工作空间。
如我的,工作空间为:
mkdir -p /catkin_ws/src
cd catkin_ws
catkin_make
创建的软件包为:
cd src
catkin_create_pkg topic_pub_sub std_msgs rospy roscpp
然后回到根目录catkin_ws,右键打开终端,输入code . 此时就会打开vscode编辑器,就可以进行开发了。
三.编写发布者部分
1.在~/catkin_ws_example/src/topic_pub_sub/src文件下新建一个topic_pub.cpp文件(文件命名随便你取,后面对应上就行),在这个cpp文件中加入如下代码:
//1.包含头文件
#include
#include// 引入这个头文件,是因为等会发布的话题消息是这种类型的
/*
订阅方实现:
1.包含头文件
2.初始化ROS节点
3.创建节点句柄
4.创建发布者对象
5.发布编程逻辑
*/
int main(int argc,char *argv[])
{
//2.初始化节点,也即创建了发布者
ros::init(argc,argv,"zhaNan");
//3.创建节点句柄
ros::NodeHandle shuaige;
//4.创建句柄对象,即创建发布者发的话题
ros::Publisher pub = shuaige.advertise("che",10);
//5.发布编程逻辑
//5.1创建要发布的消息
std_msgs::String msg;
msg.data = "hello!";
while(ros::ok())
{
//5.2发布消息
pub.publish(msg);
}
return 0;
}
2.然后在修改CMakeLists.txt的配置。修改部分位置如下:
代码就不贴出来,修改的地方不多,注释都有模板,找到位置,然后复制修改对应部分即可。
add_executable :是要*.cpp文件生成对应的可执行文件(即二进制文件)
target_link_libraries:是要把这个生成的可执行文件链接上库文件。
这样发布者就写好了,可以先测试一下这一部分有没有问题。
3.测试发布者
编译(编译部分,其实可以在vscode里面设置快捷键,没有的话就按着下面的步骤):
打开终端:
cd ~/catkin_ws
catkin_make
运行发布者:
source devel/setup.bah
rosrun topic_pub_sub topic_pub
此时无输出,正常。此时可以用内置命令 rostopic echo [话筒名称] 打印消息,看看是否发布成功(值得一提的是:一般验证发布者有没有发布消息,有两种方式:1.在代码中直接用ROS_INFO日志输出,直接在终端中打印出消息。 2.在终端中用rostopic echo [话题名称] 在终端输出消息)。
四.编写订阅者部分
1.在~/catkin_ws_example/src/topic_pub_sub/src文件下新建一个topic_sub.cpp文件(文件命名随便你取,对应上就行),在这个cpp文件中加入如下代码:
//1.包含头文件
#include
#include
/*
订阅方实现:
1.包含头文件
ROS中文本类型 --->std_msgs /String.h
2.初始化ROS节点
3.创建节点句柄
4.创建订阅者对象
5.用回调函数处理订阅到的数据
6.声明一个spin(); -----spin的字面意思是 回头
*/
//5.用回调函数处理订阅到的数据
void callback(const std_msgs::String::ConstPtr &msg)
{
//通过msg获取并操作订阅到的数据
ROS_INFO("I like %s",msg ->data.c_str());
}
/*经过测试回调函数中msg不需要另外定义;msg也不必和发布者中的数据名称相同;msg这个指针变量的名称也不是固定的,如写成msge一样可以;msg和下面的msg->data.c_str()需要对应;data.c_str()是和发布者发布数据相对应的;msg->name.c_str(),其中name是发布者定义的。
void chatterCallback(const std_msgs::String::ConstPtr& msg) //引用传递,这时存放的是由主调函数放进来的实参变量的地址
{
ROS_INFO(“i heard: [%s]”, msg->data.c_str()); //c_str()生成一个const char*指针,指向以空字符终止的数组。msg指向该数据 地址
}
————————————————
版权声明:本文为CSDN博主「月下的树」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41783322/article/details/108449729
*/
int main(int argc,char *argv[])
{
//2.初始化ROS节点
ros::init(argc, argv, "cuiHua");
//3.创建节点句柄
ros::NodeHandle shuaige;
//4.创建订阅者对象
ros::Subscriber sub = shuaige.subscribe("che",10,callback);
//6.声明一个spin();
ros::spin();//字面意思就是回头,main函数会从上往下依次执行,callback是回调函数,会频繁的执行,而如果没有spin(),这个函数就只执行了一次,这肯定不行的
//其实在发布方也有这种类似的函数,叫ros::spinone(),他的作用也是 每次循环都要回头一次,目的也是处理程序中的回调函数,但发布方没有回调函数,就没有必要添加了
//区别与联系 ros::spin() 和 ros::spin Once () 都是用来集中处理本节点所有的回调函数,一般在节点存在订阅消失时,需要用到,区别在于执行 ros::spin() 后,程序不再往下执行,执行 ros::spin Once () 后程序依然可以往下执行。
return 0;
}
PS:也许看着密密麻麻的很复杂,其实代码就几行,备注多了一点而已。
2.然后在修改CMakeLists.txt的配置。修改部分位置如下:
解释发布者那里已经说了。这里单独调试就没有必要了,
编译(同上,不要嫌啰嗦):
cd ~/catkin_ws
catkin_make
编译没有报错,
就和发布者一起调试看看有没有问题。
五.运行发布者和订阅者
最终结果如下:
好了!成功了!
本文学习出自——B站大学 赵虚左老师