ROS 学习笔记

ROS 学习笔记

http://blog.csdn.net/youngpan1101/article/details/61196300速查笔记

yuanpen 的博客http://blog.csdn.net/youngpan1101

http://blog.csdn.net/youngpan1101/article/details/60962760?locationNum=1&fps=1 

疑难杂症及解决办法

1、catkin:未找到命令

解决办法:http://blog.csdn.net/xiangxianghehe/article/details/78830477 


1   发现roscd beginner_tutorials   进不去目录 beginner_tutorials

在终端输入:

export ROS_PACKAGE_PATH=~/catkin_ws/src:$ROS_PACKAGE_PATH

即可

 

2创建 Package注意路径的设置

以下方法存在,每次编译将同一个文件夹下的所以pkg 都编译  的情况

一般的路径设置为  $ cd %YOUR_CATKIN_WORKSPACE_HOME%/src

我的路径为: cd ~/catkin_ws/src

然后,在这个路径下创建 pkg:设置依赖等

kls@kls-MS-7A15:~/catkin_ws/src$catkin_create_pkg learning_tf tf roscpp rospy turtlesim

编译pkg 注意编译所在的路径位置

kls@kls-MS-7A15:~/catkin_ws$catkin_make

 $ catkin_make

$ source./devel/setup.bash

 

解决

之前必须安装ros
参考之前写的博客:
http://blog.csdn.net/freewebsys/article/details/48056113

rosdep install rviz

#执行初始化

sudo rosdep init

#更新

rosdepupdate12345

然后启动会遇到一个问题:

libGL error: core dri or dri2extension not found

libGL error: failed to load driver:vboxvideo

[ INFO] [1441765508.993507731]:Stereo is NOT SUPPORTED

[ INFO] [1441765508.995292221]:OpenGl version: 2.1 (GLSL 1.2).

Segmentationfault (core dumped)12345

需要设置下环境变量

#设置变量

export LIBGL_ALWAYS_SOFTWARE=1

#启动即可

rosrunrviz rviz

 

 

 

3进程死掉如何查询问题

仅限于在 moveit 配置死掉时出现的问题。

kls@kls-MS-7A15:~$roslaunch urdf_tutorial display.launchmodel:=/opt/ros/indigo/share/pr2_description/robots/pr2.urdf.xacro

 

 

不难发现ros工具的名字都是在对应的UNIX命令的前面加上一个ros

rospack = ros + pack(age) 

roscd = ros + cd 

rosls = ros + ls 

 

4、创建一个catkin package 并且编译运行

 

首先去到你之前创建的工作空间目录:注意路径

 第一步:

$ cd ~/catkin_ws/src

 

catkin_create_pkg 脚本创建一个做'beginner_tutorials'package,依赖于std_msgsroscpp,和roscpy

命令:

catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

第二步:

现在需要在catkin工作空间编译package

$ cd ~/catkin_ws

$ catkin_make

第三步:

$ source ~/catkin_ws/devel/setup.bash

第四步:

使你的环境设置文件生效:

$ source /opt/ros/%YOUR_ROS_DISTRO%/setup.bash()

$ source /opt/ros/groovy/setup.bash     (For Groovy for instance) 

使用catkin_make

catkin_make命令行工具对与标准的catkin工作流程来说是一个非常方便的,你可以理解为它把调用cmake和编译结合起来了。

用法:

# In a catkin workspace

$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]

 

 

 

5.建立一个catkin工作空间并且启用setup 文件

现在需要在catkin工作空间编译package

$ cd ~/catkin_ws

$ catkin_make

执行该命令后会在devel文件夹下生成一个和在/opt/ros/$ROSDISTRO_NAME(ROS版本名这里是/opt/ros/indigo)下相似的结构。

为把工作空间添加到ROS环境变量你需要执行:

$ source ~/catkin_ws/devel/setup.bash

使setup文件生效

 

差询依赖

$ rospack depends1 rospy

定制你的package

 

编译ROS package  的几个步骤:

使你的环境设置文件生效:

$ source /opt/ros/groovy/setup.bash     (For Groovy for instance)

.1使用catkin_make

.2编译你的package

理解ROS Node

小型仿真器,请安装:

$ sudo apt-get install ros--ros-tutorials

是你的版本名字    14.04

 

1.2图概念的概论

Nodes:node是使用ROS去和其它node通信的可执行文件。

Messages:ROS中订阅或者发布给topic的一种数据形式。

Topics:Nodes可以发布messages给一个topic,也可以订阅一个topic去接受它的messages

Master:ROS提供名称服务(比如帮助nodes找到彼此)。

rosout:相当于ROS中的stdout/stderr

roscore:Master+rosout+parameter server(参数服务之后会介绍)

 

1.4用户库

用户库允许用不同语言编写的nodes之间进行通信:

rospy = python client library 

roscpp = c++ client library 

 

1.5roscore

roscore是使用ROS时第一个要使用的工具。

$ roscore

 

可以用一下命令递归改变文件夹的所有者

$ sudo chown -R  ~/.ros

使用rosnode

打开一个新的终端(前面那个roscore不要关闭)

roscore = ros +core:master(提供ros的命名服务)+rosoutstdout/stderr+ parameter server (参数服务之后会介绍);

rosnode = ros +node ;ros用来获取关于node信息的工具;

rosrun = ros + run;从一个给定的package运行一个node.

1.1写一个发布者Node

