目录的刷新
问题描述,打开在两个终端A和B,一个A负责编译,另外一个B负责执行,发现在A中有a文件重新生成,B中执行./a时提示找不到。
解决:刷新或重载目录
1.在B中尝试通过 cd . 重载目录
cd .
----------------------------------------------
在python中,如果本地仓库与pip已安装仓库同名,优先使用本地仓库中代码时,可以在导入仓库前添加本地路径至最前面,使用如下一段代码即可
import sys
sys.path.insert(0, "/home/gdp/github/humanoid_lhh/exoskeleton_rl")
---------------------------------------------
使用 sudo bash -c '[command]'的形式,提高文件写入成功率
sudo bash -c 'echo 1 > /sys/devices/system/cpu/cpufreq/boost'
而不是直接使用
sudo echo 1 > /sys/devices/system/cpu/cpufreq/boost
解释:尽管 sudo
出现在命令中,但它只影响 echo
命令,而不影响重定向操作,命令可能会失败。当使用 sudo echo 1 > /some/file
时, echo
以root权限运行,而重定向操作(>
)是由当前用户的权限执行的。因此,如果当前用户没有写入 /some/file
的权限。sudo
命令与重管道(如 |
)结合使用时同理。
---------------------------------------------
使用apt install指令时,如果使用-qqy,表示静默安装,指令都是选y(yes),在安装过程中就不会打印输出信息,不建议使用,比如:
sudo apt install -qqy robotpkg-py3*-pinocchio
---------------------------------------------
使用mkfifo命令创建命名管道,用于不同进程间的数据通信
创建一个命名管道
mkfifo mypipe
启动读进程
cat mypipe
关闭管道,开一个新的终端,启动写进程
echo "Hello, this is a test message!" > mypipe
一旦数据被读取,命名管道并不会自动删除。你可以手动删除它
rm mypipe
命名管道可以用于不同进程之间的通信,也可以是通过网络连接的不同机器上的进程。
---------------------------------------------
使用CMake时,查看和调试环境变量的技巧
在linux的shell中,运行export指令,可以查看linux下的所有环境变量的值,然后在cmake中进行验证,看cmake是否能获取的系统的环境变量
新建cmake脚本001.cmake
message(STATUS "PATH=${PATH}")#内容为空
或
message("PATH=${PATH}") # 不带STATUS,打印出来的内容前面就不带“-- ”符号
或
message(STATUS "PATH=$ENV{PATH}")#加ENV之后才能获取到
#CMake自定义环境变量,不会污染系统的环境变量
set(ENV{GIT_PATH} "/usr/bin")
message(STATUS "PATH=$ENV{GIT_PATH}")
#即便是重名也不会产生干扰
set(ENV{PATH} "/usr/bin")
message(STATUS "PATH=$ENV{PATH}")
#也可以将系统环境变量添加进来
set(ENV{GIT_PATH} "/usr/bin:$ENV{PATH}")
message(STATUS "PATH=$ENV{PATH}")
然后使用 cmake -P
运行,shell中
cmake -P 001.cmake
即可以打印出PATH变量的内容。
使用 cmake -P 命令脚本形式执行.cmake文件:
如果你的 .cmake 文件是一个独立的 CMake 脚本(通常称为 CMake 模块脚本),并且你只是想执行它,你可以使用 cmake -P 命令。但请注意,这通常用于执行包含 cmake_policy(), message(), set(), unset(), find_package(), 等命令的简单脚本。
但是,请注意,这种方法不会设置项目、目标或任何与正常 CMake 项目相关的内容。它只是一个简单的脚本执行器。
cmake -P /path/to/yourfile.cmake
- 打印输出cmake所有环境变量用于组织工程并调试
get_cmake_property(_variableNames VARIABLES)
foreach (_variableName ${_variableNames})
message(STATUS "@@@ ${_variableName}=${${_variableName}}")
endforeach()
代码来源CMake官方文档: User Interaction Guide — CMake 3.29.6 Documentation
cmake中打开gdb调试模式
# GDB
# SET(CMAKE_BUILD_TYPE "Debug")
# SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
# SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
# add_compile_options(-g)
一. scp -r命令主机间文件复制
1. 从机器人下载文件到目录
# scp <用户名>@<服务器>:<服务器绝对路径> <本地目录>
scp ilufei@192.168.0.101:/home/ilufei/test.txt .
scp user@10.0.0.34:~/cpp/listener ~/Desktop
2. 上传文件到机器人目录
# scp <本地目录> <用户名>@<服务器>:<服务器绝对路径>
scp ./client user@10.0.0.34:/home/user
3. 从机器人下载目录到本地目录 需要添加 -r 的参数
scp -r <用户名>@<服务器>:<服务器绝对路径> <本地目录>
scp -r ilufei@192.168.0.101:/home/ilufei/ .
4. 上传目录到机器人目录
# scp -r <本地目录> <用户名>@<服务器>:<服务器绝对路径>
scp -r . ilufei@192.168.0.101:/home/ilufei/
----------------------------------------------------------------------------------
局域网内传输文件,使用python的http服务传输文件,觉得scp繁琐,也可以使用该方法
比如,在机器人(ip:192.168.3.18)上新建一个httpfile目录,然后在该目录下运行
python -m http.server 8080
http.server
: 没有安装的话安装一下,这是Python标准库中的一个模块,提供了一个简单的HTTP服务器。Python会在当前目录下启动一个HTTP服务器,并将该目录作为根目录来服务文件。
在另一台电脑主机上(在同一个局域网中),打开浏览器,输入地址http://
192.168.3.18:8080/
即可以访问查看服务器上的文件,或者进行下载。
----------------------------------------------------------------------------------------
二. 找出来这个正在跑的程序并杀掉
假如正在运行了一个./mit_ctrl的进程。
1. 查找pid号
ps -ef | grep mit_ctrl
2. 根据输出的pid号,执行
sudo kill -9 pid
三. 重启sshd服务
systemctl restart sshd
四. ssh工具连接服务器时,需要很长时间,scp命令输入yes后卡住
解决scp命令输入yes后卡住不动的问题_田sir~的博客-CSDN博客_scp卡住不动
使用mobaXterm软件的ssh功能登陆。
关闭服务器ssh反向解析,需要使用root权限用户,修改/etc/ssh/sshd_config文件
vi /etc/ssh/sshd_config
然后在文件中,增加UseDNS no配置,即将dns反向解析功能关闭。如下:
修改完毕后,退出保存。然后重启sshd服务
systemctl restart sshd
解决输入账号密码之后认证很慢问题:
原因:是因为尝试了个没有意义而且会失败的 gssapi-with-mic 认证方式浪费了时 间,打开(远程服务器) /etc/ssh/ssh_config 把里面的GSSAPIAuthentication yes 改成 GSSAPIAuthenticationno 关掉它,即可让 ssh 直接使用publickey 认证方式
① 同样修改配置文件 vim /etc/ssh/sshd_config
将 GSSAPIAuthentication 字段改为GSSAPIAuthentication no
五. 查看CPU个数
cat /proc/cpuinfo | grep vendor_id
六. 解决线程创建失败,增加线程数的上限到4M
ulimit -s 4000000
永久生效
解决方法1:
linux查看修改线程默认栈空间大小 ulimit -s ( ulimit:控制shell程序的资源)
a、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M
b、通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 102400, 即修改为100M
c、可以在/etc/rc.local 内 加入 ulimit -s 102400 则可以开机就设置栈空间大小
d、在/etc/security/limits.conf 中也可以改变栈空间大小:
#<domain> <type> <item> <value>
* soft stack 102400
重新登录,执行ulimit -s 即可看到改为102400 即100M
七. 开机自启动修改rc.local的技巧,因为修改rc.local导致无法进入系统。
写了个程序,需要开机自动启动,然后在rc.local里添加相应代码。后来程序运行起来了,树莓派起不来了,程序也结束不了。
如果你的命令需要长时间运行(例如死循环)或者运行后不能退出,那么你必须确保在命令的最后添加“&”符号让命令运行在其它进程,例如:
python /home/pi/mytest.py &
否则,这个脚本将无法结束,树莓派就无法启动。这个“&”符号允许命令运行在一个指定的进程中,然后继续运行启动进程。
另外,确保文件名使用绝对路径,而不是相对于你的home目录的相对路径。
八. crontab周期性执行任务
crontab -e有时不能打开编辑。可以进入该文件放置在/etc目录下,使用sudo nano /etc/crontab打开编辑。
比如写入以下内容,每天的13:58分时,都会创建一个test.txt文件,并写入一句话。
58 13 * * * root echo "this is a test!" > /home/nvidia/test.txt
九 shell脚本的写法,包含用户密码
模板如下:
#!/bin/bash
ps aux | grep ros | awk '{print $2}' | xargs kill -9;ps aux | grep rviz | awk '{print $2}' | xargs kill -9;roslaunch ur_robot_driver ur5_bringup.launch robot_ip:=192.168.1.100&
sleep 3;roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch&
sleep 2;roslaunch teleoperation camera_calibration_pub.launch&
sleep 2;python ~/lee/ThroatSwap/src/teleoperation/src/tcp_camera_uvual.py&
sleep 2;echo '123qwe' | sudo -S chmod 777 /dev/ttyACM0;roslaunch teleoperation run_touch.launch&
sleep 2;roslaunch teleoperation run_serial_control.launch&
sleep 2;rviz&
十. 报错找不到依赖库,但是确认过库已经放在相应的路径的情况下。
ldd ./walk_example
也是提示not found。
./walk_example: error while loading shared libraries: liblcm.so.1: cannot open shared object file: No such file or directory
链接器ld默认的目录是/lib和/usr/lib,如果放在其他路径也可以,需要让ld知道库文件在哪里。
解决方法1:
在/etc/ld.so.conf.d/目录下新建test.conf为后缀的文件,在该文件中加入库文件所在的目录(/usr/local/lib);
运行ldconfig,以更新/etc/ld.so.cache文件;
方法1:
编辑/etc/ld.so.conf文件,在新的一行中加入库文件所在目录;
运行ldconfig,以更新/etc/ld.so.cache文件;
重新运行程序即可。
十一. 没有显示器,使用ssh远程进行网络配置
1. ssh登陆
ssh user@10.0.0.34 -X
************************
如果ssh无法登陆,或者拒绝,检查远程端是否安装ssh-server并启动,如果没有,主机端只能接显示器,按照如下安装ssh服务器
sudo apt-get install openssh-server
sudo systemctl start ssh
*************************
X是shell与界面的连接协议,添加-X后才可以运行指令打开界面。
sudo unity-control-manager
即可打开系统设置界面,然后进行网络配置。
也可能是下面这个指令
sudo unity-control-center
如果发现无法设置或保存,有可能是网络配置重名了,需要将之前的网络配置删除,执行
sudo nm-connection-editor
十二. 界面卡主,需要进入命令行执行一些操作
按键Ctrl+Alt+F1,会进入1号控制台,再执行reboot即可重启。
1、在alt+ctrl+f1~F6中重启gdm服务:
sudo /etc/init.d/gdm restart
或
sudo /etc/init.d/gdm stop
sudo /etc/init.d/gdm start
上面这个方法测试结果并不管用。
2、进入命令行Console,重新启动Xorg进程
按Alt+Ctrl+F1进入命令行Console(F1~F6均可,Ubuntu下默认有7个Console,其中tty7中跑的是图形桌面进程,其他只有简单的shell),此时需要再次登录。登录后运行以下命令查看进程
ps -t tty7
此时可以发现一个Xorg的进程,记下它的PID。
随后使用 kill -9 PID 将该进程kill掉,随后 Ubuntu 将自动重新启动Xorg,再次回到开机后的登录界面。
十三. 网络测试工具
iperf3能同时测速率、丢包率和时延
网络管理工具可以使用wiredshark
十三. 使用 indicator-cpufreq 设置你的 CPU 频率
高性能模式,退出节能模式
sudo apt install indicator-cpufreq
sudo reboot
十四. 使用sftp上传文件到服务器
1. 登录服务器
sftp zhuhongwu@10.60.170.131
password:
2. 指令操作切换到要放置文件的目录
3.将文件上传到服务器当前目录下
put /home/abc/catkin_ws/src.tar.gz ./
4.将文件从服务器下载到客户端当前目录下
get remotefile ./
Docker 使用技巧
Docker安装
https://zhuanlan.zhihu.com/p/651148141https://zhuanlan.zhihu.com/p/651148141
国内docker hub在搭梯子之后可以访问,找到镜像后,使用带Tags的指令才能下载,直接使用overview指令可能无法下载。例如应该使用如下指令,冒号后是tag
docker pull stanfordnmbl/mocopaper:ploscompbio1
docker加载本地镜像,例如
sudo docker load < docker_images_ros2_x86.tar
5. 脚本中直接写入密码,脚本运行不需要再添加sudo
在modprobe can前面添加密码指令
echo "yahboom" | sudo -S modprobe can
sudo apt-get install sshpass
从机器人端下载数据到本地,使用sshpass
PASSWORD="hello"
PORT=22
sshpass -p "$PASSWORD" scp -o StrictHostKeyChecking=no -P $PORT jetson@192.168.50.217:/home/jetson/Work/exoskeleton_v0/build/ss88.txt ./