Ros常用命令
Linux常用命令
#cd 未指定路径则返回主目录
cd <目录路径>
#pwd 返回当前工作目录的绝对路径
pwd
#mkdir 创建文件夹
mkdir [选项]<目录名称>
mkdir test
# ls 列出目录的内容
ls
# touch 创建文件或者改变文件或者目录时间
touch [选项]<文件名称>
#mv/cp 移动/复制文件,mv也可以用于给文件改名
mv / cp <源文件> <目标文件>
#rmdir/rm 前一个只能删除空文件夹,后一个加上-r可以删除非空文件夹,不加为删除文件
rmdir xxx
rm -r xxx
rm xxx.txt
# df -m :以兆字节为单位查看磁盘使用报告
#du :查看文件占用的空间
# sudo 以管理员身份运行
#diff 比较两个文件的差异,输出不匹配的行
diff file1.ext file2.ext
# chmod 是另一个 Linux 命令,用于更改文件和目录的读取,写入和执行权限
chmod 777 file.ext
#ping 检查与服务器的连接状态
ping google.com
# echo 将文本 “Hello, my name is John”添加到 name.txt的文件中
echo Hello, my name is John >> name.txt
# top 类似于任务管理器
#wget xxx(url)下载链接
# hostname 输出用户名
常用命令
rosrun
rostopic
rosservice
rosnode
rosparam
rosmsg
rossrv
Ros核心概念及常用命令
Nodes, Topics, Messages,Service常用命令
rqt_graph:显示当前节点及topic
rosnode list:列出所有节点(rosout节点每个都有,可以忽略)
rosnode info /turtlesim:列出节点的信息
rostopic list:列出所有Topic
rostopic pub -r 10 cmd_vel geometry_msgs/Twist:发布话题
rostopic echo cmd_vel:打印消息
rostopic hz cmd_vel:显示话题发布速率
rostopic info cmd_vel :列出topic信息
rosmsg show geometry_msgs/Twist:显示消息结构
rosservice call :请求服务
例子
rosnode list
:列出所有节点(rosout节点每个都有,可以忽略)
rosnode info /turtlesim
:列出节点的信息
rostopic
:相关指令如下:
按两次tab键会自动补全
rosservice list
服务端都是海龟仿真器,终端都是客户端去请求服务
请求服务会有返回值
节点与节点管理器
-
节点(Node):执行单元
- 执行某一个具体任务的进程,可以理解为一个可执行文件
- 不同节点可以使用不同的语言,分布式运行在不同的主机
- 每一个节点必须具备一个唯一的名称
-
节点管理器(RosMaster):控制中心
- 为节点提供命名和注册
- 为两个节点之间建立连接(类似于婚姻介绍所)
- 提供参数服务器,运行是的各种参数(全局变量)都储存在其中
Ros的两种通信方式(Topic和Service)
-
话题(Topic): 异步通信机制
- 节点间用来传输数据的总线
-
使用
发布/订阅
模型,从发布者传输到订阅者,可以有多个订阅者
-
消息(Message):话题数据
- 具有一定类型和数据结构,ros提供有标准的数据类型,也可自定义
-
使用与编程语言无关的
.msg
文件定义,编译过程中生成对应的代码文件
-
服务(Service):同步通信机制(ེ类似于TCP通信)
-
使用
客户端/服务器(C/S)
,客户端发送
请求
数据,服务端处理后返回
应答
数据; -
使用编程语言无关的
.srv
文件定义请求和应答数据结构,编译过程中生成对应的代码文件
-
使用
- 话题与服务的区别
话题发布者尽量只有一个,订阅者可以有多个,如果多个发布者可能会造成数据混乱
参数(静态)
-
参数(Parameter):全局共享字典
- 可通过网络访问的共享、多变量字典;
- 节点使用此服务器来存储和检索运行时的参数;
-
适合存储静态、非二进制配置参数,不适合存储动态配置的数据,如
需要ros有设置动态参数储存的功能可以自行了解
Ros文件系统
- 功能包(Package):ROS软件中的基本单元,包含节点源码、配置文件、数据定义等
- 功能包清单(Package manifest):记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等
- 元功能包(Meta Package):组织多个用于同一目的功能包
工作空间(Workspace)
存放工程开发相关文件的文件夹
文件结构
- src:代码空间(Source Space)
- build:编译空间(྆Build Space )存放编译过程中的文件,一般不需要去管
- devel:开发空间(Development Space)编译生成的可执行文件、库都在这里
- install:安装空间(Install Space)类似于devel
ros2已经取消devel,开发时只需要用devel,开发完成用install
创建工作空间
mkdir -p ~/catkin_ws/src && cd catkin_ws/src
catkin_init_workspace # optionally init catkin workspace(一般不用)
wstool init # init .rosinstall file
catkin_make #编译工作空间
#如果想要产生install文件(开发完后给用户)
catkin_make install
source devel/setup.bash #添加到环境变量
把仓库添加到工作空间
roscd; cd ../src
wstool set repo_name \
--git http://github.com/org/repo_name.git \
--version=melodic-devel
wstool up
更新工作空间依赖
sudo rosdep init # only once
resdep update
rosdep install --from-paths src --ignore-src \
--rosdistro=${R0OS_DISTRO} -y
功能包
创建功能包
cd ~/catkin_ws/src
catkin_create_pkg package_name [dependencies ... ]
#catkin_create_pkg test_pkg std_msg roscpp rospy
#编译功能包
cd ~/catkin_ws
catkin_make
souce cd ~/catkin_ws/devel/setup.bash
功能包的文件夹
一定会有
CmakeList.txt
(编译规则)和
paclage.xml
(编译的依赖)两个文件
文件名 | 功能 |
---|---|
include/package_name | C++ header files |
Src |
Socurce files. Python libraries in subdirectories |
scripts | Python nodes and scripts |
msg, srv, action | Message, Service, and Action definitions |
Release Repo Packages
catkin_generate_changelog
# review & commit changelogs
catkin_prepare_release
bloom-release --track kinetic --ros-distro kinetic repo_name
Reminders
- Testable logic
- Publish diagnostics
- Desktop dependencies in a separate package
话题发布
C++实现
/**
* 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
*/
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "velocity_publisher");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
// 设置循环的频率
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
// 初始化geometry_msgs::Twist类型的消息
geometry_msgs::Twist vel_msg;
vel_msg.linear.x = 0.5;
vel_msg.angular.z = 0.2;
// 发布消息
turtle_vel_pub.publish(vel_msg);
ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
修改
CMakeLists.txt
文件
add_executable(velocity_publisher src/velocity_publisher.cpp) #将src/velocity_publisher.cpp文件编译成名为velocity_publisher的可执行文件
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})#将velocity_publisher链接到ros的库
编译:
catkin_make
roscore#终端1
rosrun turtlesim turtlesim_node#终端2
#终端3
source devel/setup.bash
rosrun learning_topic velocity_publisher
可执行文件
velocity_publisher
在
/devel/lib/learning_topic
中
python实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
import rospy
from geometry_msgs.msg import Twist
def velocity_publisher():
# ROS节点初始化
rospy.init_node('velocity_publisher', anonymous=True)
# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
#设置循环的频率
rate = rospy.Rate(10)
while not rospy.is_shutdown():
# 初始化geometry_msgs::Twist类型的消息
vel_msg = Twist()
vel_msg.linear.x = 0.5
vel_msg.angular.z = 0.2
# 发布消息
turtle_vel_pub.publish(vel_msg)
rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]",
vel_msg.linear.x, vel_msg.angular.z)
# 按照循环频率延时
rate.sleep()
if __name__ == '__main__':
try:
velocity_publisher()
except rospy.ROSInterruptException:
pass
python 不需要编译,可以直接用
rosrun
运行
话题订阅
C++实现
#include <ros/ros.h>
#include "turtlesim/Pose.h"
// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
// 将接收到的消息打印出来
ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}
int main(int argc, char **argv)
{
// 初始化ROS节点
ros::init(argc, argv, "pose_subscriber");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
C++需要修改
CmakeLists.txt
文件,和上面的发布者相同。
python实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
import rospy
from turtlesim.msg import Pose
def poseCallback(msg):
rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)
def pose_subscriber():
# ROS节点初始化
rospy.init_node('pose_subscriber', anonymous=True)
# 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
rospy.Subscriber("/turtle1/pose", Pose, poseCallback)
# 循环等待回调函数
rospy.spin()
if __name__ == '__main__':
pose_subscriber()
话题消息的定义与使用
话题定义的几个步骤:
### Messages,Services
These go after find_packagel(), but before catkin_package[].
Example:
- find_package(`catkin REQUIRED COMPONENTS message_generation std_msgs`)
- add_message_files(`FILES MyMessage.msg`)
- add_service_files(`FILES MyService.msg`)
- generate_messages(`DEPENDENCIES std_msgs`)
- catkin_package(`CATKIN_DEPENDS message_runtime std_msgs`)
### Build Libraries, Executables
Goes after the `catkin_package()` call.
add_library(`${PROJECT_NAME} src/main`)
add_executable(`${PROJECT_NAME} node src/main`)
target_link_libraries(`${PROJECT_NAME}_node ${catkin_LIBRARIES}`)
### Package Dependencies
To use headers or libraries in a package, or to use a package's exported CMake macros, express a build-time dependency:
find_package(catkin REQUIRED COMPONENTS roscpp)
Tell dependent packages what headers or libraries to pull in when your package is declared as a catkin component:
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS roscpp)
Note that any packages listed as CATKIN_DEPENDS dependencies must also be declared as a <run_depend> in package.xml.
1)定义
xxx.msg
文件
2)在
package.xml
中添加功能包依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
3)在
CmakeLists.txt
文件添加编译选项
- find_package( … message_generation)
-
add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs) - catkin_package(… message_runtime)
4)用
catkin_make
编译文件
5)编写发布者和订阅者
- C++发布者,需要导入头文件,修改注册topic时的消息类型,其他的地方和调用ros的消息类型一样
/**
* 该例程将发布/person_info话题,自定义消息类型learning_topic::Person
*/
#include <ros/ros.h>
#include "learning_topic/Person.h"
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "person_publisher");
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);
// 设置循环的频率
ros::Rate loop_rate(1);
int count = 0;
while (ros::ok())
{
// 初始化learning_topic::Person类型的消息
learning_topic::Person person_msg;
person_msg.name = "Tom";
person_msg.age = 18;
person_msg.sex = learning_topic::Person::male;
// 发布消息
person_info_pub.publish(person_msg);
ROS_INFO("Publish Person Info: name:%s age:%d sex:%d",
person_msg.name.c_str(), person_msg.age, person_msg.sex);
// 按照循环频率延时
loop_rate.sleep();
}
return 0;
}
订阅者和之前相比完全相同
注意:
需要修改
CmakeLists.txt
文件添加编译选项
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)
add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
python的实现方法和之前的完全一样
launch启动
launch文件:通过XML文件实现多节点的配置和启动(可自动启动Ros Master)
launch文件语法
<launch>:launch文件中的根元素采用<launch>标签定义
<node>
- pkg:节点所在的功能包名称
- type:节点的可执行文件名称
- name:节点运行时的名称,这个可以自己去,会取代掉初始化时的节点名字,同一个可执行文件用不同的名字会产生两个
- output、respawn、reqiured、ns、args
<launch>
#启动节点
<node pkg="package_name" type="executable_name" name="node_name" output="screen" />
</launch>
例子:
<launch>
<node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" />
<node pkg="learning_topic" type="person_publisher" name="listener" output="screen" />
</launch>
Installation
install{TARGETS ${PROJECT_NAME}
DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION})
install{TARGETS ${PROJECT_NAME} node
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
install(PROGRAMS scripts/myscript
DESTINATION ${CATKIN_ PACKAGE_BIN_DESTINATION})
install{(DIRECTORY launch
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
RUNNING SYSTEM
Run ROS using plain:
roscore
Alternatively, roslaunch will run its own roscore automatically if it can’t find one:
roslaunch my_package package_launchfile. launch
Suppress this behaviour with the –wait flag.
Remote Connection
Master’s ROS environment:
-
ROS_IP
or
ROS_HOSTNAME
set to this machine’s network address. -
ROS_MASTER_URI
set to URI containing that IP or hostname.
Your environment:
-
ROS_IP
or
ROS_HOSTNAME
set to your machine’s network address. -
ROS_MASTER_URI
set to the URI from the master.
To debug, check ping from each side to the other, run
roswtf
on each side.
ROS Console
Adjust using
rqt_logger_level
and monitor via
rqt_console
. To enable debug output across sessions, edit the
$HOME/ . ros/config/rosconscle. config
and add a line for your package:
log4dj. logger.ros.package_name=DEBUG
And then add the following to your session:
export ROSCONSOLE_CONFIG_FILE=$HOME/.ros/config/rosconsole.config
Use the
roslaunch --screen flag
to force all node output to the screen, as if
each declared had the ocutput=“screen” attribute.
参考: