ros理论与实践—bilibili视频学习笔记

ros理论与实践—bilibili视频学习笔记

  • 1 matlab自动驾驶工具箱介绍
  • 2 ROS理论与实践
  • 2.1 ROS快速体验
    • 2.1.1 helloworld cpp程序版本
    • 2.1.2 helloworld py程序版本
  • 2.2 ros终端的安装
  • 2.3 vscode的安装与使用
  • 2.3.1 vscode的安装
  • 2.3.2 vscode的使用
  • 2.4 launch文件使用
  • 3 ROS通信机制—核心
    • 3.1 话题通讯
    • 3.2 服务通信
      • 3.2.1 c++程序
      • 3.2.2 python程序
    • 3.3 参数服务器
  • 4 通信机制实操1——基于turtle小乌龟
    • 4.1 话题发布——让小乌龟做圆周运动
    • 4.2 话题订阅_获取乌龟位姿信息
    • 4.3 服务调用
      • (1)以命令方式调用服务
      • (2)以程序方式调用服务
    • 4.4 参数服务器调用
    • 4.5 通信机制比较
  • 5 通信机制实操2——基于autolaborPro小黄车
    • 5.1 发布话题——**让小黄车做匀速圆周运动**
    • 5.2.1 订阅话题——获取车辆当前速度、角速度信息
    • 5.2.2 订阅话题:获取RPLIDA的/scan的消息
  • 6 ros常用命令
  • 7 ROS中C++头文件与源文件的使用
    • 7.1 自定义头文件调用—源文件与ros主函数在一块
    • 7.2 自定义源文件调用——cpp与ros主函数分开写
  • 8 python文件的调用与使用
  • 9 常用的元功能包
  • 10 launch文件介绍
    • (1)针对节点话题名称不一致,无法调用问题
    • (2)参数服务器param的使用
    • (3)rosparam参数服务器的使用
    • (4)ns使用——节点多时,基于组管理,避免节点重复问题
    • (5)arg
    • (6)针对节点重名问题
      • 0)编码设置命名空间与重映射
      • 1)命令方式重命名
      • 2)launch中重命名
    • (7)针对话题重名问题
      • 1)rosrun中修改
      • 2)roslaunch中修改
      • 3)编码实现
      • 3.1)c++实现

1 matlab自动驾驶工具箱介绍

matlab自动驾驶算法——R2020b:
检测 定位 跟踪&融合 规划 控制
道路建模 :RoadRunner导入,同时也支持OpenDrive与Open street map的 导入
交通参与者建模 传感器(毫米波雷达、激光雷达、IMU、GPS)、动力学建模
自适应巡航:前方没有车辆时会保持在该车道上继续进行行驶,当前方有车辆出现时,会与前方车辆保持一定距离,并且进行跟车行驶。
通过stateflow模拟信号灯传感器 地图
百度搜索open street map,下载该格式的
ros理论与实践—bilibili视频学习笔记_第1张图片

2 ROS理论与实践

ros理论与实践—bilibili视频学习笔记_第2张图片
ros理论与实践—bilibili视频学习笔记_第3张图片
ros理论与实践—bilibili视频学习笔记_第4张图片

2.1 ROS快速体验

2.1.1 helloworld cpp程序版本

初始化工作空间

mkdir -p demo_ros/src
cd demo_ros/
catkin_make

创建功能包

catkin_create_pkg helloworld roscpp rospy std_msgs

注意:roscpp是使用c++实现的库,rospy是使用python实现的库,std_msgs是标准消息库
实际编程中,roscpp库旨在成为ROS的高性能库,rospy旨在提高开发效率,一般用于对性能无要求的场景

~/demo_ros/src/helloworld/src$ touch helloworld_c.cpp

写入以下内容

