tf
包中的view_frames
节点可以绘制一个坐标链接图(带帧数)rqt_tf_tree
包中的rqt_tf_tree
节点可以显示由tf广播的不同框架tf
包中的tf_echo [reference_frame] [target_frame]
可查看target frame目标坐标系在reference frame参考坐标系中的位置`std::string turtle_name;
service服务节点
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"//自定义的srv生成的头文件
bool add(beginner_tutorials::AddTwoInts::Request &req, //提供ros服务从Request读入,结果装入Response中
beginner_tutorials::AddTwoInts::Response &res) //这些数据结构都在AddTwoInts.h中自动生成
{
res.sum = req.a + req.b;
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.sum);
return true;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints", add);//服务名为add_two_ints
ROS_INFO("Ready to add two ints.");
ros::spin();
return 0;
Client节点
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>
int main(int argc, char **argv)//argc-1为参数个数
{
ros::init(argc, argv, "add_two_ints_client");
if (argc != 3)
{
ROS_INFO("usage: add_two_ints_client X Y");
return 1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");//为add_two_ints服务创建client
beginner_tutorials::AddTwoInts srv;//创建服务数据类型
srv.request.a = atoll(argv[1]);//写入request信息
srv.request.b = atoll(argv[2]);
if (client.call(srv))//调用成功则输出response信息
{
ROS_INFO("Sum: %ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failed to call service add_two_ints");
return 1;
}
return 0;
}
add_executable(add_two_ints_client src/add_two_ints_client.cpp) target_link_libraries(add_two_ints_client ${catkin_LIBRARIES}) add_dependencies(add_two_ints_client beginner_tutorials_gencpp) ```
发布器
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::NodeHandle n;//节点句柄
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);//准备发布话题 话题类型模板给出,话题名,话题长度参数给出
ros::Rate loop_rate(10);//ros::Rate对象指定自循环频率
int count = 0;
/*
1 SIGINT 被触发 (Ctrl-C)
2 被另一同名节点踢出 ROS 网络
3 ros::shutdown() 被程序的另一部分调用
4 节点中的所有 ros::NodeHandles 都已经被销毁
时ros::ok()为false
*/
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());//代替printf/cout
chatter_pub.publish(msg);//publish之前需要一段时间来通知关于这个主题的发布器与订阅器
ros::spinOnce(); //执行订阅者的回调函数
loop_rate.sleep();
++count;
}
return 0;
}
接收器
#include "ros/ros.h"
#include "std_msgs/String.h"
//回调函数,参数为话题中的消息
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
//任何ROSnode都要先初始化
ros::init(argc, argv, "listener");
//定义Node句柄,会完全初始化此节点
ros::NodeHandle n;
//告诉mastet node 想接收消息的方式,如下为接收chatter主题,收到是调用chatterCallback回调函数,缓存队列1000
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
//进入循环 ctrl-C时退出或被master node关闭
ros::spin();//循环执行回调函数
return 0;
}
CMakeLists.txt 在包目录下创建包时生成 最底部添加内容
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)
## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
## Declare ROS messages and services
add_message_files(FILES Num.msg)
add_service_files(FILES AddTwoInts.srv)
## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)
## Declare a catkin package
catkin_package()
## Build talker and listener
##包含头文件的目录
##$ {Boost_INCLUDE_DIRS} $ {catkin_INCLUDE_DIRS}变量中有Boost与catkin的库目录
include_directories(include ${catkin_INCLUDE_DIRS})
####构建名为talker的可执行文件,它由src/talker.cpp源文件构成
add_executable(talker src/talker.cpp)
##指定链接库位置将talker与变量${catkin_LIBRARIES}的内容链接
target_link_libraries(talker ${catkin_LIBRARIES})
##为目标可执行文件添加依赖
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
catkin_make
编译roscore
运行master nodesource ./devel/setup.bash
加载环境变量rosrun
运行节点转自:CSDN
写程序大体步骤为:
1.用编辑器编写源代码,如.c文件。
2.用编译器编译代码生成目标文件,如.o。
3.用链接器连接目标代码生成可执行文件,如.exe。
但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。
对于一个大工程,编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。但是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。所以在编程的世界里没有捷径可走,还是要脚踏实地的。
所以流程如下:
rospack
获取包相关信息
rospack find [包名]
获取包名的路径
roscd [包名]
将工作目录切到包名中os
只能切换到包含在ROS_PACKAGE_PATH
环境变量中的包
log包保存了ROS的日志文件
rosls [包名]
对这个包名执行ls命令显示其中包含内容roscp [package_name] [file_to_copy_path] [copy_path]
复制文件从一个package到另一个
roswtf
工具自检错误
新建 catkin workspace
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make 获得文件结构如
workspace结构:workspaceFile包含编译空间 | 开发空间 | 源空间 |
1 编译空间是编译用空间,在buid文件夹内
2 源空间在src文件夹内内部包含一个或多个catkin oackage包,用来存储源代码.
src中的CMakeLists.txt
3 开发空间,在devel文件夹内
存储可执行文件与库文件
devel中的setup.sh中的一系列指令用来初始设置,可使用
$ source devel/setup.bash 进行初始化(如将catkin包加入ROS_PACKAGE_PATH环境变量) ## ROS工作环境脚本
/opt/ros/kinetic/setup.bash
空间目录/deve/setup.bash
程序包组成结构
my_package/
CMakeLists.txt
package.xml 程序包元信息
程序包可放在catkin workspace中,结构如
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt
package.xml 包1清单
...
package_n/
CMakeLists.txt
package.xml 包n清单
catkin_create_pkg [包名] [依赖名1]...[依赖名n]
创建程序包,可设置依赖包
包应当创建在 workspace/src/目录下
将会自动生成CmakeLists.txt与package.xml
常用的依赖包有roscpp std_msgs rospy
<description>The beginner_tutorials package</description> **描述标签**
<maintainer email="user@todo.todo">user</maintainer> **维护者标签**
<license>BSD</license> **许可标签**
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend> **依赖标签**
rospack depends1 [包名]
查看包名的一级依赖关系
依赖关系保存在…/包名/package.xml中
rospack depends [包名]
递归检测所有依赖rosdep install --from-paths /path/to/your/catkin_ws/src --ignore-src
安装依赖前置条件是,系统安装了所需依赖,source环境配置(setup)
$ source /opt/ros/groovy/setup.bash
catkin_make
cmake+make 生成makefile.txt并编译
在工作空间目录下,默认编译…/src中代码.
如该源码不再src中,则应该用catkin_make --source [my_src]
输出编译信息到/build/c_cpp_properties.json catkin_make -DCMAKE_EXPORT_COMPILE_COMMANDS=Yes
使用rosed [package_name] [filename]
编辑包下文件
设置$EDITOR
可修改rosed
的默认编辑器
rosnode list
列出当前活动节点
使用rosnode cleanup
来更新活动列表
rosnode info [节点名]
获取具体节点信息rosnode ping [节点名]
测试节点运行是否正常rosrun [包名] [节点名]
运行节点
使用rosrun [包名] [节点名] __name=[自定义名称]
自定义节点名,并启动
roslaunch [package] [filename.launch]
filename.launch
是一个xml文件结构如下
```xml
* 设置参数(setting parameters)
```xml
<launch>
<param name="somestring1" value="bar" />
<!-- force to string instead of integer -->
<param name="somestring2" value="10" type="str" />
<param name="someinteger1" value="1" type="int" />
<param name="someinteger2" value="2" />
<param name="somefloat1" value="3.14159" type="double" />
<param name="somefloat2" value="3.0" />
<!-- you can set parameters in child namespaces -->
<param name="wg/childparam" value="a child namespace parameter" />
<!-- upload the contents of a file to the server -->
<param name="configfile" textfile="$(find roslaunch)/example.xml" />
<!-- upload the contents of a file as base64 binary to the server -->
<param name="binaryfile" binfile="$(find roslaunch)/example.xml" />
</launch>
*roscore
启动ROS master
rostopic
显示topic主题的信息
rostopic bw [主题名]
显示主题使用的带宽
rostopic echo [主题名]
打印消息到屏幕
rostopic hz [主题名]
显示主题的发布率
rostopic [主题名]
列表打印有关活动主题的信息
rostopic pub [主题名]
将数据发布到主题
rostopic [主题名]
类型的打印主题类型
rostopic list
列出当前所有主题rostopic type [主题名]
显示主题类型也是主题发送消息的类型
类型名不以/开头 比如geometry_msgs/Twist
rosmsg show[主题类型名]
显示该类型的详细信息(数据结构)rostopic pub [主题名] [信息类型] [信息内容1 详细内容2 ....]
发布信息到主题例如:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -1 -- '{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0,y: 0.0,z: 0.0}}'
对应类型结构为
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
##主题录制与回放
rosbag record -a
录制当前发布的所有话题
rostopic list -v 可查看当前发布的所有话题
rosbag info [bagfile]
查看录制文件信息rosbag play [bagfile]
公告后开始回放bagfile内容
-d
设置等待时间
-r
设置发布速率
-O [outfile]
设置输出文件
rosbagrecord [topicname]
设置录制话题
可使用的数据类型如下:
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] 变长数组
fixed-length array[C] 定长数组
Header 特殊的类型含有时间戳和坐标系信息在std_msgs/msg/Header.msg中定义
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<build_depend>std_msgs</build_depend>
<build_depend>actionlib_msgs</build_depend>
2.在CMakeLists.txt中添加对message_generation的构建时依赖
利用find_package函数,在COMPONENTS列表里直接添加 message_generation
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
}
add_message_files(
FILES
Message1.msg
Message2.msg
)
generate_messages()
需要在添加msg\src文件后进行
generate_messages(
DEPENDENCIES
std_msgs
)
重新编译后msg路径下达.msg文件会转会为不同语言的源代码,位置为:
C+++:~/catkin_ws/devel/include/beginner_tutorials/
Python:~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg
lisp: ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/
有请求与相应两部分构成以—分隔,如:
int64 A
int64 B
---
int64 Sum
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
}
对message_generation对msg和srv都起作用
add_service_files(
FILES
Service1.srv
Service2.srv
)
# generate_messages(
# DEPENDENCIES
# # std_msgs # Or other packages containing msgs
# )
rosrun [包名] [节点名]
启动rqt_graph
包的rqt_graph
节点可以显示系统中节点通讯的结构rqt_plot
包的rqt_plot
节点可画出发布数据图rqt_console
包的rqt_console
节点是ROS日志框架的一部分,用来显示node节点输出信息rqt_logger_level
包的rqt_logger_level
可以修改
日志等级说明日志等级由高至低
Fatal 毁灭性的
Error
Warn
Info
Debug
rqt_tf_tree
包中的rqt_tf_tree
节点可以显示由tf广播的不同框架rosservice list
显示活动中的服务列表rosservice type [服务名]
获得服务类型(输入输出数据结构)rosservice call [服务名] [args]
调用服务rossrv show [服务类型名]
显示该服务类型详细信息(数据结构)rosparam
参数相关
rosparam set [参数名] [值] 设置参数
rosparam get [参数名] 获取参数
rosparam get / 显示服务器上所有参数
rosparam load [加载文件] [命名空间] 从文件读取参数
rosparam dump [写入文件.yaml] 向文件中写入参数
rosparam delete 删除参数
rosparam list 列出参数名
less
文件名
用lesss打开文件进行以下操作
\内容1 搜索内容1
:q 退出
locate [路径/文件名]
搜索数据库(/var/lib/locatedb)中的内容
updatedb
更新文件数据库
pwd
当前路径ll
ls -l
权限所有者/同一组/其他组
echo
[变量/字符串]
输出内容cat [文件]
输出文件内容cp [复制文件] [目标文件夹]
复制文件alias 别名="代替名"
设置别名
alias
查看所有别名
unalias 别名
去除别名
mkdir [目录名]
新建目录
lsblk
查看磁盘信息,可以看到已挂载设备
设备都在/dev下
挂载地址为 MOUNTPOINT列内容
umount
设备地址
取消挂载fdisk
设备地址
磁盘分区管理dd
指定大小拷贝文件
source fname.bash
逐条执行fname.bash中保存的命令
一般一批指令写的文件后缀为.bash
export
设置显示环境变量
export PATH=$PATH:<添加的路径>
只在当前终端生效
~/.bashrc
文件中可设置当前用户生效的环境变量
export PATH=<你要加入的路径1>:<你要加入的路径2>: ...... :$PATH你要加入的路径2>你要加入的路径1>
/etc/profile
中可设置所有用户生效的环境变量chmod [权限码] [文件/文件夹路径]
权限设置
-R递归遍历
pgrep
进程名
查看指定进程的信息
ifconfig
网络接口设置,可显示或配置网卡
make
用来编译shall脚本程序 ; 在c/c++开发中对makefile进行编译
PPA personal package archives 个人软件包文档
所有的ppa都在launchpad.net中