精华内容
下载资源
问答
  • pip的使用及turtle库

    2021-03-13 10:44:21
    python学习笔记 pip的使用 ​ 在python里pip库的作用就如同手机上的应用中心,在里面可以安装python大量的库. ...pip uninstall turtle # 卸载turtle库 turtel库的使用 创建画布 turtle.setup(高度,宽度)

    python学习笔记

    pip的使用

    ​ 在python里pip库的作用就如同手机上的应用中心,在里面可以安装python大量的库.

    库的安装可以直接在软件上进行,也可以用CMD命令来执行,列如我要安装一个turtle库,

    那我可以在CMD里输入

    pip install turtle               # 安装turtle库
    
    pip uninstall turtle             # 卸载turtle库
    
    turtel库的使用
    1. 创建画布
    turtle.setup(高度,宽度)
    
    1. 设置笔的属性
    # 设置笔的颜色
    turtle.pencolor(颜色)                         # 颜色可以用16进制颜色
    # 设置笔画线的宽度
    turtle.width(宽度)
    # 设置下笔的速度
    turtle speed(速度值)                          # 速度0最快,然后1-10递增
    # 设置笔尖的样式
    turtle.hideturtle()/turtle.ht()              # 隐藏笔尖
    turtle.showturtle()/turtle.st()              # 显示笔尖
    turtle.shape(name=None) # 设置笔尖样式('arrow','turtle','circle','square','triangle','classic')
    
    1. 控制笔的移动
    turtle.forward(距离)/turtle.fd(距离)                  #向前走
    turtle.back(距离)/turtle.bk(距离)                     #向后走
    turtle.goto(x坐标,y坐标).setx(x坐标).sety(y坐标)       #笔尖定位
    turtle.home()                                       # 回到开始的位置
    
    1. 控制笔的方向
    turtle.left(角度)      # 向左转
    turtle.right(角度)     # 向右转
    
    1. 抬笔和落笔
    turtle.up()          # 抬笔
    turtle.down()        # 落笔
    
    1. 画圆
    turtle.circle(半径)               # 画一个完整的圆
    turtle.circle(半径,角度)          # 画圆的一部分
    turtle.dot(半径)                  # 画实心圆
    
    1. 填充
    # 设置填充颜色
    turtle.fillcolor(颜色)
    # 开始填充
    turtle.begin_fill()
    # 结束填充
    turtle.end_fill()
    
    1. 让程序一直运行
    turtle.mainloop()
    
    1. 实例 :小黄人
     import turtle
     # 画布
     turtle.setup(800,800)
     # 画笔速度
     turtle.speed(0)
     # 轮廓
     turtle.up()
     turtle.goto(150,150)
     turtle.down()
     turtle.left(90)
     
     turtle.fillcolor('yellow') #填充颜色
     turtle.begin_fill() #开始填充
     
     turtle.circle(150,180)
     turtle.fd(300)
     turtle.circle(150,180)
     turtle.fd(300)
     
     turtle.end_fill() #填充结束
     # 右镜架
     turtle.left(90)
     turtle.width(20)
     turtle.fd(70)
     
     # 右眼眶
     turtle.right(90)
     turtle.width(3)
     turtle.fillcolor('#fcfdfd')
     turtle.begin_fill()
     turtle.circle(40)
     turtle.end_fill()
     
     # 右眼
     turtle.width(1)
     turtle.up()
     turtle.goto(50,150)
     turtle.down()
     
     turtle.fillcolor('#060606')
     turtle.begin_fill()
     turtle.circle(20)
     turtle.end_fill()
     
     # 右眼球
     turtle.fillcolor('#fcfdfd')
     turtle.begin_fill()
     turtle.circle(8)
     turtle.end_fill()
     # 左眼架
     turtle.up()
     turtle.goto(-150,150)
     turtle.down()
     turtle.left(90)
     turtle.width(20)
     turtle.back(70)
     # 左眼眶
     turtle.left(90)
     turtle.width(3)
     turtle.fillcolor('#fcfdfd')
     turtle.begin_fill()
     turtle.circle(40)
     turtle.end_fill()
     # 左眼
     turtle.width(1)
     turtle.up()
     turtle.goto(-30,150)
     turtle.down()
     turtle.left(180)
     turtle.fillcolor('#060606')
     turtle.begin_fill()
     turtle.circle(20)
     turtle.end_fill()
     # 左眼球
     turtle.fillcolor('#fcfdfd')
     turtle.begin_fill()
     turtle.circle(8)
     turtle.end_fill()
     # 嘴巴
     turtle.up()
     turtle.goto(-50,50)
     turtle.down()
     turtle.pencolor('red')
     turtle.width(2)
     turtle.left(220)
     turtle.circle(80,110)
     # 裤子带
     turtle.up()
     turtle.goto(-100,-100)
     turtle.down()
     turtle.left(80)
     turtle.pencolor('#176185')
     turtle.width(10)
     turtle.fd(62)
     
     turtle.up()
     turtle.goto(100,-100)
     turtle.down()
     turtle.right(100)
     turtle.pencolor('#176185')
     turtle.width(10)
     turtle.fd(62)
     # 裤子
     turtle.up()
     turtle.goto(-150,-150)
     turtle.down()
     turtle.right(130)
     turtle.fillcolor('#176185')
     turtle.begin_fill()
     turtle.circle(150,180)
     turtle.left(90)
     turtle.fd(50)
     turtle.right(90)
     turtle.fd(50)
     turtle.left(90)
     turtle.fd(200)
     turtle.left(90)
     turtle.fd(50)
     turtle.right(90)
     turtle.fd(50)
     turtle.end_fill()
     # 口袋
     turtle.up()
     turtle.goto(-50,-180)
     turtle.down()
     turtle.pencolor('#060606')
     turtle.width(3)
     turtle.left(90)
     turtle.circle(50,180)
     turtle.fd(40)
     turtle.left(90)
     turtle.fd(100)
     turtle.left(90)
     turtle.fd(40)
     # 头发
     turtle.pencolor('#060606')
     turtle.width('1')
     turtle.up()
     turtle.goto(10,300)
     turtle.down()
     turtle.left(173)
     turtle.fd(91)
     
     turtle.up()
     turtle.goto(20,300)
     turtle.down()
     turtle.right(15)
     turtle.fd(98)
     
     turtle.up()
     turtle.goto(-10,300)
     turtle.down()
     turtle.left(20)
     turtle.fd(88)
     
     turtle.up()
     turtle.goto(-20,300)
     turtle.down()
     turtle.left(8)
     turtle.fd(120)
     # 保证程序一直运行
     turtle.mainloop()
    
    展开全文
  • Python安装、升级、卸载各种第三方/包0、更新所有包1、安装turtle包1、打开setup.py文件,第40行修改为2、升级numpy包3、安装gdal包4、使用wheel文件安装各种包 ​——————————————————————...


    ​—————————————————————————————————

    0、更新所有库

    conda update --all
    

    1、安装turtle库

    pip3 install turtle
    

    提示错误:python setup.py egg_info Check the logs for full command output

    百度之后发现:pip在下载turtle 0.0.2包后,会解压到本地再安装,提示的错误在解压的setup.py文件里面。

    解决的办法就是:把turtle包下载到本地,手动解压,修改setup.py文件再安装。

    1、打开setup.py文件,第40行修改为

    except (ValueError, ve):
    原来的是Python2的写法,没有括号,加了括号之后Python3就能用了。
    2、用pip3安装修改后的turtle库:(-e后面接上我们修改过setup.py文件的目录)

    pip3 install -e C:\Users\Administrator\Desktop\turtle-0.0.2
    

    安装成功!

    如果过程中报错 Failed building wheel for Twisted,需要我们自己下载Twisted,然后安装。具体下载哪个版本参见这篇博文

    然后安装完whl文件,重复步骤2即可。

    2、升级numpy库

    pip install numpy --ignore-installed numpy
    

    是升级了,但是之前版本的numpy还是存在。还没找到好办法,最后只能在anaconda python 2.7环境下运行。(创建2.7虚拟环境或者直接安装Anaconda2)

    3、安装gdal库

    conda/pip search gdal查看版本,选择合适的版本(我的Python3.8对应的3.3.1版本)

    conda/pip install gdal=3.3.1
    

    4、使用wheel文件安装各种库

    wheel库:https://www.lfd.uci.edu/~gohlke/pythonlibs/

    ​如何你是第一次使用whl文件安装第三方库,那么先安装wheel库(pip install wheel)。否则往下看
    首先查看自己是64 bit还是32 bit
    在命令行下输入python
    以我的为例,可以看到是64 bit (AMD64)
    在这里插入图片描述
    那我下载的时候:
    以cartopy为例,
    自然选择Cpython38+amd64版本
    在这里插入图片描述
    安装:
    pip install +whl文件路径即可

    pip install "C:\Users\Administrator\Desktop\Cartopy-0.19.0.post1-cp38-cp38-win_amd64.whl"
    

    6、conda创建、删除虚拟环境

    # 创建虚拟环境
    conda create -n 396 python==3.9.6 
    # 删除虚拟环境
    conda remove -n ××× --all
    

    7、更换jupyter notebook的python版本

    pip install ipykernel
    python -m ipykernel install --user --name 396 --display-name "Python [conda env:396]"  
    
    展开全文
  • 教你用Python画简单的表情包(Turtle库的应用) Python学习之Turtle库的基本用法 文章目录教你用Python画简单的表情包(Turtle库的应用)前言一、Turtle是什么?二、安装Turtle库三、Turtle库的使用方法1.引入库2....

    教你用Python画简单的表情包(Turtle库的应用)

    Python学习之Turtle库的基本用法




    前言

    Python是一门面向对象的高级程序语言,同时Python也是一门解释型的脚本语言,相较于其他高级程序语言(如:Java、C、C++等)而言,Python具有鲜明的 “代码简洁” 的特点,其一点重要的在于Python除了拥有本身的一些标准库外,还拥有丰富的第三方库。而其中一些第库则可以实现用画笔画图的功能,我们今天学习的 “Turtle库” 就是这样一个库。


    一、Turtle是什么?

    “Turtle” 中文译为 “海龟”,是Python的绘图体系库,是python的标准库之一,属于入门级的图形绘制函数库。
    turtle库绘制原理:有一只海龟在窗体正中心,在画布上游走,走过的轨迹形成了绘制的图形,海龟由程序控制,可以自由改变颜色、方向宽度等;

    二、安装Turtle库

    由于Turtle库属于Python的标准库,一般不需要安装,Python的解释器(或者Anaconda)本身就自带了Turtle库,因此不需要额外安装。
    假如由于自己本身的解释器原因或者环境原因而无法使用Turtle库,一般有以下两种解决方法:
    方法一:先卸载原来的Turtle库,再重新安装Turtle库(代码如下):

    #电脑“win+r”并输入“cmd”,输入以下命令卸载原来的库
    pip uninstall turtle
    
    #卸载完成后在同一窗口继续输入以下命令,重新安装库
    pip install turtle
    

    方法二:直接卸载现有电脑上的解释器,并重新安装。

    三、Turtle库的使用方法

    1.引入库

    代码如下(示例):

    import turtle
    

    2.Turtle的绘图窗体

    在用Turtle库绘图之前,我们需要像现实中绘画一样需要给我们自己准备一张白纸,而在Python中这样一张白纸叫做“绘图窗体”,这样一个绘图窗体(画布)用setup即可实现,setup后总共有四个参数
    (1)width:画布的宽度;
    (2)height:画布的高度
    (3)startx:画布中坐标原点的x轴值(绝对坐标)
    (4)starty:画布中坐标原点的y轴值(绝对坐标)

    代码如下(示例):

    turtle.setup(width,height,startx,starty)
    #setup设置窗体大小,四个参数中后两个参数非必选参数;
    #setup()是非必须的;
    

    在这里插入图片描述

    3.画笔

    画笔其实和我们现实中的笔并无区别,唯一不同的是Turtle中的画笔是一个矢量,也就是说画笔是有方向的,在窗体中画笔的具体表示就是一个箭头,而箭头所指的方向即画笔下一步移动的方向。
    画笔有以下几个常见的操作:
    (1)抬笔(代码示例如下):

    turtle.penup()	#将画笔在当前位置使得笔尖与纸张分离
    

    (2)落笔(代码示例如下):

    turtle.pendown()	#将画笔笔尖在当前位置与纸张接触,但不进行移动
    

    (3)设置画笔宽度(代码示例如下):

    turtle.pensize(5)	#在此将画笔的宽度设置为5个像素
    

    (4)设置画笔颜色(代码示例如下):

    turtle.pencolor("black")	#画笔设置成黑色,括号中参数为颜色字符串
    turtle.pencolor(255,255,255)	#画笔设置成黑色,括号中参数为RGB参数
    

    (5)画笔向前移动(代码示例如下):

    turtle.fd(40)	#将画笔向前移动40个像素
    turtle.forward(40)	#将画笔向前移动40个像素
    

    (6)画笔画圆圈(代码示例如下):

    turtle.circle(r,extend=NONE)	#根据半径r绘制extent角度的弧形,r默认在圆心左侧R距离的位置;
    

    (7)画笔的跳跃移动(代码示例如下):

    turtle.goto(-80,-80)	#将画笔移动到坐标为(-80,-80)的点
    

    (8)调整画笔方向(代码示例如下):

    turtle.seth(75)	#将画笔方向指向75°方向,但不移动位置
    

    在这里插入图片描述

    4.颜色填充

    代码示例:

    turtle.color("black","pink")	#填充前进行画笔声明,填充边框颜色为黑色,填充区域颜色为粉红色
    turtle.begin_fill()	#此方法用于在绘制要填充的形状之前调用
    ......				#中间画笔包括的区域即为填充的区域
    turtle.end_fill()	#此方法用于在绘制要填充的形状之后调用	
    

    5.在画笔当前位置写入文本

    turtle.write(arg, move=False, align=’left’, font=(‘Arial’, 8, ‘normal’))
    

    其中:
    arg:为需要写入的文本,用引号括起来
    move:在默认情况下,move为false。如果move为true,则笔将移动到右下角
    align:可取值是left即左、center即中、right即右之一,是字符串格式
    font:三元组(字体名称,字体大小,字体类型)

    四、使用Turtle库画一个表情包实例

    import turtle
    
    turtle.setup(800,400,200,200)     #设置画布大小和位置
    
    #1号直线
    turtle.penup()
    turtle.goto(-80,-80)
    turtle.pendown()
    turtle.pensize(5)
    turtle.pencolor("black")
    turtle.seth(75)
    turtle.fd(20)
    
    #2号直线
    turtle.penup()
    turtle.bk(20)
    turtle.seth(0)
    turtle.fd(80)
    turtle.pendown()
    turtle.seth(105)
    turtle.fd(40)
    
    #小心心(左半边)
    turtle.penup()
    turtle.seth(180)
    turtle.fd(40)
    turtle.seth(90)
    turtle.pencolor("red")
    turtle.pendown()
    turtle.circle(18,180)
    turtle.left(25)
    turtle.circle(80,40)
    
    #小心心(右半边)
    turtle.penup()
    turtle.seth(115)
    turtle.circle(80,40)
    turtle.seth(90)
    turtle.circle(-18,180)
    turtle.seth(90)
    turtle.pendown()
    turtle.circle(-18,180)
    turtle.right(25)
    turtle.circle(-80,40)
    
    #头部轮廓
    turtle.penup()
    turtle.goto(-85,-30)
    turtle.seth(160)
    turtle.pencolor("black")
    turtle.pendown()
    turtle.circle(-105,320)
    
    #左眼
    turtle.penup()
    turtle.goto(-85,75)
    turtle.seth(90)
    turtle.pendown()
    
    turtle.begin_fill()
    turtle.circle(15,360)
    turtle.end_fill()
    
    turtle.penup()
    turtle.goto(-90,70)
    turtle.pendown()
    
    turtle.color("white","white")
    
    turtle.begin_fill()
    turtle.circle(3,360)
    turtle.end_fill()
    
    turtle.penup()
    turtle.goto(-100,79)
    turtle.pendown()
    
    turtle.begin_fill()
    turtle.circle(3,360)
    turtle.end_fill()
    
    #右眼
    turtle.penup()
    turtle.goto(10,73)
    turtle.pencolor("black")
    turtle.pendown()
    
    turtle.color("black","black")
    
    turtle.begin_fill()
    turtle.circle(15,360)
    turtle.end_fill()
    
    turtle.color("white","white")
    
    turtle.penup()
    
    turtle.goto(5,68)
    
    turtle.pencolor("white")
    turtle.pendown()
    
    turtle.begin_fill()
    turtle.circle(3,360)
    turtle.end_fill()
    
    turtle.penup()
    turtle.goto(-5,77)
    turtle.pendown()
    
    turtle.begin_fill()
    turtle.circle(3,360)
    turtle.end_fill()
    
    #嘴线
    turtle.penup()
    turtle.goto(-80,20)
    turtle.right(45)
    turtle.pencolor("black")
    turtle.pendown()
    turtle.fd(10)
    turtle.penup()
    turtle.bk(10)
    turtle.seth(0)
    turtle.pendown()
    turtle.fd(55)
    turtle.penup()
    turtle.seth(120)
    turtle.pendown()
    turtle.fd(13)
    
    #舌头
    turtle.penup()
    turtle.bk(13)
    turtle.seth(180)
    turtle.fd(42)
    turtle.seth(-95)
    turtle.pendown()
    
    turtle.color("black","pink")
    
    turtle.begin_fill()
    turtle.fd(20)
    turtle.circle(15,190)
    turtle.right(15)
    turtle.fd(17)
    turtle.end_fill()
    
    #右手
    turtle.penup()
    turtle.goto(-8,-40)
    turtle.seth(90)
    turtle.pendown()
    turtle.circle(8,150)
    turtle.seth(-90)
    turtle.fd(30)
    turtle.seth(100)
    turtle.fd(22)
    turtle.circle(6,180)
    turtle.seth(-80)
    turtle.fd(22)
    turtle.circle(12,180)
    turtle.right(10)
    turtle.fd(25)
    
    #左手
    turtle.penup()
    turtle.goto(-89,-38)
    turtle.seth(170)
    turtle.pendown()
    turtle.circle(10,240)
    
    #害羞羞(左)
    turtle.pensize(3)
    turtle.penup()
    turtle.pencolor("pink")
    turtle.goto(-120,30)
    turtle.pendown()
    turtle.fd(10)
    
    turtle.penup()
    turtle.goto(-110,30)
    turtle.pendown()
    turtle.fd(10)
    
    turtle.penup()
    turtle.goto(-100,30)
    turtle.pendown()
    turtle.fd(10)
    
    #害羞羞(右)
    turtle.pensize(3)
    turtle.penup()
    turtle.pencolor("pink")
    turtle.goto(-10,30)
    turtle.pendown()
    turtle.fd(10)
    
    turtle.penup()
    turtle.goto(0,30)
    turtle.pendown()
    turtle.fd(10)
    
    turtle.penup()
    turtle.goto(10,30)
    turtle.pendown()
    turtle.fd(10)
    
    #文字
    turtle.penup()
    turtle.goto(-230,-150)
    turtle.pensize(5)
    turtle.pendown()
    turtle.write("小 心 心 送 给 你",font = ("Courier",30,"bold"))
    
    turtle.penup()
    turtle.goto(-60,-70)
    turtle.pencolor("purple")
    turtle.pendown()
    turtle.write("",font = ("Courier",15,"bold"))
    
    
    turtle.done()
    

    五、整体效果图

    在这里插入图片描述

    展开全文
  • 文章目录ROSROS安装配置环境变量ROS测试ros server启动package 包管理node 节点管理编译topic 消息管理service 服务管理bag使用message管理parameter 参数管理卸载 ROS 古月居 · ROS入门21讲:...

    ROS

    ROS Answer 官网:https://answers.ros.org/questions/
    古月居 · ROS入门21讲:https://www.bilibili.com/video/BV1zt411G7Vn?p=1
    古月居 · 对应代码:https://github.com/huchunxu/ros_21_tutorials
    中科院软件所-机器人操作系统入门(ROS入门教程)

    介绍

    ROS是一种机器人开发框架(robot frameworks)
    特点:兼容多平台语言共同使用,主要兼容c++和python;结构简单
    通信机制采用异步通信:topic话题(pub-sub)机制和C-S(client-Server)机制;
    此外:
    action基于C-S机制,增加了server端持续反馈,主要用于需长时间响应的情况;
    还有tf使用的broadcast,是基于topic,用来发布topic tf信息。

    ROS安装

    http://wiki.ros.org/melodic/Installation/Ubuntu

    ROS软件包下载慢的解决办法

    合理选择ROS的镜像源:http://wiki.ros.org/ROS/Installation/UbuntuMirrors
    参考链接装ros慢怎么办,只需要少执行一步就可以了
    在这里插入图片描述

    镜像源配置

    #以下命令选其一
    ##1.国内镜像源,建议
    sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
    
    #2.官方镜像源,非常慢
    sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
    
    #以下命令选其一
    #1.
    sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
    #2.
    sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
    

    安装包

    sudo apt update
    #ros全安装,包括rviz还有2D/3D仿真包
    sudo apt install ros-melodic-desktop-full
    #安装一些常用依赖包:
    sudo apt install python-rosdep python-rosinstall python-rosinstall-generator python-wstool build-essential
    #安装ros管理依赖工具
    sudo apt install python-rosdep
    sudo rosdep init
    rosdep update
    

    rosdep Init ERROR解决

    cannot download default sources list from:【closed】
    解决:报raw.githubusercontent.com/xxx 网站down的

    1. ping raw.githubusercontent.com看看网站是否通
    2. sudo vim /etc/hosts
      加入以下内容:

    151.101.84.133 raw.githubusercontent.com

    或者

    151.101.76.133 raw.githubusercontent.com

    或者去http://tool.chinaz.com/dns找到 raw.githubusercontent.com对应的ip,TTL值大一些的。

    1. sudo service networking restart重启network服务
    2. ping raw.githubusercontent.com看看网站是否通了,对应ip是否为151.101.84.133。

    rosdep update一直timeout

    解决rosdep update一直timeout的问题

    sudo vim /usr/lib/python2.7/dist-packages/rosdep2/gbpdistro_support.py
    

    DOWNLOAD_TIMEOUT = 15.0改大一点。

    配置环境变量

    #设置打开终端生效
    echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    

    创建ros工作空间:

    mkdir -p ~/catkin_ws/src
    cd ~/catkin_ws/src
    catkin_init_workspace
    

    ros 下source会清理ROS_PACKAGE_PATH,因此一个终端启动跨工作空间下的包会有问题
    通过以下的方式将空间变量添加到ROS_PACKAGE_PATH变量可解决此问题
    export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/xxx/ws/src/packxxx

    ROS测试

    #启动ros server
    roscore
    #启动小海龟节点node
    rosrun turtlesim turtlesim_node
    #启动小海龟键盘控制节点node
    rosrun turtlesim turtle_teleop_key
    

    在这里插入图片描述

    ROS使用

    ros master server启动

    roscore
    

    多机ros协同

    从机配置:
    export ROS_MASTER_URI=http://[master_ip]:11311
    eg: export ROS_MASTER_URI=http://192.168.1.2:11311
    主机配置:启动roscore [ros master]的机器,如果ROS_HOSTNAME用的host_name,须在/etc/hosts中对应匹配上master_ip.
    export ROS_HOSTNAME=[host_name/master_ip]
    export ROS_MASTER_URI=http://[host_name/master_ip]:11311
    这样即可以在从机的export下的终端接收到主机的topic。

    远程rviz

    1. 可以使用远程桌面方式,参考https://blog.csdn.net/weixin_41469272/article/details/105747164
    2. 使用ssh -X 远程打开桌面服务,需要桌面环境
      ssh [user_name]@[user_ip] -X
      rviz可以远程打开rviz

    package 包管理

    #软件包列表
    rospack list
    #查找软件包目录
    rospack find package-name
    #查看指定包下文件目录
    rosls package-name
    #直接进入对应包路径下
    roscd package-name
    #编辑ros文件,有时候需要编辑apt安装的ros包的文件,以下就会启用vi编辑pacname/filename文件
    rosed pacname filename
    #新建包
    catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
    #查看包依赖
    rospack depends <package_name>
    
    #自定义包卸载就用rm 删除其对应的src下的文件夹。
    #系统自带包,则通过安装包管理工具apt一类的进行卸载。
    
    #手动创建包
    1.mkdir tstpck 或者 cp xxtstpck tstpck
    2.cd tstpck
    3.vi package.xml
    #填入对应的<package><name><depend>等信息。一般填入<package><name>信息包就能被识别了
    #使用rosls 及 roscd查看是否系统是否找的道tstpak了
    #记得要source对应ws的devel/setup.sh
    

    Metapackage

    Metapackage(功能包集)是把一些相近的功能模块、 软件包放到一起。
    metapacakge和普通package不同点是:
    CMakeLists.txt :加入了catkin_metapackage()宏, 指定本软件包为一个metapacakge。
    package.xml :标签将所有软件包列为依赖项, 标签中添加标签声明。
    以上参考https://www.cnblogs.com/long5683/p/9941458.html

    node 节点管理

    #启动节点
    rosrun package-name executable-name 
    #查看节点列表
    rosnode list
    #查看节点信息
    rosnode info node-name
    #停止节点
    rosnode kill node-name
    #为启动的节点命名node_name
    rosrun pkg_name node_type __name:=node_name
    #查看是否能联通node
    rostopic ping node_name
    #启动节点时映射topic,类似节点输入
    rosrun node_name node_name origin_topic:=new_topic
    
     <node pkg="pkg_name" type="exe_name" name="node_name1" args="arg1 arg2 arg3" respawn="true" output="screen">  
    

    1.pkg:功能包名称
    2.type:可执行文件,节点名称
    3.name:定义节点运行的名称,将覆盖节点中init()赋予节点的名称。
    4.output = “screen”
    将节点的标准输出打印到终端屏幕,默认输出为日志文档。
    5.respawn=”true”
    复位属性,该节点停止时,会自动重启,默认为false。
    6.respawn_delay =“30” (可选,默认为0)ROS indigo中的新功能
    如果respawn为true,请在尝试重新启动之前检测到节点故障后等待respawn_delay秒。
    6.required=”true”
    必要节点,当该节点终止时,launch文件中的其他节点也被终止。
    7.launch-prefix =“prefix arguments” (可选)
    用于预先添加到节点的启动参数的命令/参数。这是一个强大的功能,使您能够启用gdb,valgrind,xterm,漂亮或其他方便的工具。
    eg: launch-prefix = “command-prefix”
    roslaunch 命令 的一个潜在的缺点:相比我们原来对每个节点在单独的终端使用 rosrun 命令启动的做法,roslaunch 则是让所有的节点共享同一个终端。 那些只需要生产简单的日志消息文件而不需要终端(console)输入的节点是容易管理的,而那些依赖终端输入的节点,它可能要优先的保留在独立的终端上。
    在launch文件中,使用launch-prefix=”xterm -e”.属性,可以使启动这个 node 元素的 rosrun 命令大致相当于:xterm -e rosrun pkg_name node_name.
    xterm 命令会开一个新的终端窗口。 -e 参数告诉 xterm :执行其命令行剩余部分(rosrun turtlesim turtle_teleop_key)。=
    用于预先添加到节点的启动参数的命令/参数。这是一个强大的功能,使您能够启用gdb,valgrind,xterm,漂亮或其他方便的工具。
    8.args =“arg1 arg2 arg3” (可选)
    传递参数到节点。
    9.machine =“machine-name” (可选)
    在指定机器上启动节点。
    10.ns =“foo” (可选)
    在“foo”命名空间中启动节点。
    11.clear_params =“true | false” (可选)
    在启动前删除节点的私有命名空间中的所有参数。
    12.output =“log | screen” (可选)
    如果’screen’,stdout / stderr从节点将被发送到屏幕。如果是“log”,stdout / stderr输出将被发送到$ ROS_HOME/ log中的日志文件,stderr将继续发送到屏幕。默认值为“log”。
    13.cwd =“ROS_HOME | node” (可选)
    如果为“node”,则节点的工作目录将设置为与节点的可执行文件相同的目录。在C Turtle中,默认值为“ROS_HOME”。在Box Turtle(ROS 1.0.x)中,默认值是’ros-root’。使用’ros-root’在C Turtle中已被弃用。
    参考链接-https://www.cnblogs.com/qixianyu/p/6579798.html

    launch文件

    launch文件用来同时启动多个node节点及配置更多的参数。在roslaunch时,ros master会被启动
    在launch文件头使用<?xml version="1.0"?>声明,在vi中打开该launch,可以使用xml格式显示(带颜色区分)。
    respawn复位节点
    respawn=”true”,这样当节点停止的时候,roslaunch会重新启动该节点。

     <node name="Stereo" pkg="ORB_SLAM2" type="Stereo" 
    	args=" $(find ORB_SLAM2)../../../Vocabulary/ORBvoc.txt $(find ORB_SLAM2)Asus_imsee.yaml false" 
    	output="screen" respawn="true" respawn_delay="10">
     </node>
    

    launch文件中对sub/pub topic remap

    来自launch文件remap标签

    <!--start_talker.launch-->
    <launch>    
        <node pkg="test" type="talker" name="talker" output="screen">
        <!--talker节点发布的topic为/talker-->
            <!--一个例子:将talker节点发布的话题/talker映射到/re_talker的名字上去-->
            <remap from="/talker" to="/re_talker" />        
        </node> 
    </launch>
    

    通过rosrun也可以进行topic remap

    launch中启动新的终端

    #1
        <!-- 使用launch-prefix="gnome-terminal --" -->
        <node pkg="prometheus_mission" type="planning_mission" name="planning_mission" output="screen" launch-prefix="gnome-terminal --">
            <param name="planning_mission/control_yaw_flag" value="false" type="bool"/>
        </node>
    #2
    #xterm 命令会开一个新的终端窗口。 -e 参数告诉 xterm :执行其命令行剩余部分(rosrun package_name node_name)。
        <!-- 使用launch-prefix="xterm -e" -->
        <node pkg="prometheus_mission" type="planning_mission" name="planning_mission" output="screen" launch-prefix="xterm -e">
            <param name="planning_mission/control_yaw_flag" value="false" type="bool"/>
        </node>
    
    <!--start_test1.launch-->
    <launch>    
        <node pkg="test" type="test1" name="test1" output="screen">
        <!--test1节点需要订阅话题为/talker_mid-->
            <!--一个例子将节点订阅的topic改名字为/re_talker-->
            <remap from="/talker_mid" to="/re_talker" />
        </node>
    </launch>
    
    

    使用roslauch传递参数:在xxx.launch中写入参数

    示例:
    节点公有参数

    <launch>
      #所有节点的公共参数
      <param name="use_sim_time" value="true"/>
      #launch文件的外部参数
      <arg name="scan_topic" default="sick_scan" />
      #node本身也可通过arg传递节点外部参数
      <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" args="" output="screen">
      #单个节点的私有参数
        <param name="throttle_scans" value="1"/> 
      ...
      </node>
    ... ...
    <\launch>
    

    eg: vins_estimator/launch:

    <launch>
        <arg name="config_path" default = "$(find feature_tracker)/../config/inde/inde_config.yaml" />
              <arg name="vins_path" default = "$(find feature_tracker)/../config/../" />
    ... ...
        <node name="vins_estimator" pkg="vins_estimator" type="vins_estimator" output="screen">
           <param name="config_file" type="string" value="$(arg config_path)" />
           <param name="vins_folder" type="string" value="$(arg vins_path)" />
        </node>
    ... ...
        </node>
    </launch>
    

    eg: loam_velodyne

      <group if="$(arg rviz)">
        <node launch-prefix="nice" pkg="rviz" type="rviz" name="rviz" args="-d $(find loam_velodyne)/rviz_cfg/loam_velodyne.rviz" />
      </group>
    

    在节点源程序中,对launch文件中的公有参数读取

    ros::init(argc, argv, "xxxx");
    ros::NodeHandle nh;
    //3中获取函数
    //1
    nh.param<std::string>("data_save_dir", data_save_dir, "~/");//可以设置默认值
    //2
    nh->getParam("/aruco_mapping/marker_size", temp_marker_size);
    //3
    ROS::param::get()
    

    节点私有参数
    节点私有参数读取:将"~"赋值给node,便可读取xxx.launch 文件中定义的param。

    ros::NodeHandle private_nh_("~");
    if(!private_nh_.getParam("throttle_scans", throttle_scans_))
            throttle_scans_ = 1
    

    args传入多个参数

    <launch>
        <node name="map_server" pkg="map_server" type="map_server" args="$(find costmap_2d)/test/willow-full-0.025.pgm 0.025" />
        <node name="rosplay" pkg="rosbag" type="play"
            args="-s 5 -r 1 --clock --hz=10 $(find costmap_2d)/test/simple_driving_test_indexed.bag" />
    </launch>
    
    

    launch中添加其他launch文件:使用$(find 节点名称)

    <launch>
     <include file="$(find imsee_ros_wrapper)/launch/start.launch" />
     <node name="rviz" pkg="rviz" type="rviz" args="-d $(find imsee_ros_wrapper)/rviz/imsee.rviz" 
    output="screen" />
    </launch> 
    

    group使用
    launch group用来管理node的启动。

    1. 通过group 赋予node的命名空间,防止不同节点间运行时,参数冲突。
    <group ns="turtlesim1">
          <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
            </group>
    <group ns="turtlesim2">
          <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
            </group>
    
    1. 通过group if/unless 管理节点的条件性启动。
    <group if="0-or-1" />
    	<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
    . . .
    </group>
    
    <group unless="1-or-0" />
    	<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
    . . .
    </group>
    

    launch load yaml file

    https://www.jianshu.com/p/13efab3f67e0
    https://www.cnblogs.com/zx-hit/p/11777992.html

    topic 消息管理

    #列出所有topic清单
    rostop list
    #实时指定topic内容 -n 指定打印的topic数
    rostopic echo -n 1 [topic]
    #rostopic取消打印矩阵或者字符串
    rostopic echo --nostr [topic]
    rostopic echo --noarr [topic]
    
    #rostopic 
    #发布topic,-r 指定发布次数
    rostopic pub [-1] <topic> <msg_type> [-r 1] -- [args] [args]
    #查看topic发布的频率
    rostopic hz [topic]
    #改变topic发布频率:intopic为要改变的topic名称,outtopic为更改后发布topic名称(可省),msgs_per_sec要设置的频率
    #temp:rosrun topic_tools throttle messages <intopic> <msgs_per_sec> [outtopic]
    rosrun topic_tools throttle messages /topic 1.0
    #重映射消息名称:
    rosrun <rostype> <rosnode> <topic_origin_name>:=<topic_new_name>
    eg:
    rosrun rospy_tutorials talker chatter:=/wg/chatter
    

    service 服务管理

    #列出service 清单
    rosservice list
    #service调用
    rosservice call [service] [args]
    

    bag使用

    #记录所有信息
    rosbag record -a -O filename.bag
    #记录过滤掉/monitor/*之外的其他topic
    rosbag record -a -O xxx.bag -x "/monitor/(.*)"
    #记录指定topic信息
    rosbag record -O subset <topic1> <topic2>
    #查看rosbag内容
    rosbag info <bagfile_name>
    #回放bag内容 -r可以制定回放topic的速率倍数,-r 0.5是指播放速率为原先速率的一半
    $ rosbag play (-r 2) <bagfile_name>
    #bag.active恢复
    1. rosbag reindex xxx.bag.active
    2. rosbag fix xxx.bag.active result.bag
    #bag包裁剪
    rosbag filter input.bag output.bag "t.to_sec() >= [start time] and t.to_sec() <= [end time]"
    #[start time]和[end time]如Bag Time: 1623406311
    

    rosbag --clock与use_sim_time离线调试

    #发布clock虚拟时钟
    1. rosbag play xxx.bag --clock
    #打开/use_sim_tim参数,使参数设置后启动的node均使用虚拟时钟
    2. rosparam set /use_sim_time true
    

    eg:

    3. rosbag play xxx.bag --clock
    4. rosparam set /use_sim_time true
    5. rosrun tf static_transform_publisher 0 0 0 0 0 0  camera_init map 50
    #便可成功订阅camera_init frame下的点云或pose等,解决message removedbecause it is too old问题
    

    rqt_bag查看bag数据

    查看bag包指定帧数据
    rqt_bag bag_name.bag

    //同步订阅两个topic然后处理
            message_filters::Subscriber<sensor_msgs::PointCloud2> cloud_sub(n, VELODYNE_TOPIC, 1);
            message_filters::Subscriber<lidar_camera_calibration::marker_6dof> rt_sub(n, "lidar_camera_calibration_rt", 1);
    
            typedef sync_policies::ApproximateTime<sensor_msgs::PointCloud2, lidar_camera_calibration::marker_6dof> MySyncPolicy;
            Synchronizer<MySyncPolicy> sync(MySyncPolicy(10), cloud_sub, rt_sub);
            sync.registerCallback(boost::bind(&callback_noCam, _1, _2));
    
    void callback_noCam(const sensor_msgs::PointCloud2ConstPtr& msg_pc,
                        const lidar_camera_calibration::marker_6dof::ConstPtr& msg_rt)
    

    message管理

    #列出所有消息名称
    rosmsg list
    #查看topic下指定message的信息
    rosmsg show [msg_type]
    

    parameter 参数管理

    #参数设置
    rosparam set [parame_name] [args] 
    #参数获取查看
    rosparam get [parame_name]
    #加载指定文件中的所有参数配置
    rosparam load [file_name] [namespace]
    #参数删除
    rosparam delete
    

    节点参数传递

    使用rosrun时传递参数:

    1. rosrun package node _parameter:=value 注意parameter前加下划线。
      示例:
      rosrun gmapping slam_gmapping _map_update_interval:=1.0
    2. 使用argv传递main函数参数:
      示例:
      rosrun map_server map_saver -f ~/Documents/test

    也可使用launch文件传入参数

    tf 查看

    • ROS tf定义的坐标系是右手法则,Z轴朝上,X轴到Y轴为逆时针方向
      在这里插入图片描述

    http://wiki.ros.org/tf/

    #查看两个坐标系之间的变换,以下为查看map和odom之间的变换关系
    rosrun tf tf_echo map odom
    #查看tf tree
    rosrun rqt_tf_tree rqt_tf_tree
    #报告在ROS上任意两个坐标系发布的变换。
    rosrun tf tf_echo [reference_frame] [target_frame]
    #使用命令发布tf变换信息
    #1使用yaw pitch roll欧拉角来定义旋转
    #period_in_ms每秒发布多少次(速率) 100为不错的选择
    rosrun tf static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
    #2使用四元数来定义旋转
    static_transform_publisher x y z qx qy qz qw frame_id child_frame_id  period_in_ms
    #examples tf pub use cmd
    rosrun tf static_transform_publisher 0 0 0 0 0 0 base_link velodyne 100
    

    log级别查看与设置

    有三种方法设置日志级别:

    • 第一个是通过配置文件设置所有节点的日志级别
      在launch 文件里指定一个config 文件, 在这个 config 文件里制定哪些pkg 输出什么级别的log.
      步骤:
    1. 把下面的文本copy 到 某个folder 下的 某个文本文件里,然后重命名为 rosconsole.config
    # Set the default ros output to warning and higher
    log4j.logger.ros=WARN
    # Override my package to output everything
    log4j.logger.ros.move_base=DEBUG
    
    1. 修改你使用的launch 文件,假设是fake_amcl.launch, 在这个launch 文件里添加下面的文本。
      <env name="ROSCONSOLE_CONFIG_FILE"
           value="myfolder_path/rosconsole.config"/>   // myfolder_path  是你的rosconsole.config 文件所在的文件夹
    
    • 第二个是在运行时,通过rqt_logger_level(以前叫rxloggerlevel)或rqt_console (以前叫rxconsole) 工具来设置日志级别
    #打开图形界面,选择对应的
    rqt_logger_level
    

    在这里插入图片描述

    • 第三个通过 rosconsole API来设置:
    #include <ros/console.h>
    if( ros::console::set_logger_level(ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Debug) ) {
       ros::console::notifyLoggerLevelsChanged();
    }
    

    ros log级别设置 https://www.jianshu.com/p/8d23b4c12f6f

    • launch文件中设置log级别
    1.ROS2
    <node pkg="rosservice" type="rosservice" name="set_move_base_log_level" args="--log-level debug" />
    2.
    <node pkg="rosservice" type="rosservice" name="set_move_base_log_level" args="call --wait /move_base/set_logger_level 'ros.move_base' 'debug'" />
    

    命令

    1. ROS2: rosrun packname nodename __log_level:=debug
    2. rosservice call /node-name/set_logger_level rospackage-name Debug

    log显示出处

    launch文件中加入:

    <env name="ROSCONSOLE_FORMAT"      value="${logger}: { ${message} }" />
    

    也同直接设置环境变量:
    export ROSCONSOLE_FORMAT='${logger}: ${message}'
    log打印结果如下:
    设置前:
    在这里插入图片描述
    设置后:
    在这里插入图片描述

    显示数据曲线rqt_plot

    rqt_plot打开绘图界面,输入’/'下方会提示选项,输入变量全路径,点击右侧+号,下方会显示变量跟随时间的变化情况
    在这里插入图片描述

    nodelet 使用

    nodelet是实现将多个算法运行在同一个进程。
    ROS中的 nodelet
    http://wiki.ros.org/nodelet
    node与nodelet实现通信的不同:node每个节点各占一个进程,需通过topic互相通信。nodelet各算法节点占用一个线程,所有算法共享一个进程,通信也通过topic,但是nodelet的topic通信底层是通过指针的传递实现的。

    在这里插入图片描述
    node:图中说node间的topic交互是通过tcp(连接式)通信方式;
    nodelet:各个节点虽与node相似,也采用topic方式。但是其nodelet的各个节点运行在一个进程中,实际topic的交互是通过指针传递实现。详细使用见参考链接。
    因此使用nodelet启动的node的起始不是main,而是onInit()

    map_server地图管理

    sudo apt install ros-melodic-map-server
    保存地图:
    rosrun map_server map_saver map:=/<Map Topic> -f PATH_TO_YOUR_FILE/mymap
    显示地图:运行map_server 重新发布topic节点,在使用rviz add topic显示地图。
    rosrun map_server map_server mymap.yaml

    rivz

    rviz终端输入rviz可直接启动rviz;
    点击rviz下方add可以添加要显示的topic
    rviz -d xxx.rviz可以根据xxx.rviz的配置订阅topic信息进行显示。

    pcl &点云pcd保存及显示

    保存并查看Loam的三维点云地图-https://blog.csdn.net/qq_36396941/article/details/83048415
    PCL点云库-https://blog.csdn.net/qq_43145072/article/details/85953948

    #pcl库文件安装
    sudo apt-get install libpcl-dev
    #pcl工具安装,如pcl_viewer
    sudo apt-get install  pcl-tools
    #从bag中保存点云地图,input.bag为bag包,/laser_cloud_surround为点云topic
    rosrun pcl_ros bag_to_pcd input.bag /laser_cloud_surround pcd
    #查看pcd点云图
    pcl_viewer map.pcd 
    

    c++中保存点云地图

    #include <iostream>  
    #include <pcl/io/pcd_io.h>  
    #include <pcl/point_types.h>  
    #include <pcl/point_cloud.h>  
      
    using namespace std;  // 可以加入 std 的命名空间  
      
    int  
    main(int argc, char** argv)  
    {  
    pcl::PointCloud<pcl::PointXYZ>::Ptr INcloud(new pcl::PointCloud<pcl::PointXYZ>);    // 存放提取出来的边界点云  
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("boudary_200_100.pcd", *INcloud) == -1)//*打开点云文件。  
    {                                                                           //带路径的格式【注意路径的反斜杠与电脑自己的不同】:if (pcl::io::loadPCDFile<pcl::PointXYZ>("E:/rabbit_gra.pcd", *cloud) == -1)  
    PCL_ERROR("Couldn't read that boundary pcd file\n");                             // //不带路径的格式【只是把路径删掉即可】:if (pcl::io::loadPCDFile<pcl::PointXYZ>("rabbit_gra.pcd", *cloud) == -1)  
    return(-1);  
    }  
    //写入磁盘  
    //写入方法一:  
    pcl::PCDWriter writer;  
    writer.write<pcl::PointXYZ>("name_cluster.pcd", *INcloud, false);//将点云保存到PCD文件中  
      
    //写入方法二:  
    pcl::io::savePCDFileASCII("name_cluster.pcd", *INcloud); //将点云保存到PCD文件中  
    } 
    

    两种读取和写入pcd点云文件的方法
    ros pcl sensor::pointcloud2 转换成pcl::pointcloud

    rosclean log清除

    rosclean check 查看ros log文件及大小
    rosclean purge 清除log文件

    编译

    1. 使用catkin_make
    cd ~/catkin_ws
    #编译所有文件,catkin_make需再catkin workspace下进行,而 catkin_init_workspace是在src下
    catkin_make
    #编译指定包
    catkin_make -DCATKIN_WHITELIST_PACKAGES="package1;package2"
    #指定不编译指定包
    catkin_make -DCATKIN_BLACKLIST_PACKAGES="package1;package2"
    #或:
    catkin_make --pkg package_name
    #或:
    catkin_make --source [package_path] --build build/[pacakge_name]
    #或:直接使用cmake/make
    #build和devel可以放在ws下,也可以指定放在package下,这样可以通过ROS_PACKAGE_PATH来切换同名包
    #ROS会在ws以及package path下去寻找可用的可执行文件
    cd [packge_path]
    mkdir build
    cmake ..
    make
    export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:${PWD}
    

    2.使用catkin build
    安装:sudo apt install python-catkin-tools
    使用:catkin build [pacname]
    3. 使用rosmake

    #安装包依赖,根据package.xml配置
    rosdep install pkg_name
    #进入package目录
    roscd pkg_name
    #编译该package
    rosmake pkg_name
    

    catkin_package
    catkin_package DEPENDS 和 CATKIN_DEPENDS 用来告诉 catkin 需要将你程序包的哪些依赖项传递给使用 find_package(…) 查找你的程序包的程序包。
    catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息。

    使用rosws管理工作空间

    sudo apt-get install python-rosinstall
    mkdir ~/rosbuild_ws
    cd ~/rosbuild_ws
    rosws init . /opt/ros/indigo
    mkdir package_dir
    rosws set ~/rosbuild_ws/package_dir -t .
    echo "source ~/rosbuild_ws/setup.bash" >> ~/.bashrc
    cd package_dir
    <copy package to .>
    rosmake package_name
    

    参考链接:https://docs.ros.org/en/independent/api/rosinstall/html/rosws_tutorial.html

    可执行文件位置

    ros 自定义workspace编译的可执行文件位置/${workspace}/devel/lib/
    ros安装的包的可执行文件位置:/opt/ros/melodic/lib

    卸载

    #卸载ros相关包
    sudo apt-get purge ros-*
    #卸载相关自动下载的依赖包
    sudo apt-get autoremove
    

    ros接口定义查询

    ros接口定义查询http://docs.ros.org/jade/api/

    roscpp

    launch文件中arg与param的区别:
    arg是launch文件的参数,在roslaunch xxxpackage xxx.launch argname:=argvalue
    param是启动的node要传入的参数

     // 使用“~”则private_nh 可以接受launch文件中给定的param
    ros::NodeHandle private_nh("~");
    private_nh.param("base_global_planner", global_planner, std::string("navfn/NavfnROS"));
    

    ros::spin 和ros::spinOnce – ROS消息回调处理函数:
    ros::spin 和ros::spinOnce 都是用来触发ros节点订阅的所有topic的消息处理函数。
    两者区别在于ros::spinOnce只触发一次消息处理,而ros::spin会block触发所有节点订阅的topic处理函数。
    对于有些传输特别快的消息,需要注意合理控制消息池大小和ros::spinOnce()执行频率; 比如消息送达频率为10Hz, ros::spinOnce()的调用频率为5Hz,那么消息池的大小就一定要大于2,才能保证数据不丢失,无延迟。
    ros::spin()和ros::spinOnce()的意义与区别-https://blog.csdn.net/datase/article/details/79742421

    ROS Time

    http://wiki.ros.org/Clock
    http://wiki.ros.org/roscpp/Overview/Time
    ROS 中有 ROS::Time()和ROS::WallTime()
    参考:https://blog.csdn.net/sru_alo/article/details/102893536

    • ROS Time可以被人为修改,你可以暂停它,可以加速,可以减速;
    • Wall Time不可以被修改,Wall Time可以理解为墙上时间,墙上挂着的时间没有人改变的了,永远在往前走;

    在开启一个Node之前,当把use_sim_time设置为true时,这个节点会从clock Topic获得时间。所以操作这个clock的发布者,可以实现一个让Node中得到ROS Time暂停、加速、减速的效果。同时下面这些方面都是跟Node透明的,所以非常适合离线的调试方式。当把ROSbag记下来以后重新play出来时,加两个横杠,–clock,它就会发布出这个消息。

    如,使用rosbag播放数据包时,处理的数据的程序也想采用bag中的时间,就可以将use_sim_time设为true,同时播放bag包时加上–clock。但是同时rosbag play时 可以加上-r [r]来改变ros的播放速度。因此模拟时间可通过ROS::Time()获得,且此时的时钟时间是可调,可控的。为防止特殊情况下,用户需要使用绝对的系统时间,则ROS::WallTime()。

    当不开启use_sim_time时,ROS::Time()和ROS::WallTime()获取的时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

    两外:ROS::Time也分time 和 duration 两种类型,相应的有 ros::Time 和 ros::Duration 类。
    time 表示的是时刻
    duration 表示的是时间间隔

    ROS程序调试

    参考链接

    1. 直接使用gdb gdb -ex run --args ./exefile
      eg: gdb -ex run --args ./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml ../EUROC_dataset/mav0/cam0/data Examples/Monocular/EuRoC_TimeStamps/MH05.txt
    gdb --args /exefile arg1 args2
    

    在ros程序运行出错时会红色字打印cmd,将cmd后的命令直接跟在gdb --args之后就可以进行调试

    2.在launch文件中加入:
    python : launch-prefix="xterm -e python -m pdb "
    c++: launch-prefix="xterm -e gdb -ex run --args "

    eg:

    <node pkg="waypoint_follower" type="pure_persuit" name="pure_pursuit" output="screen" launch-prefix="xterm -e gdb -ex run --args">
            <param name="is_linear_interpolation" value="$(arg is_linear_interpolation)"/>
    </node>
    

    然后使用rosrun或launch运行node,程序会自动启用gdb

    附:gdb常用命令:
    r: 运行程序
    c:继续运行程序
    s:单步运行程序
    bt:打印backtrace调用栈区符号表

    https://www.linuxidc.com/linux/2016-03/129600.htm

    展开全文
  • ROS的安装和卸载

    千次阅读 2021-01-17 16:03:30
    Robot Operating System (ROS) 是一个得到广泛应用机器人系统的软件框架,它包含了一系列的软件和工具用于构建机器人应用。从驱动到最先进的算法,以及强大的开发者工具,ROS 包含了开发一个机器人项目所需要的...
  • ROS安装与卸载

    2021-01-17 16:03:30
    请看: ROS发布日期 ROS版本 对应Ubutnu版本 2016.3 ROS Kinetic Kame Ubuntu 16.04 (Xenial) / Ubuntu 15.10 (Wily) 2015.3 ROS Jade Turtle Ubuntu 15.04 (Wily) / Ubuntu LTS 14.04 (Trusty) 2014.7 ROS Indigo ...
  • 当前环境: 操作系统:mac osx python版本:3.7.7 使用visual studio coder编辑器 import turtle时出现的错误。 tips: tkinter是一个利用python做GUI...1. mac安装brew,卸载掉当前python,使用brew重新安装pyt...
  • ----------------------------------------------------...rosrun turtlesim turtle_teleop_key 4) 打开新的Termial,(先别关上一个)输入以下命令,弹出新的窗口查看ROS节点信息: rosrun rqt_graph rqt_graph 参考:...
  • 原因:用turtle画五角星时中间颜色填充不了,想折腾一下,却失败了,还是有学习到相关知识,但问题没有解决。1.首先查看自己电脑的python版本在root下,python3 --version python3.5.3python --version python 2.7....
  • Python安装、卸载第三方模块

    千次阅读 2018-10-03 14:21:12
    command:用于指定要执行的命令(install:安装,uninstall:卸载) ModuleName:需要安装的模块名称 示例: 安装第三方模块numpy模块(用于科学计算): C:\Users&amp;gt; pip install numpy Collecting ...
  • 通常在软件编译时出现的usr/bin/ld: cannot find -lxxx的错误,主要的原因是文件并没有导入的ld检索目录中。 解决方式: 1。确认文件是否存在,比如-l123, 在/usr/lib, /usr/local/lib,或者其他自定义的lib下...
  • rosrun turtlesim turtlesim_node 接着打开第三个终端,运行下述命令 rosrun turtlesim turtle_teleop_key 在这个终端中移动键盘上下左右方向键,乌龟就可以移动啦~~~ 卸载时,执行 sudo apt-get remove ros-*
  • 一、前言我的运行环境: 操作系统:Ubuntu Kylin 14.04 ROS版本:Indigo 背景说明:本文记录了ROS的安装和卸载过程与Turtlebot包的安装过程以及其间遇到的问题 本文地址:...
  • Python 调用PIL失败的解决方法今天学习Python的时候,需要安装一个第三方,Python Imaging Library,是Python下面一个非常强大的处理图像的工具,不过PIL目前只支持到Python2.7版本。Pillow是PIL的一个派生分...
  • 标准库是Python默认自带的库,如time库、random库、turtle库等,而第三方库是需要我们去下载并安装到Python的安装目录下的库,如requests库、numpy库、matplotlib库、Pygame库等。就类似于标准库是家中已经有的工具...
  • Python学习记录(一) 引用、安装、说明文档查看、文件打包等。
  • Java多线程 5 多线程其他知识简要介绍一.线程组 /** *Athreadgrouprepresentsasetofthreads.Inaddition,athread *groupcanalsoinclu ... Ajax Asynchronous Javascript+xml :能够向服务器请求额外的数据而无需卸载页...
  • Python内置与第三方

    千次阅读 2019-09-03 23:20:50
    amd64.egg 这几个模块,不要把自定义模块(自己写模块)写到这些文件中,python一旦卸载,这些模块也会清除。 如果非要向path中添加路径,可以向path中添加导入模块的路径: import sys sys.path.append(r'D:/') print...
  • 以下文章来源于5号程序员,作者5号程序员想必刚接触Python的小伙伴一定被安装折磨惨啦… …都说pip install XX要安装啥就安装啥,为啥到我这就不行了呢???难道Python在搞我?!?!不不不,消消气,其实不赖...
  • python安装和matplotlib导入全过程

    千次阅读 2016-11-09 15:01:30
    接下来使用命令在线安装python包总是出现时间超时,下载国外的的时候网速就会特别的差。因此我们可以使用国内的镜像网站进行下载。速度快了不少。 我考虑先下载到本地之后,再导入到python之中。 我在python网站...
  • ROS入门笔记(二):ROS安装与环境配置及卸载(重点) 文章目录1 ROS安装步骤1.1 ROS版本1.2 确定Ubuntu版本号1.3 安装ROS1.3.1 Ubuntu初始环境配置1.3.2 ①添加源地址文件sources.list1.3.3 ②添加密钥(key)1.3.4...

空空如也

空空如也

1 2 3 4 5 ... 16
收藏数 301
精华内容 120
热门标签
关键字:

卸载turtle库