// 1.包含ros的头文件
#include "ros/ros.h"
// 2.编写main函数
int main(int argc,char *argv[]){
// 3.初始化ros节点,字符串中的hello_node为节点名称
    ros::init(argc,argv,"hello_node");
// 4.输出日志
    ROS_INFO("hello world!");
return 0;
}

CMakeLists.txt中写入内容:
其中hah为映射,可随意写,但实际应用中一般将其保持与源文件名称的一致性

add_executable(haha src/helloworld_c.cpp)
target_link_libraries(haha
  ${catkin_LIBRARIES}
)

接下来重新编译并运行

catkin_make
source ./devel/setup.bash
rosrun helloworld haha 

其中helloworld为功能包名称,haha为helloworld_c.cpp的映射
配置环境变量中的./表示在当前目录下
ros理论与实践—bilibili视频学习笔记_第5张图片
针对不同终端下均需要重新配置环境变量的问题:
在主目录下,ctrl+H找到.bashrc,并在其中写入内容:

source ~/demo_ros/devel/setup.bash

或者使用

gedit ~/.bashrc 

然后生效一下:

source .bashrc

2.1.2 helloworld py程序版本

在功能包中新建文件夹scripts,并新建文本文档helloworld_p.py
写入以下内容:

#! /usr/bin/env python
#coding:utf-8
# 指定解释器
# 1.导包
import rospy
# 2.编写主入口
if __name__ == "__main__":
    # 3.初始化ROS节点
    rospy.init_node("hello_p")
    # 4.输出日志
    rospy.loginfo("hello world! by python")

其中:#coding:utf-8必须加入,否则python中只要写入中文字体均会报错
为该python程序添加可执行权限

chmod +x *.py

ros理论与实践—bilibili视频学习笔记_第6张图片
3.编辑 ros 包下的 CamkeList.txt 文件

catkin_install_python(PROGRAMS scripts/自定义文件名.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

编写该配置文件的原因是:
(1)正确的安装python脚本;(2)定位合适的解释器去执行python脚本
4.运行程序:

rosrun helloworld helloworld_p.py 

在这里插入图片描述
5.若python程序不进行CamkeList.txt 的配置——解决方案
其在调用python第三方库的时候可能需要用到,因此需要知道其解决方案
若不配置会抛出异常 : /usr/bin/env: “python”: 没有那个文件或目录
解决方案
(1)解决1:

 #!/usr/bin/env python3 

直接使用 python3 但存在问题: 不兼容之前的 ROS 相关 python 实现
(2)解决2:
创建一个链接符号到 python 命令:

sudo ln -s /usr/bin/python3 /usr/bin/python

2.2 ros终端的安装

sudo apt install terminator

第一部份:关于在同一个标签内的操作

Alt+Up                          //移动到上面的终端
Alt+Down                        //移动到下面的终端
Alt+Left                        //移动到左边的终端
Alt+Right                       //移动到右边的终端
Ctrl+Shift+O                    //水平分割终端
Ctrl+Shift+E                    //垂直分割终端
Ctrl+Shift+C                    //复制选中的内容到剪贴板
Ctrl+Shift+V                    //粘贴剪贴板的内容到此处
Ctrl+Shift+W                    //关闭当前终端
Ctrl+Shift+Q                    //退出当前窗口,当前窗口的所有终端都将被关闭
Ctrl+Shift+X                    //最大化显示当前终端
Ctrl+Shift+Z                    //最大化显示当前终端并使字体放大
Ctrl+Shift+N or Ctrl+Tab        //移动到下一个终端
Ctrl+Shift+P or Ctrl+Shift+Tab  //Crtl+Shift+Tab 移动到之前的一个终端

第二部份:有关各个标签之间的操作

F11                             //全屏开关
Ctrl+Shift+T                    //打开一个新的标签
Ctrl+PageDown                   //移动到下一个标签
Ctrl+PageUp                     //移动到上一个标签
Ctrl+Shift+PageDown             //将当前标签与其后一个标签交换位置
Ctrl+Shift+PageUp               //将当前标签与其前一个标签交换位置
Ctrl+Plus (+)                   //增大字体
Ctrl+Minus (-)                  //减小字体
Ctrl+Zero (0)                   //恢复字体到原始大小
Ctrl+Shift+R                    //重置终端状态
Ctrl+Shift+G                    //重置终端状态并clear屏幕
Super+g                         //绑定所有的终端,以便向一个输入能够输入到所有的终端
Super+Shift+G                   //解除绑定
Super+t                         //绑定当前标签的所有终端,向一个终端输入的内容会自动输入到其他终端
Super+Shift+T                   //解除绑定
Ctrl+Shift+I                    //打开一个窗口,新窗口与原来的窗口使用同一个进程
Super+i                         //打开一个新窗口,新窗口与原来的窗口使用不同的进程

2.3 vscode的安装与使用

2.3.1 vscode的安装

1.下载
vscode 下载:https://code.visualstudio.com/docs?start=true
历史版本下载链接: https://code.visualstudio.com/updates

2.vscode 安装

sudo dpkg -i xxxx.deb

插件安装
ros理论与实践—bilibili视频学习笔记_第7张图片

2.3.2 vscode的使用

(1)进入 xxx_ws 启动 vscode

cd xxx_ws
code .

(2)vscode 中编译 ros
快捷键 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"
        }
    ]
}

