master() { if [ $# -eq 3 ]; then # 手动输入模式:master <name> <subnet> <last_ip> local NAME=$1 local SUBNET=$2 local LAST=$3 local IP="192.168.${SUBNET}.${LAST}" echo"Manual mode: ${NAME} -> ${IP}" elif [ $# -eq 2 ]; then # 自动解析模式:master <subnet> <last_ip> local SUBNET=$1 local LAST=$2 local IP="192.168.${SUBNET}.${LAST}"
# 临时设置 ROS_MASTER_URI 指向目标 IP export ROS_MASTER_URI="http://${IP}:11311" echo"Trying to contact ROS master at ${ROS_MASTER_URI} ..."
# 等待 ROS master 可以访问 if ! rostopic list >/dev/null 2>&1; then echo"Error: cannot reach ROS master at ${IP}" return 1 fi
# 使用 /rosout 提取 hostname local HOST=$(rostopic info /rosout 2>/dev/null | grep -oP 'http://\K[^:/]+' | head -n1)
if [ -z "$HOST" ]; then echo"Warning: cannot detect hostname from /rosout, using IP as hostname" HOST=$IP else # 尝试解析 IP local RESOLVED_IP=$(getent hosts "$HOST" | awk '{print $1}') if [ -n "$RESOLVED_IP" ]; then IP=$RESOLVED_IP fi fi
local NAME=$HOST echo"Detected host: ${NAME} -> ${IP}" else echo"Usage:" echo" master <subnet> <last_ip> # auto detect hostname from ROS topic /rosout" echo" master <name> <subnet> <last_ip> # manual name+IP" return 1 fi
echo"Temporary hosts set: ${NAME} -> ${IP}" echo"ROS_MASTER_URI set to ${ROS_MASTER_URI}" echo"Launching new shell (exit to clear mapping)..." bash }
使用示例
自动解析 hostname
1
master 10 11
输出:
1 2 3 4 5
Trying to contact ROS master at http://192.168.10.11:11311 ... Detected host: robot-008 -> 192.168.10.11 Temporary hosts set: robot-008 -> 192.168.10.11 ROS_MASTER_URI set to http://192.168.10.11:11311 Launching new shell (exit to clear mapping)...
手动指定 name + IP
1
master myrobot 10 11
输出:
1 2 3 4
Manual mode: myrobot -> 192.168.10.11 Temporary hosts set: myrobot -> 192.168.10.11 ROS_MASTER_URI set to http://192.168.10.11:11311 Launching new shell (exit to clear mapping)...