方案一:
问题:
ubuntu中vi在编辑状态下方向键不能用,还有回格键不能删除等我们平时习惯的一些键都不能使用。
解决办法:
可以安装vim full版本,在full版本下键盘正常,安装好后同样使用vi命令。
安装vim:
ubuntu预装的是vim tiny版本,而需要的是vim full版本。执行下面的语句安装vim full版本:
$sudo apt-get remove vim-common
$sudo apt-get install vim
这样就行了,vim是一款优秀的软件,可以在运用中体会到。
方案二:
在vi命令行使用命令“:set nocompatible”,就是设置vi不使用兼容模式。
ubuntu11.10下的VI命令: vi 有三种模式,输入模式,编辑模式,“:”命令模式 vi 进入以后默认是编辑模式 vi 编辑模式默认的快捷键 上下左右分别是 J K H L vi 在编辑模式使用 i 可以进入输入模式 vi 输入模式只能输入英文,默认不能使用上下左右箭头 vi 输入模式用Esc可以返回到编辑模式 vi 编辑模式 Shift + ; 可以进入命令模式 vi 命令模式w保存,q退出
1)对所有用户都有效,解决系统中所用用户的vi中文乱码问题
sudo gedit /etc/vim/vimrc.tiny
加入如下内容:
#该文件的内容显示如下:
" Encoding related
set encoding=UTF-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set fileencoding=utf-8
2)只对当前用户有效的解决方法
ubuntu默认在当前用户的家目录下,没有.vimrc文件,这个时候可以自己touch一个.vimrc文件,且在其中加入
#该文件的内容显示如下:
" Encoding related
set encoding=UTF-8
set langmenu=zh_CN.UTF-8
language message zh_CN.UTF-8
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
set fileencoding=utf-8
树莓派SD卡克隆:
https://www.jianshu.com/p/b3ce0d945c7a
ubuntu的apt-get install的默认安装路径
一、apt-get 安装
deb是debian linus的安装格式,跟red hat的rpm非常相似,最基本的安装命令是:dpkg -i file.deb或者直接双击此文件
dpkg 是Debian Package的简写,是为Debian 专门开发的套件管理系统,方便软件的安装、更新及移除。所有源自Debian的Linux发行版都使用dpkg,例如Ubuntu、Knoppix 等。
以下是一些 Dpkg 的普通用法:
1、dpkg -i
安装一个 Debian 软件包,如你手动下载的文件。
2、dpkg -c
列出 的内容。
3、dpkg -I
从 中提取包裹信息。
4、dpkg -r
移除一个已安装的包裹。
5、dpkg -P
完全清除一个已安装的包裹。和 remove 不同的是,remove 只是删掉数据和可执行文件,purge 另外还删除所有的配制文件。
6、dpkg -L
列出 安装的所有文件清单。同时请看 dpkg -c 来检查一个 .deb 文件的内容。
7、dpkg -s
显示已安装包裹的信息。同时请看 apt-cache 显示 Debian 存档中的包裹信息,以及 dpkg -I 来显示从一个 .deb 文件中提取的包裹信息。
8、dpkg-reconfigure
重新配制一个已经安装的包裹,如果它使用的是 debconf (debconf 为包裹安装提供了一个统一的配制界面)。
二、软件安装后相关文件位置
1.下载的软件存放位置
/var/cache/apt/archives
2.安装后软件默认位置
/usr/share
3.可执行文件位置
/usr/bin
4.配置文件位置
/etc
5.lib文件位置
/usr/lib
单行注释、多行注释
单行#,多行开始 :<<! 结束:!
echo输出至文件
echo "">rosserviceinfo
while read line
do
echo "------------------------------------------------------" >> rosserviceinfo
echo $line >> rostopicinfo
rostopic info $line >> rostopicinfo
done < rostopiclist
shell按行读取文件的3种方法
写法一:
复制代码代码如下:
#!/bin/bash
while read line
do
echo $line
done < filename(待读取的文件)
写法二:
复制代码代码如下:
#!/bin/bash
cat filename(待读取的文件) | while read line
do
echo $line
done
写法三:
复制代码代码如下:
for line in `cat filename(待读取的文件)`
do
echo $line
done
ros package 安装 http://blog.sina.com.cn/s/blog_602f87700102wi89.html
ROS 攻略 http://blog.exbot.net/archives/1129
linux将命令输出到系统剪切板
运用管道| xsel -bi, ls | xsel -bi
安装ROS包
sudo apt-get install ros-indigo-rosbridge-server
sudo apt-get install ros-indigo-slam-gmapping
ROS launch文件配置
<launch> //launch文件
<arg name="port" default="9090" /> //声明一个参数,并赋值,可以分配 default 属性或 value 属性
//在命令行中可以roslaunch package-name launch-file-name arg-name:=arg-value 提供arg value
//命令行可以覆盖default的值,但是不能覆盖 value ,会报错。
//获取argument的值:$(arg arg-name)
//$() 这个符号出现的任何地方,roslaunch命令都将会把它替换成给定argument 的值(value)。
//arg的继承:在argument的传递上有一个限制,就是argument不能传递给 include 元素里包含的子launch文件 使用。
解决方法: <include file="path-to-launch-file">
<arg name="arg-name" value="arg-value"/>
. . .
</include>
<arg name="arg-name" value="$(arg arg-name)" />
<node name="rosbridge_udp" pkg="rosbridge_server" type="rosbridge_udp" output="screen">
//任何一个launch文件的重点都是:节点(node)元素的集合。启动的每一个节点(node)都要有自己独一无二的名字(name)。如果node(节点)元素有children,就需要显式标签来定义,children比如是:remap 元素或者 param 元素。
pkg 和 type 它们分别是:程序包名字和可执行文件的名字。 ros::init() 函数 提供的 name 信息将会全面的覆盖命名信息(launch文件中node标签里面的name 属性) ???init覆盖node?
拓展配置:
- output = “screen” 将标准输出信息显示在终端(console)上?
- respawn=”true” 启动完所有请求启动的节点之后,roslaunch 监测每一个节点,让它们保持正常的运行状态。对于每一个节点,当它终止时,我们可以要求 roslaunch 重新启动它.
- required=”true” 当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。 和respawn不能同时设置
- launch-prefix = “command-prefix” 大致相当于:xterm -e rosrun turtlesim turtle_teleop_key. 会开一个新的终端窗口。 用于需要独立输入的node。
- ns = “namespace” 在例子launch文件中,使用这个属性创建了两个无关的 turtlesim 模拟器。 turtlesim 话题名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose )被从全局命名空间移动 到 /sim1 和 /sim2 的单独命名空间里。
- args属性 传递参数到节点. 个人理解,arg参数只在launch文件中合法(相当于局部变量),不直接传给节点,所以需 要通过node中的args属性进行传递.
<param name="authenticate" value="$(arg authenticate)" />
//在launch文件中设置parameter,使用param标签:
group标签中的param标签的作用等同于rosparam set命令.
node标签中的param标签设置为该节点的子元素.
这里的file是.yaml类型.
</node> //关闭显式标签
<rosparam file="../config/costmap_common_params.yaml" command="load" ns="global_costmap" />
// 在launch文件中也支持等同与rosparam load 功能的rosparam标签
用于一次性加载大量的参数<rosparam command="load" file="path-to-param-file" />
<group if="$(arg ssl)">
<group unless="$(arg ssl)">
//group标签定义命名空间
if 或unless 属性
组(groups)可以通过 判别条件 来启用或禁用节点(nodes):
<group if="0-or-1" />
. . .
</group>
如果 if 属性的值是 1 , 标签内封闭的元素(elements)会被包含。如果 if 属性 值是 0 ,则 标签内包含的元素会被忽略。 unless 属性的工作方式类似 if 属性,但是含义颠倒:
其他标签:
remap标签
在launch文件中重新命名:使用 remap 元素:
<remap from="original-name" to="new-name" />
- 1
如果这个 remap 是 launch 元素的一个child(子类),与 node 元素同一层级, 并在 launch 元素内的最顶层。那么这个 remapping 将会作用于后续所有的节点。
include标签
file属性
<include file="path-to-launch-file" />
包含其他文件.这个 file属性期望我们添加想要包含的文件的完整路径。但是大多数时候,include 元素使用一个 find 命令来搜索一个程序包,代替一个明确的完整路径:
<include file="$(find package-name)/launch-file-name" />
这样做是正确的:
<include file = "find learning_tutrols"/launch/start_demo.launch" / >
这样做是错误的:
<include file = "find learning_tutrols"/start_demo.launch" />
ns属性
include 元素也支持 ns 属性,可以让这个文件里的内容r推送到一个命名空间里面:
<include file=". . . " ns="namespace" />
一般我们都会给 include 元素设置一个 ns 属性。
使用 roslaunch 命令 和 使用 rosrun 命令 单独运行每个节点之间的重要区别
默认情况下,roslaunch 命令 从启动节点开始,标准输出信息会重定向到一个日志文件中,而不会像 rosrun 命令那样,将 log 信息显示在终端(console)上.
日志文件所在路径: ∼/.ros/log/run_id/node_name-number-stdout.log
Q: 如何将标准输出信息显示在终端(console)上?
A: 在 node 元素中使用 output 属性:
output=”screen”
带这个属性启动的节点会将标准输出信息显示在终端的窗口中,而不会保存在日志文件中。这也 解释 了为什么这个带有output=”screen”的节点(node) 的日志文件在上面日志文件列表中丢失的原因。
扩展: node 元素的 output 属性只能影响这个节点自己。除了 output 属性,我们可以使用 roslaunch命令行工具的 –screen 命令行选项强制性的在终端的窗口中显示所有节点的输出信息。
$ roslaunch --screen package-name launch-file-name
重映射名字
在启动一个节点的时候,有两种方法创建重映射:
在终端命令行中启动一个节点时,要重新给这个节点命名:给出一个节点原来的名字和新的名字, 中间用:=分开。 original-name:=new-name
例如,在运行turtlesim实例时,我们现在想把发布姿态数据的话题/turtle1/pose名称改 为:/tim,那么命令就 是这样的:$ rosrun turtlesim turtlesim_node turtle1/pose:=tim
在launch文件中重新命名:使用 remap 元素:
<remap from="original-name" to="new-name" />
如果这个 remap 是 launch 元素的一个child(子类),与 node 元素同一层级, 并在launch 元素内的最顶 层。 那么这个 remapping 将会作用于后续所有的节点。
这个 remap 元素也可以作为 node 元素的一个child(子类)出现。下面这个就是使用模板:
<node node-attributes >
<remap from="original-name" to="new-name" />
. . .
</node>
例如:上面命令行命令如果在launch文件中,就是下面这个样子的:
<node pkg="turtlesim" type="turtlesim_node"
name="turtlesim" >
<remap from="turtle1/pose" to="tim" />
</node>
argument和parameter有区别
尽管术语argument和parameter在许多计算机环境中稍微可以互换使用,它们的含义在ROS中有很大的不同。Parameters(参数)在一个运行的ROS系统中是变量(values),它被存储在parameter服务器中,活动(或者叫:运行)的节点通过ros::param::get()函数访问它,并且用户可以通过 rosparam 命令行工具使用它。相比之下,arguments只有在launch文件里合法,它们的值不是直接提供给节点。
以上出自博客:https://blog.csdn.net/qq_33444963/article/details/77893881
ROS RVIZ
install: rosdep update
rosdep install rviz
rosmake rviz
run: rosrun rviz rviz
ssh连接 远程复制文件
SSH下复制文件SCP。
scp是有Security的文件copy,基于ssh登录。操作起来比较方便,比如要把当前一个文件copy到远程另外一台主机上,可以如下命令。
scp /home/daisy/full.tar.gz root@172.19.2.75:/home/root
-r 复制文件夹
liunx 下scp出现 Permission denied, please try again 的解决办法
修改root的ssh权限,即修改 /etc/ssh/sshd_config文件中 PermitRootLogin no / without-password 改为 PermitRootLogin yes
然后重启ssh服务
启动脚本
/etc/rc.local 开机启动调用,不能有错误
/etc/profile 用户登录调用,
~/.bashrc 打开终端调用
PC连接小车树莓派
小车树莓派设置环境变量
source ROS的setup.sh添加环境变量
小车树莓派
export ROS_MASTER_URI=http://小车树莓派ip:11311
export ROS_IP=小车树莓派ip
PC
export ROS_MASTER_URI=http://树莓派ip:11311
export ROS_IP=PCip
Ubuntu设置静态IP,DNS,NetworkManager
1、ifconfig查看网卡名,当前IP,子网掩码
2、vi /etc/network/interfaces
添加或更改内容:
auto 网卡名
iface 网卡名 inet static
address 192.168.1.130
netmask 255.255.255.0
gateway 192.168.1.1
3、vim /etc/resolvconf/resolv.conf.d/base
添加DNS:
nameserver 192.168.1.1 #DNS
search Home #搜索域
4、ubuntu 16.04使用NetworkManager网络管理软件
命令为nmcli。 nmcli dev show查看网络设备信息
在设置为静态IP后,需取消NetworkManager默认的DNS设置:
vim /etc/NetworkManager/NetworkManager.conf
dns=dnsmasq注释或删掉
dnsmasq会启动一个服务,由此服务提供DNS地址,设置静态IP时,由于DHCP服务器不会提供DNS地址,此服务就没有有效的DNS,在手动设置DNS时,需在NetworkManager里取消此设置使手动DNS生效。
dnsmasq启动时,在/etc/resolv.conf里的nameserver = 127.0.1.1本机。
两台电脑ROS网络通信配置,转自http://www.cnblogs.com/liu-fa/p/5773822.html #未验证
这里假设我们有两个电脑:电脑 A 为主机端,电脑 B 为控制端。最终要实现在 A 电脑上运行roscore,并且运行 Turtlesim 程序,然后在 B 电脑上运行键盘控制程序,控制 Turtlesim 小乌龟移动。
1. 查看电脑A和电脑B的 IP 和 Hostname
查看IP,在控制台输入:
$ ifconfig
如果电脑连接的时有线网,则显示结果中,etho 部分的 inet addr 后面就是该电脑的 IP 地址;
如果电脑连接的是无线,则 wlp3s0 部分的 inet addr 后就是 IP 地址。
查看 Hostname,在控制台输入:
$ hostname
2. 修改hosts文件内容
使用如下指令,分别在电脑A和电脑B的打开 hosts 文件:
$ sudo gedit /etc/hosts
在电脑A端的 hosts文件 中添加如下加粗指令:
127.0.0.1 localhost
127.0.1.1 [ hostname_A ]
[IP_A] [ hostname_A ]
[IP_B] [ hostname_B ]
***
同理,在电脑B端的 hosts 文件中,加入如下加粗指令:
127.0.0.1 localhost
127.0.1.1 [ hostname_B ]
[IP_B] [ hostname_B ]
[IP_A] [ hostname_A ]
***
3. 修改 .bashrc 文件
使用如下指令,分别在电脑A和电脑B的打开 .bashrc 文件
$ sudo gedit ~/.bashrc
在电脑A端和电脑B端打开的 .bashrc 文件的最后一行,加入如下代码:
export ROS_MASTER_URI=http://[hostname_A]:11311
[注意] 此处假设电脑A为主机,如果改成电脑B为主机,则只需要将此步中的 [hostname_A] 改成 [hostname_B] 即可。
4. 运行小乌龟程序
电脑A端:
首先启动 ROS:
$ roscore
然后 Ctrl + T 打开新的控制台,运行:
$ rosrun turtlesim turtlesim_node
电脑B端:
$ rosrun turtlesim turtle_teleop_key
现在,你就可以用电脑 B 控制电脑 A 中的小乌龟尽情遨游啦! ~\(≧▽≦)/~啦啦啦