(3)针对代码不自动补齐问题
修改 .vscode/c_cpp_properties.json
设置 “cppStandard”: “c++17”

完整代码如下所示:

{
  "configurations": [
    {
      "browse": {
        "databaseFilename": "",
        "limitSymbolsToIncludedHeaders": true
      },
      "includePath": [
        "/opt/ros/melodic/include/**",
        "/home/lc/demo_ros/src/helloworld/include/**",
        "/usr/include/**"
      ],
      "name": "ROS",
          "intelliSenseMode": "gcc-x64",
          "compilerPath": "/usr/bin/gcc",
          "cStandard": "gnu11",
          "cppStandard": "c++17",
          "compileCommands": "${workspaceFolder}/build/compile_commands.json",
          "configurationProvider": "ms-vscode.cmake-tools"
      }
  ],
  "version": 4
}

(4)快捷键的使用

删除当行:ctrl+shift+k
注释:ctrl+/
显示与隐藏下方终端:ctrl+~

(5) 创建 ROS 功能包
选定 src 右击 —> create catkin package
设置包名 添加依赖
(6)c++程序编写问题:
当ROS__INFO 终端输出有中文时,会出现乱码

INFO: ???

c++乱码解决办法:在函数开头加入下面代码的任意一句

setlocale(LC_CTYPE, "zh_CN.utf8");
setlocale(LC_ALL, "");

如下所示:

#include"ros/ros.h"
int main(int argc,char *argv[]){
    // 解决乱码问题
    setlocale(LC_ALL,"");
    // setlocale(LC_CTYPE,"zh_CN.utf8")
    ros::init(argc,argv,"hello_node");
    ROS_INFO("hello world,你好!");
return 0;
}

(7)python程序编写

#! /usr/bin/env python
#coding:utf-8
# 导包
import rospy
# 入口
if __name__=="__main__":
    # 初始化ros节点
    rospy.init_node("hello_p")
    # 输出日志
    rospy.loginfo("hello vscode! 这是python!")

2.4 launch文件使用

    






rqt_graph

ros理论与实践—bilibili视频学习笔记_第8张图片

3 ROS通信机制—核心

ROS是进程(也称为Nodelet)的分布式框架
ROS基本通信机制的三种实现策略:
话题通讯(发布通讯模式)—适用于不断更新的数据传输相关应用场景
服务通讯(请求响应模式)
参数服务器(参数共享模式)

3.1 话题通讯

ros理论与实践—bilibili视频学习笔记_第9张图片
ros理论与实践—bilibili视频学习笔记_第10张图片
(1)订阅与发布节点的使用
c++程序

rosrun plumbing_pub_sub demo02_sub
rosrun plumbing_pub_sub demo01_pub
roscore
rostopic echo /fang(此处写话题名称)
rqt_graph

ros理论与实践—bilibili视频学习笔记_第11张图片
python程序
赋予其可执行权限
=chmod +x *.py=
(2)自定义消息类型
1)首先建立文件夹写入msg——Person.msg

string name
int32 age
float32 height

2)编辑配置文件package.xml与CMakeLists.txt
3)ctrl+shift+B编译一下
ros理论与实践—bilibili视频学习笔记_第12张图片
4.1)c++需要调用的中间文件
在这里插入图片描述
然后将搜索到的路径添加到c_cpp_properties.json

"/home/lc/demo_ros/devel/include/**"

ros理论与实践—bilibili视频学习笔记_第13张图片
4.2) python需要调用的中间文件
在这里插入图片描述
然后将搜索到的路径添加到settings.json

"/home/lc/demo_ros/devel/lib/python2.7/dist-packages"

ros理论与实践—bilibili视频学习笔记_第14张图片

5.1)demo03_pub_person.cpp
加入头文件
#include"plumbing_pub_sub/Person.h"
其余正常编写
5.2)demo03_pub_person.py
加入头文件
from plumbing_pub_sub.msg import Person#发布的消息类型
其余正常编写
6)将.cpp文件在CMakeLists.txt中进行配置

add_executable(demo03_pub_person src/demo03_pub_person.cpp)
target_link_libraries(demo03_pub_person
  ${catkin_LIBRARIES}
)

此外为了防止编写好msh文件后未进行编译,而.cpp文件又需要导入其编译后的头文件,因此还需要配置一行来解决此遗忘问题——出错了

# 确保先编译完msg文件,再编译该cpp文件,但是其添加后出错了——原因尚未找到
add_dependencies(demo03_pub_person ${PROJECT_NAME}_generate_messages_cpp)

7.1)再次进行编译即可——cpp文件

rosrun plumbing_pub_sub demo03_pub_person
rosrun plumbing_pub_sub demo04_sub_person
source ./devel/setup.bash
rostopic echo /LiaoTian 

rqt_graph
在这里插入图片描述
7.2)再次进行编译即可——python文件

rosrun plumbing_pub_sub demo04_sub_person_p.py 
rosrun plumbing_pub_sub demo03_pub_person_p.py 

3.2 服务通信

请求响应模式——一种应答机制——适用于对实时性要求高,具有一定逻辑处理的场景

ros理论与实践—bilibili视频学习笔记_第15张图片

3.2.1 c++程序

(1)服务器端程序编译执行
rosrun plumbing_server_client demo01_server
端口1中会同步显示端口2输入的结果值
ros理论与实践—bilibili视频学习笔记_第16张图片
端口2输入结果值,发现sum出错
ros理论与实践—bilibili视频学习笔记_第17张图片
改进方法——加入程序

response.sum=sum;
bool doNums(plumbing_server_client::Addints::Request &request,
                              plumbing_server_client::Addints::Response &response){
    //1.处理请求
    int num1=request.num1;
    int num2=request.num2;
    ROS_INFO("收到的请求数据是:num1=%d,num2=%d",num1,num2);
    //2.组织响应
    int sum=num1+num2;
    response.sum=sum;
    ROS_INFO("求得的结果是:sum=%d",sum);
    return true;
}

(2)客户端程序编译执行
在这里插入图片描述
端口中动态输入数值,实现服务器端的动态响应。修改了开始在客户端中将两个参数数值写死的内容

3.2.2 python程序

(1)服务器端测试

rosrun plumbing_server_client demo01_server_p.py 

在这里插入图片描述
在这里插入图片描述
(2)客户端动态输入数据,服务端进行同步显示
ros理论与实践—bilibili视频学习笔记_第18张图片