“Node”是连接在ROS网络中一个可执行单元的术语.这里我们创建一个会不断广播messages的发布者(“talker”node.

改变目录到你之前创建的工作空间的beginner_tutorials package中:

cd ~/catkin_ws/src/beginner_tutorials

 

创建ROS packages

必须包含的两个文件 catkin compliant(编译) package.xml文件(提供关于package的元信息)

包含一个使用catkinCMakeLists.txt文件

一个文件夹中不允许有超过两个的package

工作空间的构成:

workspace_folder/        -- WORKSPACE  

  src/                   -- SOURCE SPACE

    CMakeLists.txt       -- 'Toplevel' CMake file, provided by catkin

    package_1/

      CMakeLists.txt     -- CMakeLists.txt file for package_1

      package.xml        -- Package manifest for package_1

    ...

    package_n/

      CMakeLists.txt     -- CMakeLists.txt file for package_n

      package.xml        -- Package manifest for package_n

        

创建新的package

catkin_create_pkg 脚本创建一个做'beginner_tutorials'package,它依赖于std_msgsroscpp,和roscpy

命令:

catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

 

启用setup 文件

现在需要在catkin工作空间编译package

$ cd ~/catkin_ws

$ catkin_make

执行该命令后会在devel文件夹下生成一个和在/opt/ros/$ROSDISTRO_NAME(ROS版本名这里是/opt/ros/indigo)下相似的结构。

为把工作空间添加到ROS环境变量你需要执行:

$ source ~/catkin_ws/devel/setup.bash

使setup文件生效

 

使你的环境设置文件生效

source /opt/ros/%YOUR_ROS_DISTRO%/setup.bash()

$ source /opt/ros/groovy/setup.bash     (For Groovy for instance)   indigo

 

SRC 中的代码编译

# In a catkin workspace

$ catkin_make

$ catkin_make install  # (optionally)

以上代码可以编译在src文件夹中的任何catkin 工程

如果你的源代码不在src中,可以用my_src代替编译(如果出错,说明my_src不存在):

# In a catkin workspace

$ catkin_make --source my_src

$ catkin_make install --source my_src  # (optionally)

 

 

小型仿真器安装

$ sudo apt-get install ros--ros-tutorials

是你的版本名字   indigo 

 

用一下命令递归改变文件夹的所有者

$ sudo chown -R  ~/.ros

 

rosnode list列出活动的node.

$ rosnode list

rosnode info命令可以返回特定node的信息

$ rosnode info /rosout

 

使用rosrun

rosrun允许你在一个package中去用package的名字直接运行一个node(不需要知道package的路径)。

用法:      $ rosrun [package_name] [node_name]

因此我们可以利用rosrun去运行在turtlesimpackage中的turtlesim_node

在一个新的终端中运行:

$ rosrun turtlesim turtlesim_node

 

turtle_teleop_key 在这个topic上发布按键敲击,而turtlesim订阅同样的topic接受按键敲击.让我们用rqt_graph显示现在正在运行的topicnodes.

 

rqt_grah

rqt_grah创建了一个动态的图形显示系统上正在进行什么,rqt_grahqpt package的一部分.运行:

$ sudo apt-get install ros--rqt

$ sudo apt-get install ros--rqt-common-plugins

用你的ros版本名替代

再在新终端输入:

$ rosrun rqt_graph rqt_graph

 

 

rostopic工具允许你从rostopic中获得信息.

通过:

$ rostopic -h

可以获得等多命令选项

 

对于ROS Hydro和之后的版本:

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

这会给turtle发布一个message告诉它线速度2.0,角速度1.8.

 

这个命令十分复杂,所以我们仔细看看它的每个参数

对于ROS Hydro和之后的版本:

这个命令会发送messages给给定的topic:

rostopic pub

这个选项使得rostopic只发布一条message然后退出:

 -1 

这是要发布给它信息的那个topic:

/turtle1/cmd_vel

这是发布topic时的message类型:

geometry_msgs/Twist

双虚线告诉选项剖析器接下来的参数都不是选择,以免把负号后面的参数当成参数选项。

--

一个geometry_msgs/Twist 有两组由三个浮点元素组成得的向量:线性的和角度的.这样的话,'[2.0, 0.0, 0.0]'就是线性值x=2.0,y=0.0,z=0.0,'[0.0, 0.0, 1.8]'就是角度的值x=0.0,y=0.0,z=1.8.这些参数遵从YAML 语法规则。更多信息查看YAML command line documentation

'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' 

你也许注意到小乌龟已经停止了;这是因为小乌龟需要稳定的1HZ的命令流去保持运动。我们可以用rostopic pub -r命令发布一个稳定的命令流。

对于ROS Hydro和之后的版本:

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

这将以1HZ的速度去发布速度命令给速度topic.

 

使用rosservice 

rosservice可以轻易的附着在ROS的客户或者服务框上,rosservice 可以有许多命令可以在topic上使用,如下所示:

用法:

rosservice list         print information about active services

rosservice call         call the service with the provided args

rosservice type         print service type

rosservice find         find services by service type

rosservice uri          print service ROSRPC uri

 

使用rosparam

rosparam允许你储存和操作在ROS parameter server上的数据,parameter server可以储存整形,浮点型,布尔型,字典型和链表型的数据.rosparam 使用YAML 审定语言以符合语法.简单的例子:YAML看起来十分自然,1是整形,1.0是浮点型,one是字符串,true是布尔型,[1,2,3]是一列的整形,{a:b,c:d}是字典型,rosparam有许多命令可以运行用在parameters上,如下所示:

 

rosparam set            set parameter

rosparam get            get parameter

rosparam load           load parameters from file

rosparam dump           dump parameters to file

rosparam delete         delete parameter

rosparam list           list parameter names

 

rosparam setrosparam get

用法:

rosparam set [param_name]

rosparam get [param_name]

改变背景颜色中的红色比例:

$ rosparam set background_r 150

然后调用clear service使这个参数改变生效:

 

使用roslaunch

roslaunch按照launch文件中的定义去启动nodes

用法:

$ roslaunch [package] [filename.launch]

首先进入我们之前创建和编译的beginner_tutorials package

$ roscd beginner_tutorials

 

创建一个叫做turtlemimic.launchlaunch文件  创建文件 .cpp

gedit turtlemimic.launch 

ubuntu默认的编辑器gedit创建一个launch文件。

 

现在我们用roslaunch 启动launch文件

$ roslaunch beginner_tutorials turtlemimic.launch

 

rosed.

rosedrosbash套件的一部分.它可以使你通过package的名字直接编辑一个package中的文件而不用输入package的整个路径.

用法:

$ rosed [package_name] [filename]

例子:

$rosed roscpp Logger.msg

 

创建一个msg   echo 写入

让我们在之前的教程创建的package中创建一个新的msg.

$ cd ~/catkin_ws/src/beginner_tutorials

$ mkdir msg

echo "int64 num" > msg/Num.msg

上面例子的.msg文件只有一行.当然你也可以通过添加其它元素创建一个更加复杂的文件,每行一个元素,像这样:

string first_name

string last_name

uint8 age

uint32 score

还有一步要做.我们需要确定在msg文件能够转化为C++,Python源代码或者其它语言

打开package.xml文件,确认有下面两行并且没有被注释掉.

  message_generation

  message_runtime

注意:在编译的时候我们需要”message_generation”,而在运行的时候,我们只需要”message_runtime”

ros ubuntu 中打开 pdf

$ evince frames.pdf

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
ROS 工作空间与程序包的创建

http://blog.csdn.net/u013164707/article/details/52422810

原创2016090313:40:39

·     标签:

·     ubuntu /

·     ROS

·      


cn - ROS WiKi

 

前文已经安装Ubuntu14.04ROS Indigo……

1.创建工作空间

首先需要添加source

[html]viewplaincopy

1.   source /opt/ros/indigo/setup.bash  


接下来创建catkin工作空间

[html]viewplaincopy

1.   mkdir -p ~/catkin_ws/src  

 

[html]viewplaincopy

1.   cd ~/catkin_ws/src  

 

[html]viewplaincopy

1.   catkin_init_workspace  

 

[html]viewplaincopy

1.   cd ~/catkin_ws/  

 

[html]viewplaincopy

1.   catkin_make  

 

然后添加source

[html]viewplaincopy

1.   source devel/setup.bash  


确认路径

[html]viewplaincopy

1.   echo $ROS_PACKAGE_PATH  

 

输出结果(版本名称可能不同)

[html]viewplaincopy

1.   /home/youruser/catkin_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks  

 

2.创建catkin

[html]viewplaincopy

1.   cd ~/catkin_ws/src  

 

举个栗子(beginner_tutorials

[html]viewplaincopy

1.   catkin_create_pkg beginner_tutorials std_msgs rospy roscpp  

 

[html]viewplaincopy

1.   cd ~/catkin_ws  

 

[html]viewplaincopy

1.   catkin_make  

 

添加source源(source可用“. ”代替)

[html]viewplaincopy

1.   source ~/catkin_ws/devel/setup.bash  

 

[html]viewplaincopy

1.   catkin_make install  

 

[html]viewplaincopy

1.   catkin_make --force-cmake  


目录下package.xml文件解释见http://wiki.ros.org/catkin/Tutorials/CreatingPackage

 

以上便可建立工作空间与ROS包,后续建立*.cpp文件完成功能实现。


 

 


URDF通用机器人格式化描述文件学习笔记

http://blog.csdn.net/fromcaolei/article/details/50826066

 


URDF 学习记录

http://blog.csdn.net/hzy925/article/details/78459911

http://wiki.ros.org/urdf/Tutorials

 

研发组推荐的学习参考:内有介绍link joint 的坐标关系以及程序编写的语法

http://blog.csdn.net/xu1129005165/article/details/53413954

 

 

 

1 从一无所有创建一个可视化的使用URDF的机器人模型 
学习如何创建一个能够在rviz中看到的机器人模型。在这部分教程中,我们将创建一个乍一看很像R2D2的机器人模型。在后面的教程中,你会学到如何用关节连接模型,添加一些物理属性,用xacro生成更加整洁的代码,并使之能够在gazebo中移动。但是到目前为止,我们将集中在正确的得等到一个几何可视化模型上。 
在这些教程中,我们将以来一些来自urdf_tools包中的工具和launch文件。尤其是,joint_state_publisher需要从华盛顿大学的源下载,连接到joint_state_publisher维基页面上。这些教程中提到的所有的机器人模型都能够在urdf_tutorial包中找到。 
1.1
一个形状 
首先,我们来探索一个简单的形状。

<robotname="myfirst">

  <linkname="base_link">

   <visual>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

   visual>

  link>

robot>12345678910

把这些xml语言翻译过来就是,这是一个名为myfirst的机器人,包括一个link,可视化部件仅仅是一个圆柱体,0.6米长,半径是0.2米。 
可以检查一下这个模型:

roslaunch urdf_tutorial display.launchmodel:=urdf/01-myfirst.urdf1

这里完成了三件事情: 
加载特定的模型到参数服务器 
运行节点来发布关节状态和转换 
运行rviz及其配置文件 
这个launch文件假设01-myfirst.urdf在你所运行命令的文件夹的urdf子文件夹中,否则,你可以用:model:=’$(findpkg-name)/urdf/01-myfirst.urdf’。这里pkg-name是这个文件所在包的名称。这里所有的例程都在urdf_tutorial包中。 
我们可以看到下面的画面: 

需要注意的是: 
固定坐标系是网格中心所在的转换坐标系,这里,它是你定义的base_link坐标 
可视元素有自己的原点,在几何形状的形心位置。所以,圆柱的一半在网格的下面。 
1.2
多个形状 
现在让我们来看看如何添加多个形状。如果我们仅仅添加更多的link元素到urdf中的话,解析器不知道该如何放置它们,所以,我们必须添加关节。关节元素可以是柔性关节,也可以是刚性关节。我们将从刚性关节或固定关节开始。

<robotname="multipleshapes">

  <linkname="base_link">

   <visual>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

   visual>

  link>

 

  <linkname="right_leg">

   <visual>

     <geometry>

       <boxsize="0.6 .2 .1"/>

     geometry>

   visual>

  link>

 

  <jointname="base_to_right_leg"type="fixed">

   <parentlink="base_link"/>

   <childlink="right_leg"/>

  joint>

 

robot>123456789101112131415161718192021222324

注意我们如何定义一个0.6m×0.2m×0.1m的盒子 
关节定义要依据父子关系。URDF最终是一个树结构,有一个root link。这就意味着腿的位置依赖于base_link的位置。

roslaunch urdf_tutorial display.launchmodel:=urdf/02-multipleshape.urdf1

所有形状相互重叠,因为他们有相同的原点,如果我们不想让他们重叠的话,我们必须定义更多的原点。 
1.3
原点 
R2D2
的腿连接到它半边躯干的顶部。所以,我们要确定关节的原点。同时,它不连接到腿的中间位置,而是连接到上面的部分。我们也就必须确定腿的原点的偏移量。同时我们需要旋转腿让他直立起来。

<robotname="origins">

  <linkname="base_link">

   <visual>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

   visual>

  link>

 

  <linkname="right_leg">

   <visual>

     <geometry>

       <boxsize="0.6 .2 .1"/>

     geometry>

     <originrpy="0 1.57075 0"xyz="0 0-0.3"/>

   visual>

  link>

 

  <jointname="base_to_right_leg"type="fixed">

   <parentlink="base_link"/>

    <childlink="right_leg"/>

   <originxyz="0.22 0 .25"/>

  joint>

 

robot>1234567891011121314151617181920212223242526

让我们开始检查关节的原点。它根据父节点的参考系来定义。所以我们有在X方向上(左)0.22米和Z方向(上)0.25米。这就是说忽略掉子连接的可视化原点标签,子连接将会是在左上。因为我们不确定一个rpy(横滚、俯仰、偏转)属性,子参考系将会默认有一个与父参考系相同的方向。 
现在看一下腿的可视原点,它由xyzrpy偏移量。这定义了可视元素的中心会在哪个位置,与它的原点相关。因为我们想要腿连接到顶部,我们通过设置Z偏移量为-0.3米来将原点向下移动。因为我们想要腿与Z轴平行,我们需要绕Y轴旋转PI/2.

roslaunch urdf_tutorial display.launchmodel:=urdf/03-origins.urdf1


这个launch文件运行的包将会为基于你的URDF模型的每一个link创建TF坐标系。Rviz用这个信息指出在什么位置显示每一个形状。 
如果一个给定的URDF linkTF坐标系不存在,它将会被放置在白色的原点。 
1.4
材料 
“Aright”
,我听见你说,这很有趣,但是不是每个人都有一个B21。我的机器人和R2D2不是红色的!说得很好,让我们来看一下材料标签。

<robotname="materials">

  <linkname="base_link">

   <visual>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

     <materialname="blue">

       <colorrgba="0 0 .8 1"/>

     material>

   visual>

  link>

 

  <linkname="right_leg">

   <visual>

     <geometry>

       <boxsize="0.6 .2 .1"/>

     geometry>

     <originrpy="0 1.57075 0"xyz="0 0-0.3"/>

     <materialname="white">

       <colorrgba="1 1 1 1"/>

     material>

   visual>

  link>

 

  <jointname="base_to_right_leg"type="fixed">

   <parentlink="base_link"/>

   <childlink="right_leg"/>

   <originxyz="0.22 0 .25"/>

  joint>

 

  <linkname="left_leg">

   <visual>

     <geometry>

       <boxsize="0.6 .2 .1"/>

     geometry>

     <originrpy="0 1.57075 0"xyz="0 0-0.3"/>

     <materialname="white"/>

   visual>

  link>

 

  <jointname="base_to_left_leg"type="fixed">

   <parentlink="base_link"/>

   <childlink="left_leg"/>

   <originxyz="-0.22 0 .25"/>

  joint>

 

robot>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

机器人身体现在是蓝色的。通过添加材料标签,我们用定义一个新的称之为蓝色的材料,将RGBA分别定义为0,0,0.8,1。取值范围都在[0,1] 
白色材料定义很简单。 
对于第二条腿,我们只需要通过材料名称来指定就可以了。因为我们之前已经定义过了。 
你也可以使用纹理来定义一个图像文件作为颜色的对象。

roslaunch urdf_tutorial display.launchnodel:urdf/04-materials.urdf1

1.5 完成这个模型 
现在我们用更多的形状来完成这个模型。最明显的,我们要添加一个球和一些网格,我们也需要添加一些我们后面要用到的碎片。(整个源文件的链接https://github.com/ros/urdf_tutorial/blob/master/urdf/05-visual.urdf 

添加球体

  <linkname="head">

   <visual>

     <geometry>

       <sphereradius="0.2"/>

     geometry>

     <materialname="white"/>

   visual>

  link>12345678

网格是从pr2借用的,意味着你需要pr2_description包且其可见。

  <linkname="left_gripper">

   <visual>

     <geometry>

       <meshfilename="package://pr2_description/meshes/gripper_v0/l_finger.dae"/>

     geometry>

   visual>

  link>1234567

网格可以从一些不同的格式来导入。STL是一种通用的格式,但是这个引擎也支持DAE格式,它有自己的颜色数据,意味着你不需要来确定颜色。 
网格也可以通过相关的缩放参数或者边界尺寸来定义大小尺寸。 
2
使用URDF创建一个可动的机器人模型 
在这部分教程中我们将修正我们在上一部分教程中建立的R2D2模型,使它有一个可动的关节。在之前的模型中,所有的关节都是固定的。现在我们来探索关节非常重要的三种类型:continuous,revoluteprismatic 
这部分教程依赖于一些来自urdf_tools包中的工具和launch文件。最为明显的,joint_state_publisher需要从华盛顿大学的源下载,链接到joint_state_publisher的维基页面。 
https://github.com/ros/urdf_tutorial/blob/master/urdf/06-flexible.urdf这是新的具有灵活关节的urdf。你可以与之前的版本作比较来看看每一个改动过的地方,这里我们只集中精力看三个例子关节。 
为了可视化控制这个模型,运行roslaunchurdf_tutorial display.launch model:=urdf/06-flexible.urdf gui:=True.这时也会跳出一个GUI界面,允许你来控制非固定部分的关节运动。可以先玩一玩体验一下,然后我们来看看怎么来完成这个效果。 

2.1

  <jointname="head_swivel"type="continuous">

   <parentlink="base_link"/>

   <childlink="head"/>

   <axisxyz="0 0 1"/>

   <originxyz="0 0 0.3"/>

  joint>123456

身体和头之间的连接是一个连续关节,就是说它可以到从负无穷到正无穷的每一个角度。轮子也是这样的一个模型,所以它也可以在两个方向想永远旋转。 
我们需要添加的额外信息是旋转轴,这里要通过xyz三元组来确定,这里确定一个头可以绕之转动的向量。因为我们想要绕z轴转动,所以给定的向量是:0,0,1“ 
2.2
夹子

  <jointname="left_gripper_joint"type="revolute">

   <axisxyz="0 0 1"/>

   <limiteffort="1000.0"lower="0.0"upper="0.548"velocity="0.5"/>

   <originrpy="0 0 0"xyz="0.2 0.01 0"/>

   <parentlink="gripper_pole"/>

   <childlink="left_gripper"/>

  joint>1234567

左右夹子的关机都被定义为一个旋转关节。就是说它们可以像连续型关节一样旋转,但是它们有严格的限制。因此,我们必须包含limit标签来定义上限和下限(弧度)我们也必须确定这个关机的最大速度和力。 
2.3
夹臂

  <jointname="gripper_extension"type="prismatic">

   <parentlink="base_link"/>

   <childlink="gripper_pole"/>

   <limiteffort="1000.0"lower="-0.38"upper="0"velocity="0.5"/>

   <originrpy="0 0 1.57075"xyz="00.19 .2"/>

  joint>123456

这个夹臂是一个不太一样的关节,称之为棱状关节。这就是说它沿着一个轴运动,而不是绕着它运动。这样的变换运动允许我们的机器人模型伸展和收缩它的手臂。 
棱状手臂的限制用与旋转手臂同样的方法来定义,只不过它的计量单位是米而不是弧度。 
2.4
其他类型的关节 
在空间运动的关节还有两种类型,像棱状关节一样,还有平面关节,它可以在一个平面内运动。更多地,浮动关节式不受约束的。可以在三维空间中任意运动。这些关节不能只被一个数字定义,所以在这个教程中就不在讲述了。 
2.5
定义姿态 
在你移动GUI的滑块的时候,模型在Rviz中运动,这是怎么做到的呢,首先GUI解析了URDF,找到所有非固定关节和他们的限制。然后,它用滑块的值发布sensor_msgs/JointState消息。那些后来用robot_state_publisher计算不同部件之间的转换。转换树的结果用来显示所有的形状。 
3
添加PhysicalCollision属性到一个URDF模型中 
3.1 Collision 
到目前为止,我们仅仅用单个的子元素确定了我们的linksvisual定义了机器人看起来的样子。然而,为了使碰撞探测能够工作来像Gazebo一样模拟机器人,我们需要定义碰撞元素。 
https://raw.githubusercontent.com/ros/urdf_tutorial/master/urdf/07-physics.urdf这里是带有碰撞元素和物理属性的模型文件。 
下面是我们新的base_link的代码

<linkname="base_link">

   <visual>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

     <materialname="blue">

       <colorrgba="0 0 .8 1"/>

     material>

   visual>

   <collision>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

   collision>

  link>123456789101112131415

碰撞元素是link对象的一个子元素,与visual标签处于同样的地位。 
碰撞元素定义的方式和形状定义时一样的,用一个geometry标签。geometry标签的格式和visual中的是一样的。 
你也可以定义一个圆点作为碰撞标签的子元素。 
在很多情况下,你想要碰撞geometryoriginvisual中的geometryorigin是完全一样的,然而,有两种情况是你不想看到的。 
更快的执行——为两个网格做碰撞检测要比为简单的几何形状做碰撞检测做更复杂的运算,所以,你在碰撞检测中向用简单的几何形状来取代网格。 
安全区域——你有时候想要靠近敏感设备做严格的运动,比如,我们不想要r2d2的头做任何的碰撞,我们或许定义碰撞形状为一个圆柱来包住它的头,从而不让任何东西靠近。 
3.2
物理属性 
为了能够使得模型正确的仿真,你需要为你的机器人定义一些物理属性。比如像Gazebo中的物理引擎。 
3.2.1
惯性 
每一个连接元素都需要一个惯性标签,下面是一个简单的例子。

  <linkname="base_link">

   <visual>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

     <materialname="blue">

       <colorrgba="0 0 .8 1"/>

     material>

   visual>

   <collision>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

   collision>

   <inertial>

     <massvalue="10"/>

     <inertiaixx="0.4"ixy="0.0"ixz="0.0"iyy="0.4"iyz="0.0"izz="0.2"/>

   inertial>

  link>12345678910111213141516171819

这个元素也是link对象的一个子元素 
质量的定义单位是千克 
这个3×3的转动惯量矩阵由惯性元素定义。因为这时对称的,它可以只用6个元素来表示 
ixx ixy ixz 
ixy iyy iyz 
ixz iyz izz 
这个信息可以由像MeshLab这样的模型程序来提供给你。原始几何体的转动惯量是可以计算的(比如圆柱、长方体、球体) 
惯性张量取决于质量和对象质量的分布,一个好的第一近似值是假设等于质量再体积中的分布,计算惯性张量基于对象的形状。 
如果不确定该怎么定,矩阵ixx/iyy/izz=1e-3或者更小的值通常被用于一个中等尺寸默认值(它适合一个0.1米边长的盒子质量是0.6kg)。尽管通常被选用,这个定义矩阵是一个相当糟糕的值,因为通常情况下它太高了。 
你也可以定义一个origin标签来确定重心和惯性参考系。 
当使用实时控制器时,惯性元素设为0可能造成机器人模型在无警告的情况下崩溃,所有link的原点都会变得与世界坐标系的原点重合。 
3.2.2
接触系数 
当各个连接相互接触时,你也可以定义他们的行为。这可以用collision标签的子元素contact_coefficients来定义,有下面三个属性需要指定: 
 mu——
摩擦系数 
 kp——
刚度系数 
 kd——
阻尼系数 
3.2.3
关节动力学 
关节如何运动由关节的dynamics标签定义。有两个属性需要指定 
friction——
物理静摩擦力。对于棱状关节来说,它的单位是牛顿,对于旋转关节来说,它的单位是牛米。 
damping——
物理阻尼值。对于棱状关节来说,单位是牛/米,对于旋转关节来说,单位是N▪m/rad 
如果不定义,这些系数默认取值为0. 
3.3
其他标签 
在单纯的URDF领域内,还有两个保留标签来定义关节:calibrationsafety controller 
4
使用Xacro来清理URDF文件。 
到现在为止,如果你按照所有这些步骤设计你的机器人,你或许会纠结于各种各样的数学计算来做非常简单的机器人描述和正确解析。幸运的是,你可以用xacro包来是你的生活更加简单,它做了以下三件非常有用的事情。 
 Constants
常数 
 Simple Math
简单数学 
 Macros
宏计算 
在这个教程中,我们来看看这些捷径是如何减少URDF文件的大小和使它仍然易读的。 
4.1
使用Xacro 
就像它的名字所指的那样,xacro是一种宏语言。xacro语言运行所有的宏命令并输出其结果。典型应用就像下面这样: 
rosrun xacro xacro.py model.xacro > model.urdf 
你也可以在一个launch文件中自动生成urdf。这是很方便的,因为它可以保持更新而不使用硬件驱动空间。然而,它需要花费时间来生成。所以要注意你的launch文件可能需要更长的启动时间(以pr2_description为例)。

<param name="robot_description"

  command="$(findxacro)/xacro.py '$(find pr2_description)/robots/pr2.urdf.xacro'" />12

URDF文件的顶部,你必须指定一个命名空间,来让文件正确解析。比如,这些就是一个可用的xacro文件的最开始两行:

<robotxmlns:xacro="http://www.ros.org/wiki/xacro"name="firefighter">12

4.2 常量 
我们来快速看一眼R2D2中的base_link

 <linkname="base_link">

   <visual>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

     <materialname="blue">

       <colorrgba="0 0 .8 1"/>

     material>

   visual>

   <collision>

     <geometry>

       <cylinderlength="0.6"radius="0.2"/>

     geometry>

   collision>

  link>123456789101112131415

这里的信息有一点冗余,我们制定了圆柱的半径两次。更糟糕的是,如果我们想要改变它,我们需要更改两个地方。 
幸运的是,xacro允许你指定作为常数的属性。上面的代码,我们可以写成这样:

<xacro:propertyname="width"value=".2" />

<xacro:propertyname="bodylen"value=".6" />

<linkname="base_link">

   <visual>

       <geometry>

            <cylinderradius="${width}"length="${bodylen}"/>

       geometry>

       <materialname="blue">

            <colorrgba="0 0 .8 1"/>

       material>

   visual>

   <collision>

       <geometry>

            <cylinderradius="${width}"length="${bodylen}"/>

       geometry>

   collision>

link>1234567891011121314151617

这两个值在刚开始的两行中指定了。他们其实可以在任何地方指定,我们一般放在首行的位置。 
跟指定实际半径值不一样,我们用一个美元符号和花括号修饰了这两个量 
这段代码跟上面的代码实际上是一样的。 
${}
结构里面的内容的值通常被用来替代这个结构,意味着你可以把它与文本结合起来使用

<xacro:propertyname=”robotname”value=”marvin” />

<linkname=”${robotname}s_leg” />12

就会生成

<linkname=”marvins_leg” />1

4.3 数学 
你可以在${}中通过使用操作符(+,-,*,/)反复构建复杂的表达式,一元减法和括号。不支持幂运算和取模运算。例如:

"${wheeldiam/2}"length=".1"/>

"${reflect*(width+.02)} 0 .25" />12

所有的运算用的都是float类型,因此

<link name="${5/6}"/>1

求值结果为:

<linkname="0.833333333333"/>1

4.4  
这对于xacro包来说是最大最有用的部件。 
4.4.1
简单宏 
让我们来看一下简单的没有用的宏

<xacro:macroname="default_origin">

   <originxyz="0 0 0"rpy="0 0 0"/>

xacro:macro>

<xacro:default_origin />1234

(这样做是没有用的,因为如果原点没有指定,其默认值跟这里指定的是一样的),这个代码将生成:

<originrpy="0 0 0"xyz="0 0 0"/>1

技术上讲这不是一个必备的元素,但是你需要指定它来使用它 
每一个

   <xacro:macroname="default_inertial"params="mass">

       <inertial>

                <massvalue="${mass}" />

                <inertiaixx="1.0"ixy="0.0"ixz="0.0"

                     iyy="1.0"iyz="0.0"

                     izz="1.0" />

       inertial>

xacro:macro>12345678

可以像下面这样使用:

<xacro:default_inertialmass="10"/>1

参数就像是一个属性,你可以在表达式中使用它们 
你也可以将整个块作为参数:

<xacro:macroname="blue_shape"params="name*shape">

   <linkname="${name}">

       <visual>

            <geometry>

                <xacro:insert_blockname="shape" />

           geometry>

            <materialname="blue">

                <colorrgba="0 0 .8 1"/>

            material>

       visual>

       <collision>

            <geometry>

                <xacro:insert_blockname="shape" />

            geometry>

       collision>

   link>

xacro:macro>

 

<xacro:blue_shapename="base_link">

   <cylinderradius=".42"length=".01" />

xacro:blue_shape>123456789101112131415161718192021

要指定一个块参数,要在它的参数名称之前加一个
一个块可以用insert_block命令来插入 
插入块可以插入多次 
4.5
实际应用 
宏语言允许你做的事情更加的灵活。在R2D2模型中有一些非常有用的方法来使用xacro 
来看看宏文件生成的模型,运行下面的命令:

roslaunch urdf_tutorial xacrodisplay.launchmodel:=urdf/08-macroed.urdf.xacro1

4.5.1 Leg macro 
通常你会想在不同的位置上生成很多相似的对象。通常都会是一些对称的位置。你可以使用一个宏和一些简单的数学来减少你要写的代码量,就像我们在R2的腿中做的那样

<xacro:macroname="leg"params="prefix reflect">

   <linkname="${prefix}_leg">

       <visual>

            <geometry>

                <boxsize="${leglen} .2 .1"/>

            geometry>

            <originxyz="0 0 -${leglen/2}"rpy="0${pi/2} 0"/>

            <materialname="white">

                <colorrgba="1 1 1 1"/>

            material>

       visual>

       <collision>

            <geometry>

                <boxsize="${leglen} .2 .1"/>

            geometry>

            <originxyz="0 0 -${leglen/2}"rpy="0${pi/2} 0"/>

       collision>

       <xacro:default_inertialmass="10"/>

   link>

 

   <jointname="base_to_${prefix}_leg"type="fixed">

       <parentlink="base_link"/>

       <childlink="${prefix}_leg"/>

       <originxyz="${reflect*(width+.02)} 0 .25" />

   joint>

   

xacro:macro>

<xacro:legprefix="right"reflect="1" />

<xacro:legprefix="left"reflect="-1" />1234567891011121314151617181920212223242526272829

命令窍门1:使用一个名称前缀来得等到两个相似的对象名称 
命令窍门2:使用数学计算关节原点,以防你改变你的机器人尺寸,用一些数学计算改变一个属性来计算关节偏移量会减少很多麻烦 
命令窍门3:使用一个反射参数,设置其为1或者-1。看看我们如何使用反射参数来把腿放在处在base_to_${prefix}_leg原点的身体的两侧

 

 

 


使用URDF创建机械臂仿真模型

http://blog.csdn.net/xu1129005165/article/details/53413954

 

使用ROS强大的机器人功能,建立ROS可以识别的机器人模型是第一步,也是无法绕过去的环节.ROS通过URDF(UnifiedRobotDescription Format)就是描述机器人硬件尺寸布局.它是同ROS沟通的渠道,有了机器人的物理尺寸,ROS就可以有效的进行Navagation和碰撞检测(collision detect)了。
Unified Robot Description Format,统一机器人描述格式,简称为URDFROS中的urdf功能包包含一个URDFC++解析器,URDF文件使用XML格式描述机器人模型。必须承认,URDF 是个很难懂的语言,但有RViz的强大仿真功能,我们很容易调试它。

一,软件环境

OS:Ubuntu 15.10

ROS:KineticFull package12

.基础模型

创建工作空间,src下创建beginner_tutorials功能包(见相关ROS基础入门)
1.
创建ros package命名为beginner_tutorials

catkin_create_pkgmy_robot std_msgs rospy roscpp urdf1

2.建立文件夹launchurdf分别用来存放.launch文件和.urdf文件
3.
建立urdf文件
beginner_tutorials 文件夹下建立urdf文件夹,创建机械臂的描述文my_robot.urdf,描述代码如下:

    

     

     

     

     

     

       

       

     

     

        

        

     

     

       

       

     

     123456789101112131415161718

上边的URDF模型定义了机器人的4个环节(link),然后定义了三个关节(joint)来描述环节之间的关联。

ROS为用户提供了一个检查URDF语法的工具:

sudoapt-get install liburdfdom-tools1

安装完毕后,执行检查:

check_urdfmy_robot.urdf1

出现错误:

Error: Error document empty.

         at line 72 in/build/buildd/urdfdom-0.2.10+dfsg/urdf_parser/src/model.cpp

ERROR:Model Parsing the xml failed123

解决:

check_urdf/home/daniel/catkin_ws/src/beginner_tutorials/urdf/my_robot.urdf1

然后正常显示:

robot name is: my_robot

---------- Successfully Parsed XML---------------

root Link: link1 has 2 child(ren)

   child(1):  link2

   child(2):  link3

        child(1):  link4

1234567

. 添加机器人尺寸

在基础模型之上,我们为机器人添加尺寸大小。由于每个环节的参考系都位于该环节的底部,关节也是如此,所以在表示尺寸大小时,只需要描述其相对于连接的关节的相对位置关系即可。urdf中的域就是用来表示这种相对关系。(定义每个link所在位置)
为所有关节应用尺寸:

   

     

     

     

     

     

       

       

       

     

       

       

       

       

     

       

       

       

       

    

   

12345678910111213141516171819202122

例如,joint2相对于连接的link1x轴和y轴都有相对位移,而且在z轴上还有90度的旋转变换,所以表示成域的参数就如下所示:

    1

.添加运动学参数

如果我们为机器人的关节添加旋转轴参数,那么该机器人模型就可以具备基本的运动学参数。
例如,joint2围绕正y轴旋转,可以表示成:

   1

同理,joint1的旋转轴是:

 

12

应用到我们的URDF中:

   

     

     

     

     

     

       

       

       

       

     

       

       

       

       

       

     

       

       

       

       

       

    

   

12345678910111213141516171819202122232425

然后使用check_urdf检查语法错误。

. 图形化显示URDF模型

我们现在已经完成了一个简单的URDF模型创建,ROS提供了相应的工具可以让URDF图像化显示出来。

urdf_to_graphiz /home/daniel/catkin_ws/src/my_robot/urdf/my_robot.urdf1

然后打开生成的pdf文件,即可看到图形化的urdf

. 创建display.launch文件

该文件可以帮助启动RViz来观察机器人。其中有三个node,一个是rviz,另外两个joint_state_publisher robot_state_publisher是必须的node

第一个输入参数 model 就是要启动的urdf文件路径。
第二个输入参数 gui 指定是否启用关节转动控制面板窗口。

 

   

   

   

   

   

   

   

  123456789

link可以指定许多属性:
定义惯性
定义一个link的外观,大小,颜色和材质纹理贴图
定义碰撞检测属性
我们详细看一下的定义:

定义了几何形状为一个立方体,三个参数分别为长宽高,单位是米(m). 这里我们指定下层小车板子的板的尺寸。可以有好几个选项:立方体圆柱体球体
指定颜色rgb和透明度a. 它们取值范围都是[,1] 区间。
切换到launch文件夹下,
使用下面命令启动rviz来查看我们刚刚完成的机器人模型:

 roslaunch urdf_tutorial display.launchmodel:=urdf/my_robot.urdf

报错:

Invalid tag: Cannot loadcommand parameter [robot_description]: command[/opt/ros/indigo/share/xacro/xacro.py my_robot.urdf] returned with code [1].

 

Param xml is

Thetraceback for the exception was written to the log file

 

 

 


如何下载并安装代码包

http://blog.csdn.net/dingjianfeng2014/article/details/52955107

 

使用ros系统,需要用到许多数据包,有些时候你需要使用的ROS数据包并没有Debian包的形式,这时你需要从数据源安装它。代码开发人员通常使用的有三种主流的版本控制系统:SVNGitMercurial。下面介绍一下如何使用Git来下载你需要的代码资源。
首先创建并编译好你需要使用的工作空间,然后执行下面的操作:
cd
/catkin_ws/src //此处为你自己创建的工作空间
git clone
https://github.com/pirobot/rbx1.git//此处为你需要代码的地址
cd rbx1 //
根据你下载生成的文件夹来确定
git checkout indigo-devel //
根据你安装的ros版本来确定,我使用的是indigo版本
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
如果github上的代码在晚些时候更新了,你可以把跟新后的版本和本地保存的代码资源用以下命令合并:
cd ~/catkin_ws/src/rbx1
git pull
cd ~/catkin_ws
catkin_make
source devel/setup.bash

 

 

 

c++ 写入信息到 txt

每次打开并且写入,会覆盖掉之前的信息,除非 c++文件追加写入或者每个工程中之打开一次(因为每次打开并且写入会覆盖掉之前的内容)

 

 

 


TF 官方介绍

http://wiki.ros.org/tf/Tutorials/Introduction%20to%20tf

Sceneary1:one turtle will continuously move to follow the turtle you aredriving around

This demo is using the tf library to create

three coordinate frames: a world frame, a turtle1 frame, and a turtle2 frame.

This tutorial uses a tfbroadcaster to publish the turtle coordinate frames and a tflistener to compute the difference in the turtle frames andmove one turtle to follow the other.

三个坐标系,一个tf 发布   一个tf 接收

 

Introduction to tf

Description: This tutorial will give you a good idea of what tf can do for you.It shows off some of the tf power in a multi-robot example using turtlesim. This also introduces using tf_echo, view_frames, rqt_tf_tree, and rviz.

 

Running the Demo

 

$ roslaunch turtle_tf turtle_tf_demo.launch

 

Using view_frames

$ rosrun tf view_frames

 $evince frames.pdf   打印显示出pdf 

 

Using rqt_tf_tree

rosrun rqt_tf_tree rqt_tf_tree

 

Using tf_echo

rosrun tf tf_echo [reference_frame] [target_frame]

 Let's look at the transform of the turtle2frame with respect to turtle1 frame which is equivalent to 

 

rvizand tf

$ rosrun rviz rviz -d `rospack findturtle_tf`/rviz/turtle_rviz.rviz

 

 

 

Writing atf broadcaster (C++)

http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20broadcaster%20%28C++%29

 

 

TF 练习样例

 

http://blog.csdn.net/Start_From_Scratch/article/details/50762293

 

 

http://blog.csdn.net/Start_From_Scratch/article/details/50762293

 

写一个Tf 的几个步骤

1、创建 pkg ,在合适的路径下, catkin_create_pkg

2、编译pkg catkin_make ,  source./devel/setup.bash

3、写 tf_broadcaster.cpp  文件, pkg 包中

 

 

你可能感兴趣的:(ROS 学习笔记)