Linux常用命令及古月居Ros讲学习记录

  • Post author:
  • Post category:linux




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.

参考:


古月居 Ros入门21讲



版权声明:本文为qq_43309940原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。