3.3 参数服务器

概念:
用于实现不同节点间的数据共享——一般用于存在数据共享的一些应用场景
作用
存储一些多节点共享的数据,类似于全局变量
注意:
其不是为高性能而设计的,最好用于存储静态的非二进制的简单数据
需求:
实现参数服务器的增删改查操作

4 通信机制实操1——基于turtle小乌龟

目的:熟悉、强化通信模式应用

4.1 话题发布——让小乌龟做圆周运动

(1)node节点替换
被替换节点:rosrun turtlesim turtle_teleop_key
(2)话题+消息——ros命令+计算图
话题与消息查看:
ros理论与实践—bilibili视频学习笔记_第19张图片
消息格式查看:
ros理论与实践—bilibili视频学习笔记_第20张图片
ros理论与实践—bilibili视频学习笔记_第21张图片
(3)编码
弧长=半径时,其所对应的角度为1rad
1)方式1:直接以命令方式控制其进行圆周运动——其有局限性,只能进行一些简单控制,不能进行复杂的逻辑控制
ros理论与实践—bilibili视频学习笔记_第22张图片
2)以程序方式控制乌龟运动
新建功能包,并添加依赖geometry_msgs、roscpp、 rospy、std_msgs
c++节点

rosrun plumbing_test test01_pub_twist

python节点

rosrun plumbing_test test01_pub_twist_p.py 

ros理论与实践—bilibili视频学习笔记_第23张图片

4.2 话题订阅_获取乌龟位姿信息

ros理论与实践—bilibili视频学习笔记_第24张图片

追加节点turtlesim
package.xml

turtlesim
turtlesim

CMakeLists.txt

add_executable(test02_sub_pose src/test02_sub_pose.cpp)
target_link_libraries(test02_sub_pose
  ${catkin_LIBRARIES}
)

运行

rosrun plumbing_test test02_sub_pose

ros理论与实践—bilibili视频学习笔记_第25张图片

4.3 服务调用

获取话题
ros理论与实践—bilibili视频学习笔记_第26张图片
获取消息类型
在这里插入图片描述
获取消息格式
ros理论与实践—bilibili视频学习笔记_第27张图片

(1)以命令方式调用服务

ros理论与实践—bilibili视频学习笔记_第28张图片

(2)以程序方式调用服务

1)c++程序

rosrun plumbing_test test03_service_client

2)python程序

rosrun plumbing_test test03_service_client_p.py

4.4 参数服务器调用

(1)直接基于命令方式修改
注意:参数服务
ros理论与实践—bilibili视频学习笔记_第29张图片
(2)直接基于程序修改背景颜色
1)基于c++程序
先启动参数配置程序,再启动乌龟节点,此时会发现颜色改变了

rosrun plumbing_test test04_param
 rosrun turtlesim turtlesim_node

2)基于python程序

rosrun plumbing_test test04_param_p.py

3)启动乌龟节点时,直接设置参数

rosrun turtlesim turtlesim_node _background_r:=100 _background_g=0 _background_b=0

4)通过launch文件传参

4.5 通信机制比较

5 通信机制实操2——基于autolaborPro小黄车

5.1 发布话题——让小黄车做匀速圆周运动

话题类型:/cmd_vel
消息类型:geometry_msgs::Twist

ros::Publisher pub=nh.advertise("/cmd_vel",10);

5.2.1 订阅话题——获取车辆当前速度、角速度信息

ros理论与实践—bilibili视频学习笔记_第30张图片
订阅的话题:/cmd_vel
发布的话题:/current 电流信息
/remaining_battery 剩余电池电量
/voltage 电压信息
/wheel_odom 轮速里程计

5.2.2 订阅话题:获取RPLIDA的/scan的消息

ros理论与实践—bilibili视频学习笔记_第31张图片
ros中激光雷达数据的消息格式如下所示

std_msgs/Header header	// 数据的消息头
  uint32 seq			// 数据的序号
  time stamp			// 数据的时间戳
  string frame_id		// 数据的坐标系
float32 angle_min		// 雷达数据的起始角度(最小角度)
float32 angle_max		// 雷达数据的终止角度(最大角度)
float32 angle_increment	// 雷达数据的角度分辨率(角度增量)
float32 time_increment	// 雷达数据每个数据点的时间间隔
float32 scan_time		// 当前帧数据与下一帧数据的时间间隔
float32 range_min		// 雷达数据的最小值
float32 range_max		// 雷达数据的最大值
float32[] ranges		// 雷达数据每个点对应的在极坐标系下的距离值
float32[] intensities	// 雷达数据每个点对应的强度值

在这里插入图片描述

每次扫描增加的角度:angle_increment=(angle_max-angle_min)/range size

6 ros常用命令

7 ROS中C++头文件与源文件的使用

7.1 自定义头文件调用—源文件与ros主函数在一块

(1)写头文件.h
(2) 通过pwd命令获取头文件位置,将其添加到 .vscode 下 c_cpp_properties.json 的 includepath属性。——此时添加的头文件便不再报错了

"/home/用户/工作空间/src/功能包/include/**"

(3)配置cmake
1)加入include

include_directories(
include
  ${catkin_INCLUDE_DIRS}
)

2)add_dependencies

add_dependencies(hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

3)常用cpp配置

add_executable(hello src/hello.cpp)
target_link_libraries(hello
  ${catkin_LIBRARIES}
)

7.2 自定义源文件调用——cpp与ros主函数分开写

(1)通过pwd命令获取头文件位置,将其添加到 .vscode 下 c_cpp_properties.json 的 includepath属性。——此时添加的头文件便不再报错了
(2)配置cmake
1)库的配置

include_directories(
include
  ${catkin_INCLUDE_DIRS}
)
#声明c++库
add_library(head_src
include/${PROJECT_NAME}/hello.h
  src/hello.cpp
)

add_dependencies(head_src ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

target_link_libraries(head_src
  ${catkin_LIBRARIES}
)

2)可执行文件配置
target_link_libraries需要链接到之前的c++库

add_executable(use_hello src/use_hello.cpp)
add_dependencies(use_hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(use_hello
  head_src
  ${catkin_LIBRARIES}
)

结果显示下边一行代码出错了,找不到use_hello ,将其注释掉就编译成功了

add_dependencies(use_hello ${${PROJECT_NAME}_EXPORTED_TARGETS} 

8 python文件的调用与使用

pythonA调用pythonB中的变量
pythonB

import pythonA
然后直接使用该变量即可

9 常用的元功能包

元功能包是一个虚包,其没有任何实质性的内容,因此不需要添加依赖
navigation moveit turtlebot3
作用:基于一个包便可以将其他相关的软件包组织到一起安装
实现步骤:
(1)创建无任何依赖的功能包
(2)修改package.xml,添加所需要一块打包的功能包

plumbing_pub_sub
  plumbing_server_client
  plumbing_param_server
    
    
      
  

(3)修改CMakeLists.txt,仅添加这四行,其余全部删除

cmake_minimum_required(VERSION 3.0.2)
project(plumbing_my)
find_package(catkin REQUIRED)
catkin_metapackage()

10 launch文件介绍

(1)针对节点话题名称不一致,无法调用问题

如键盘节点2发布话题为/cmd_vel

sudo apt-get install ros-melodic-teleop-twist-keyboard
rosrun teleop_twist_keyboard teleop_twist_keyboard.py

     

(2)参数服务器param的使用






     
     


ros理论与实践—bilibili视频学习笔记_第32张图片

(3)rosparam参数服务器的使用

1)下载






     
     

2)导出参数与删除参数
启动launch1后,另外建文件launch2进行导出,若直接写在launch1中会出错


    
    
    
    
   

(4)ns使用——节点多时,基于组管理,避免节点重复问题


        
        
            
            
            
        

         
            
            
            
        

ros理论与实践—bilibili视频学习笔记_第33张图片

(5)arg

1)静态传参

roslaunch plumbing_test arg.launch



    
    
    
    
   

2)动态传参

roslaunch plumbing_test arg.launch car_length:=0.7

(6)针对功能包重名问题
写入devel下的bash路径,基于pwd获取

sudo gedit ~/.bashrc

内容如下

source /opt/ros/melodic/setup.bash
source /home/lc/demo_ros/devel/setup.bash
source ~/.bashrc

实际运行中,其会按如下顺序进行查找,下一行的优先于上一行

在这里插入图片描述
填写环境变量时易出现的安全隐患:
功能包A,功能包B,C依赖于A,而B覆盖了A,此时就会报错
ros理论与实践—bilibili视频学习笔记_第34张图片

(6)针对节点重名问题

0)编码设置命名空间与重映射

名称别名设置

 // 可以同时启动多个节点名称相同的节点,其会自动加一个随机后缀时间戳
    ros::init(argc,argv,"erGouZi",ros::init_options::AnonymousName);

命名空间设置

  std::map map;
  map["__ns"] = "xxxx";
  ros::init(map,"wangqiang");

1)命令方式重命名

1)基于工作空间重命名

rosrun turtlesim turtlesim_node __ns:=ergouzi
rosrun turtlesim turtlesim_node __ns:=caihua

ros理论与实践—bilibili视频学习笔记_第35张图片
或者先输入命名空间,再输入乌龟节点
ros理论与实践—bilibili视频学习笔记_第36张图片

2)基于名称name重命名或名称与命名空间的叠加

 rosrun turtlesim turtlesim_node __name:=lc __ns:=gou
  rosrun turtlesim turtlesim_node __name:=cuihua __ns:=zhu

ros理论与实践—bilibili视频学习笔记_第37张图片

2)launch中重命名


        
         
         
         
         
        
         
         
         

(7)针对话题重名问题

rosrun turtlesim turtlesim_node
rosrun teleop_twist_keyboard teleop_twist_keyboard.py

ros理论与实践—bilibili视频学习笔记_第38张图片
针对话题不一致无法订阅问题

1)rosrun中修改

rosrun turtlesim turtlesim_node
rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/turtle1/cmd_vel

或者

rosrun turtlesim turtlesim_node /turtle1/cmd_vel:=/cmd_vel
rosrun teleop_twist_keyboard teleop_twist_keyboard.py

2)roslaunch中修改



     



3)编码实现

ros理论与实践—bilibili视频学习笔记_第39张图片

3.1)c++实现

运行节点

demo_ros$ rosrun pmbing_pub_sub topic_name __ns:=xxx

全局:/话题——与节点名称无关

  // 1.全局----话题名称需要以/开头(也可以设置自己的命名空间),这种情况下和节点(命名空间和名称)没有关系
    // ros::Publisher pub=nh.advertise("/chatter",1000);
    // ros::Publisher pub=nh.advertise("/yyyy/chatter",1000);

ros理论与实践—bilibili视频学习笔记_第40张图片
相对:/命名空间/话题

// 2.相对---非/开头
    ros::Publisher pub=nh.advertise("chatter",1000);

ros理论与实践—bilibili视频学习笔记_第41张图片

私有:/命名空间/节点/话题

 //3.私有---- 需要创建特定NodeHandle nh("~")
    ros::NodeHandle nh("~");
    ros::Publisher pub=nh.advertise("chatter",1000);

ros理论与实践—bilibili视频学习笔记_第42张图片
// 注意:如果以私有的nh创建的话题以/开头(全局话题),生成的话题是全局的非私有
// 全局话题优先级更高

### 3.2)python实现
rosruplumbing_pub_sub topic_name_p.py __ns:=xxx

你可能感兴趣的:(ros基本操作说明)